golang http(s)請求轉發
摘要:func main(){
router := gin.Default()//建立一個router
router.Use(MiddleWare())//中介軟體,起攔截器的作用
router.Any("/*action", Forward)//所有請求都會經過F...
func main(){ router := gin.Default()//建立一個router router.Use(MiddleWare())//中介軟體,起攔截器的作用 router.Any("/*action", Forward)//所有請求都會經過Forward函式轉發 router.Run(":8000") } func Forward(c *gin.Context) { targetHost := &httputils.TargetHost{ Host:"www.baidu.com", IsHttps: false, } HostReverseProxy(c.Writer, c.Request, targetHost) } func HostReverseProxy(w http.ResponseWriter, req *http.Request, targetHost *TargetHost) { host := "" if targetHost.IsHttps { host = host + "https://" } else { host = host + "http://" } remote, err := url.Parse(host + targetHost.Host) if err != nil { log.Errorf("err:%s", err) w.WriteHeader(http.StatusInternalServerError) return } proxy := httputil.NewSingleHostReverseProxy(remote) if targetHost.IsHttps { tls, err := GetVerTLSConfig(targetHost.CAPath) if err != nil { log.Errorf("https crt error: %s", err) w.WriteHeader(http.StatusInternalServerError) return } var pTransport http.RoundTripper = &http.Transport{ Dial: func(netw, addr string) (net.Conn, error) { c, err := net.DialTimeout(netw, addr, time.Second*time.Duration(DialTimeout)) if err != nil { return nil, err } return c, nil }, ResponseHeaderTimeout: time.Second * time.Duration(ResponseHeaderTimeout), TLSClientConfig:tls, } proxy.Transport = pTransport } proxy.ServeHTTP(w, req) } type TargetHost struct { Hoststring IsHttps bool CAPathstring } func MiddleWare() gin.HandlerFunc { return func(c *gin.Context) { account := c.Request.Header.Get("ename")//從請求頭中獲取ename欄位 if account == "" { c.JSON(http.StatusOK, httputils.Response{ Code:400002, Message: "使用者未登入", }) c.Abort() return } fmt.Println("before middleware") c.Set("request", "clinet_request") c.Next() fmt.Println("before middleware") } }