代理成功

This commit is contained in:
eson 2023-08-10 18:30:02 +08:00
parent 42193df505
commit 4ec7bc6106

View File

@ -164,17 +164,19 @@ func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Bac
if websocket.IsWebSocketUpgrade(r) { if websocket.IsWebSocketUpgrade(r) {
//todo: 建立websocket的代理 //todo: 建立websocket的代理
target := url.URL{Scheme: "ws", Host: backend.HttpAddress, Path: r.URL.Path} target := url.URL{Scheme: "ws", Host: strings.Split(backend.HttpAddress, "//")[1], Path: r.URL.Path}
var transfer = func(src, dest *websocket.Conn) { var transfer = func(src, dest *websocket.Conn) {
for { for {
mType, msg, err := src.ReadMessage() mType, msg, err := src.ReadMessage()
if err != nil { if err != nil {
log.Println(err)
break break
} }
err = dest.WriteMessage(mType, msg) err = dest.WriteMessage(mType, msg)
if err != nil { if err != nil {
log.Println(err)
break break
} }
} }
@ -183,22 +185,33 @@ func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Bac
dest.Close() dest.Close()
} }
proxyConn, _, err := backend.Dialer.Dial(target.String(), nil) header := r.Header.Clone()
// log.Println(target.String())
header.Del("Sec-Websocket-Extensions")
header.Del("Upgrade")
header.Del("Sec-Websocket-Key")
header.Del("Sec-Websocket-Version")
header.Del("Connection")
// header.Del("Origin")
proxyConn, _, err := backend.Dialer.Dial(target.String(), header)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
defer proxyConn.Close() // defer proxyConn.Close()
upgrader := websocket.Upgrader{} upgrader := websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
conn, err := upgrader.Upgrade(w, r, nil) conn, err := upgrader.Upgrade(w, r, nil)
if err != nil { if err != nil {
return return
} }
defer conn.Close() // defer conn.Close()
go transfer(proxyConn, conn) go transfer(proxyConn, conn)
go transfer(conn, proxyConn) // go transfer(conn, proxyConn)
return
} }
// 解析目标URL包含了查询参数 // 解析目标URL包含了查询参数