2017-03-07 44 views
2

我试图在将请求代理到远程服务器之前,通过调用REST API来验证用户身份。 然而,我发现,如果我做代理到远程服务器之前的API调用,请求将失败,出现以下错误:具有自定义身份验证的Golang反向代理

http: proxy error: http: ContentLength=139 with Body length 0. 

如果我删除代理到远程服务器之前的API调用,请求能得到通过并返回正确的回应。

我中间件如下:

func AuthMiddleware(next http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
       // the api call to external auth server 
     user_id, err := authenticate(r.FormValue("username"), r.FormValue("password"))  
       if err != nil { 
      http.Error(w, err.Error(), 401) 
      return 
     } 
     next.ServeHTTP(w, r) 
    }) 
} 

我的反向代理是如下:

func NewReverseProxy(target *url.URL) *httputil.ReverseProxy { 
    director := func(req *http.Request) { 
     req.URL.Scheme = target.Scheme 
     req.URL.Host = target.Host 
     req.URL.Path = target.Path 
     targetQuery := target.RawQuery 
     if targetQuery == "" || req.URL.RawQuery == "" { 
      req.URL.RawQuery = targetQuery + req.URL.RawQuery 
     } else { 
      req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery 
     } 
     if _, ok := req.Header["User-Agent"]; !ok { 
      // explicitly disable User-Agent so it's not set to default value 
      req.Header.Set("User-Agent", "") 
     } 
    } 
    return &httputil.ReverseProxy{Director: director} 
} 

,我使用智路由

r.Use(AuthMiddleware) 
r.Post("/", NewReverseProxy(targets).ServeHTTP) 

问题是什么用这个实现?

+0

,想到的第一件事是:你读身体并关闭它? – RickyA

+1

http://stackoverflow.com/questions/31337891/net-http-http-contentlength-222-with-body-length-0 – RickyA

+0

[net/http:http:ContentLength = 222与身体长度0]的可能重复( http://stackoverflow.com/questions/31337891/net-http-http-contentlength-222-with-body-length-0) – stderr

回答

0

如果你不喜欢身体了,那么你可以设置要求为0的CONTENTLENGTH,反映了身体的当前状态:

func AuthMiddleware(next http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     // the api call to external auth server 
     user_id, err := authenticate(r.FormValue("username"), r.FormValue("password")) 
     if err != nil { 
      http.Error(w, err.Error(), 401) 
      return 
     } 
     r.ContentLength = 0 
     next.ServeHTTP(w, r) 
    }) 
} 
+0

这个工作吗? – RickyA