Merge branch 'develop' of gitee.com:fusenpack/fusenapi into develop
This commit is contained in:
		
						commit
						ea2fd732a2
					
				@ -3,7 +3,7 @@ package main
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/fs"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
@ -116,7 +116,6 @@ type Backend struct {
 | 
			
		||||
	HttpAddress string
 | 
			
		||||
	Client      *http.Client
 | 
			
		||||
	Handler     http.HandlerFunc
 | 
			
		||||
 | 
			
		||||
	Dialer      *websocket.Dialer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -163,10 +162,44 @@ func NewBackend(mux *http.ServeMux, httpAddress string, muxPaths ...string) *Bac
 | 
			
		||||
	handleRequest := func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
		if websocket.IsWebSocketUpgrade(r) {
 | 
			
		||||
			// Handle websocket connections
 | 
			
		||||
			handleWebSocketProxy(w, r, backend)
 | 
			
		||||
			//todo: 建立websocket的代理
 | 
			
		||||
 | 
			
		||||
			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,包含了查询参数
 | 
			
		||||
		targetURL, err := url.Parse(httpAddress + r.URL.String())
 | 
			
		||||
@ -244,7 +277,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 +298,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 +328,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 +340,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 +385,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()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user