1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| package main
import ( "log" "net/http" "net/http/httputil" "net/url" "strings" )
type RProxy struct { remote *url.URL }
func GoReverseProxy(this *RProxy) *httputil.ReverseProxy { remote := this.remote
proxy := httputil.NewSingleHostReverseProxy(remote)
proxy.Director = func(request *http.Request) { targetQuery := remote.RawQuery request.URL.Scheme = remote.Scheme request.URL.Host = remote.Host request.Host = remote.Host request.URL.Path, request.URL.RawPath = joinURLPath(remote, request.URL)
if targetQuery == "" request.URL.RawQuery == "" { request.URL.RawQuery = targetQuery + request.URL.RawQuery } else { request.URL.RawQuery = targetQuery + "&" + request.URL.RawQuery } if _, ok := request.Header["User-Agent"]; !ok {
request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36") } log.Println("request.URL.Path:", request.URL.Path, "request.URL.RawQuery:", request.URL.RawQuery) }
proxy.ModifyResponse = func(response *http.Response) error { response.Header.Add("Access-Control-Allow-Origin", "*") response.Header.Add("Reverse-Proxy-Server-PowerBy", "(Hzz)https://hzz.cool") return nil }
return proxy }
func joinURLPath(a, b *url.URL) (path, rawpath string) { if a.RawPath == "" && b.RawPath == "" { return singleJoiningSlash(a.Path, b.Path), "" }
apath := a.EscapedPath() bpath := b.EscapedPath()
aslash := strings.HasSuffix(apath, "/") bslash := strings.HasPrefix(bpath, "/")
switch { case aslash && bslash: return a.Path + b.Path[1:], apath + bpath[1:] case !aslash && !bslash: return a.Path + "/" + b.Path, apath + "/" + bpath } return a.Path + b.Path, apath + bpath }
func singleJoiningSlash(a, b string) string { aslash := strings.HasSuffix(a, "/") bslash := strings.HasPrefix(b, "/") switch { case aslash && bslash: return a + b[1:] case !aslash && !bslash: return a + "/" + b } return a + b }
func main() { port := "1874" reverseUrl := "https://api.openai.com"
remote, err := url.Parse(reverseUrl) if err != nil { panic(err) }
proxy := GoReverseProxy(&RProxy{ remote: remote, })
log.Println("当前代理地址: " + reverseUrl + " 本地监听: http://127.0.0.1:" + port)
serveErr := http.ListenAndServe(":"+port, proxy)
if serveErr != nil { panic(serveErr) } }
|