mirror of
https://github.com/lkmio/gb-cms.git
synced 2025-09-26 19:51:22 +08:00
76 lines
1.8 KiB
Go
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
|
|
}
|