Files
gb-cms/common/http_proxy.go
2025-09-24 18:22:02 +08:00

76 lines
1.8 KiB
Go

package common
import (
"bytes"
"fmt"
"github.com/pretty66/websocketproxy"
"io"
"net/http"
"net/http/httputil"
"net/url"
"strings"
)
func HttpForwardTo(path string, w http.ResponseWriter, r *http.Request) {
target, _ := url.Parse(fmt.Sprintf("%s%s", Config.MediaServer, path))
proxy := &httputil.ReverseProxy{
Director: func(req *http.Request) {
req.URL = target
req.Host = target.Host
req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
// 复制所有原始请求头
for name, values := range r.Header {
for _, value := range values {
req.Header.Add(name, value)
}
}
// 保留原始查询参数
req.URL.RawQuery = r.URL.RawQuery
// 复制请求体(如果有)
if r.Body != nil {
bodyBytes, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "Error reading request body", http.StatusInternalServerError)
return
}
r.Body.Close()
req.Body = io.NopCloser(bytes.NewReader(bodyBytes))
req.ContentLength = int64(len(bodyBytes))
req.GetBody = func() (io.ReadCloser, error) {
return io.NopCloser(bytes.NewReader(bodyBytes)), nil
}
}
// 复制其他请求属性
req.Method = r.Method
req.Proto = r.Proto
req.ProtoMajor = r.ProtoMajor
req.ProtoMinor = r.ProtoMinor
},
}
proxy.ServeHTTP(w, r)
}
func WSForwardTo(path string, w http.ResponseWriter, r *http.Request) error {
hostport := Config.MediaServer
if strings.HasPrefix(Config.MediaServer, "https") {
hostport = "wss" + Config.MediaServer[5:]
} else if strings.HasPrefix(Config.MediaServer, "http") {
hostport = "ws" + Config.MediaServer[4:]
}
wp, err := websocketproxy.NewProxy(fmt.Sprintf("%s%s", hostport, path), func(r *http.Request) error {
return nil
})
if err == nil {
wp.Proxy(w, r)
}
return err
}