修复 代理错误

This commit is contained in:
eson 2023-08-10 17:31:45 +08:00
parent 2a2b5af0ca
commit b9aa0e6d10

View File

@ -3,7 +3,7 @@ package main
import (
"fmt"
"io"
"io/fs"
"io/ioutil"
"log"
"net"
"net/http"
@ -15,7 +15,6 @@ import (
"sync"
"time"
"github.com/gorilla/websocket"
"gopkg.in/yaml.v2"
)
@ -116,8 +115,6 @@ type Backend struct {
HttpAddress string
Client *http.Client
Handler http.HandlerFunc
Dialer *websocket.Dialer
}
func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Backend {
@ -145,29 +142,14 @@ func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Bac
},
}
dialer := &websocket.Dialer{
Proxy: http.ProxyFromEnvironment,
NetDial: func(network, addr string) (net.Conn, error) {
return net.Dial(network, addr)
},
}
// 创建后端服务对象,包含地址和客户端
backend := &Backend{
HttpAddress: httpAddress,
Client: client,
Dialer: dialer,
}
// 创建处理请求的函数
handleRequest := func(w http.ResponseWriter, r *http.Request) {
if websocket.IsWebSocketUpgrade(r) {
// Handle websocket connections
handleWebSocketProxy(w, r, backend)
return
}
// 解析目标URL包含了查询参数
targetURL, err := url.Parse(httpAddress + r.URL.String())
if err != nil {
@ -244,7 +226,7 @@ type Result struct {
// GetZeroInfo 遍历指定目录,并解析相关信息
func GetZeroInfo(rootDir string) (results []*Result) {
entries, err := os.ReadDir(rootDir)
entries, err := ioutil.ReadDir(rootDir)
if err != nil {
log.Fatal(err)
}
@ -265,7 +247,7 @@ func GetZeroInfo(rootDir string) (results []*Result) {
}
// findFoldersAndExtractInfo 查找目录并提取信息
func findFoldersAndExtractInfo(rootDir string, entry fs.DirEntry) (*Result, error) {
func findFoldersAndExtractInfo(rootDir string, entry os.FileInfo) (*Result, error) {
var result *Result
folderName := entry.Name()
@ -295,7 +277,7 @@ func findFoldersAndExtractInfo(rootDir string, entry fs.DirEntry) (*Result, erro
configPath := filepath.Join(path, "etc", folderName+".yaml")
routesPath := filepath.Join(path, "internal", "handler", "routes.go")
configContent, err := os.ReadFile(configPath)
configContent, err := ioutil.ReadFile(configPath)
if err != nil {
return err
}
@ -307,7 +289,7 @@ func findFoldersAndExtractInfo(rootDir string, entry fs.DirEntry) (*Result, erro
}
// 读取路由文件
routesContent, err := os.ReadFile(routesPath)
routesContent, err := ioutil.ReadFile(routesPath)
if err != nil {
return err
}
@ -352,41 +334,3 @@ func extractPrefixRouteValues(content string) map[string]bool {
return prefixPath
}
func handleWebSocketProxy(w http.ResponseWriter, r *http.Request, backend *Backend) {
target := url.URL{Scheme: "ws", Host: backend.HttpAddress, Path: r.URL.Path}
proxyConn, _, err := backend.Dialer.DialContext(r.Context(), target.String(), nil)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer proxyConn.Close()
upgrader := websocket.Upgrader{}
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer conn.Close()
go transfer(proxyConn, conn)
go transfer(conn, proxyConn)
}
func transfer(src, dest *websocket.Conn) {
for {
messageType, data, err := src.ReadMessage()
if err != nil {
break
}
err = dest.WriteMessage(messageType, data)
if err != nil {
break
}
}
src.Close()
dest.Close()
}