Merge branch 'develop' of gitee.com:fusenpack/fusenapi into develop
This commit is contained in:
commit
ea2fd732a2
@ -3,7 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -116,8 +116,7 @@ type Backend struct {
|
|||||||
HttpAddress string
|
HttpAddress string
|
||||||
Client *http.Client
|
Client *http.Client
|
||||||
Handler http.HandlerFunc
|
Handler http.HandlerFunc
|
||||||
|
Dialer *websocket.Dialer
|
||||||
Dialer *websocket.Dialer
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Backend {
|
func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Backend {
|
||||||
@ -163,9 +162,43 @@ func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Bac
|
|||||||
handleRequest := func(w http.ResponseWriter, r *http.Request) {
|
handleRequest := func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
if websocket.IsWebSocketUpgrade(r) {
|
if websocket.IsWebSocketUpgrade(r) {
|
||||||
// Handle websocket connections
|
//todo: 建立websocket的代理
|
||||||
handleWebSocketProxy(w, r, backend)
|
|
||||||
return
|
target := url.URL{Scheme: "ws", Host: backend.HttpAddress, Path: r.URL.Path}
|
||||||
|
|
||||||
|
var transfer = func(src, dest *websocket.Conn) {
|
||||||
|
for {
|
||||||
|
mType, msg, err := src.ReadMessage()
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dest.WriteMessage(mType, msg)
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
src.Close()
|
||||||
|
dest.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
proxyConn, _, err := backend.Dialer.Dial(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)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解析目标URL,包含了查询参数
|
// 解析目标URL,包含了查询参数
|
||||||
@ -244,7 +277,7 @@ type Result struct {
|
|||||||
|
|
||||||
// GetZeroInfo 遍历指定目录,并解析相关信息
|
// GetZeroInfo 遍历指定目录,并解析相关信息
|
||||||
func GetZeroInfo(rootDir string) (results []*Result) {
|
func GetZeroInfo(rootDir string) (results []*Result) {
|
||||||
entries, err := os.ReadDir(rootDir)
|
entries, err := ioutil.ReadDir(rootDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -265,7 +298,7 @@ func GetZeroInfo(rootDir string) (results []*Result) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// findFoldersAndExtractInfo 查找目录并提取信息
|
// findFoldersAndExtractInfo 查找目录并提取信息
|
||||||
func findFoldersAndExtractInfo(rootDir string, entry fs.DirEntry) (*Result, error) {
|
func findFoldersAndExtractInfo(rootDir string, entry os.FileInfo) (*Result, error) {
|
||||||
var result *Result
|
var result *Result
|
||||||
|
|
||||||
folderName := entry.Name()
|
folderName := entry.Name()
|
||||||
@ -295,7 +328,7 @@ func findFoldersAndExtractInfo(rootDir string, entry fs.DirEntry) (*Result, erro
|
|||||||
configPath := filepath.Join(path, "etc", folderName+".yaml")
|
configPath := filepath.Join(path, "etc", folderName+".yaml")
|
||||||
routesPath := filepath.Join(path, "internal", "handler", "routes.go")
|
routesPath := filepath.Join(path, "internal", "handler", "routes.go")
|
||||||
|
|
||||||
configContent, err := os.ReadFile(configPath)
|
configContent, err := ioutil.ReadFile(configPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -307,7 +340,7 @@ func findFoldersAndExtractInfo(rootDir string, entry fs.DirEntry) (*Result, erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 读取路由文件
|
// 读取路由文件
|
||||||
routesContent, err := os.ReadFile(routesPath)
|
routesContent, err := ioutil.ReadFile(routesPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -352,41 +385,3 @@ func extractPrefixRouteValues(content string) map[string]bool {
|
|||||||
|
|
||||||
return prefixPath
|
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()
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user