godoos/progress/forward.go
2024-07-22 17:44:55 +08:00

97 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package progress
import (
"fmt"
"log"
"net/http"
"net/url"
"path"
"time"
"github.com/gorilla/mux"
)
func ForwardRequest(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
proxyName := vars["name"] // 获取代理名称
log.Printf("Forwarding request to proxy %s", proxyName)
log.Printf("processes: %+v", processes)
cmd, ok := processes[proxyName]
if !ok || !cmd.Running {
// Start the process again
err := ExecuteScript(proxyName)
if err != nil {
respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to restart process %s: %v", proxyName, err))
return
}
time.Sleep(1 * time.Second)
}
if cmd.PingURL == "" {
respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to get url %s", proxyName))
return
}
// 构造目标基础URL假设proxyName直接对应目标服务的基础路径
targetBaseURLStr := cmd.PingURL
targetBaseURL, err := url.Parse(targetBaseURLStr)
if err != nil {
respondWithError(w, http.StatusInternalServerError, "Failed to parse target base URL")
return
}
// 获取请求的子路径
subpath := r.URL.Path[len("/"+proxyName):]
targetURL := &url.URL{
Scheme: targetBaseURL.Scheme,
Host: targetBaseURL.Host,
Path: path.Clean(path.Join(targetBaseURL.Path, subpath)), // 使用path.Clean处理路径
RawQuery: r.URL.RawQuery, // 正确编码查询参数
}
log.Printf("Forwarding request to %s", targetURL)
// 执行重定向
http.Redirect(w, r, targetURL.String(), http.StatusTemporaryRedirect)
/*
// 保留原请求的路径和查询字符串构建完整的目标URL
// 如果没有子路径直接使用基础URL
// 如果有子路径将其附加到基础URL
client := http.DefaultClient
req, err := http.NewRequest(r.Method, targetURL.String(), r.Body)
if err != nil {
respondWithError(w, http.StatusBadRequest, "Failed to create request: "+err.Error())
return
}
copyHeader(req.Header, r.Header)
resp, err := client.Do(req)
if err != nil {
respondWithError(w, http.StatusServiceUnavailable, "Failed to forward request: "+err.Error())
return
}
defer resp.Body.Close()
// 将响应头复制到w.Header()
for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}
w.WriteHeader(resp.StatusCode)
if _, err := io.Copy(w, resp.Body); err != nil {
log.Printf("Error copying response body: %v", err)
}*/
}
// 复制源Header到目标Header
// func copyHeader(dst, src http.Header) {
// for k, vv := range src {
// for _, v := range vv {
// dst.Add(k, v)
// }
// }
// }