go标准库实现一个web代理

go标准库实现一个web代理

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func serveReverseProxy(
    target string, res http.ResponseWriter, req *http.Request) {
    Newurl, _ := url.Parse(target)
    proxy := httputil.NewSingleHostReverseProxy(Newurl)
    req.URL.Host = Newurl.Host
    req.URL.Scheme = Newurl.Scheme
    req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
    req.Host = Newurl.Host
    proxy.ServeHTTP(res, req)
}

func main() {
    http.HandleFunc("/", doRequest)
    err := http.ListenAndServe(":8000", nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
    fmt.Print("hello world.")

}
func doRequest(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/hello" {
        serveReverseProxy("http://127.0.0.1:8080", w, r)
    } else {
        fmt.Println(r.Method, r.URL)
        w.Write([]byte(r.URL.Path))
    }

}

版权声明:除特别注明外,本站所有文章均为王晨曦个人站点原创

转载请注明:出处来自王晨曦个人站点 » go标准库实现一个web代理

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注