如何从反向代理获取响应头

时间:2019-11-07 11:44:22

标签: go

如何从反向代理中检测响应标头并对响应标头做出反应?

我正在编写一种中间件方法,该方法已注入到反向代理中。我确认正在调用中间件。

服务器设置值为X-SERVER-VAR的响应头Foo。我需要根据该值检测并运行一些代码。

我以为我应该阅读ResponseWriter,以为服务器响应中应该包含该值,但是什么都没有记录。

func SessionHandler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf(w.Header().Get("X-SERVER-VAR"))
        next.ServeHTTP(w, r)
    })
}

我正在使用github.com/gorilla/mux附加此中间件处理程序。

我正在使用类似于下面的代码(对此问题进行简化)来设置所有内容。

func newProxy(remote string) http.Handler {
    proxyurl, err := url.Parse(remote)
    if err != nil {
        panic(err)
    }
    proxy := httputil.NewSingleHostReverseProxy(proxyurl)
    return proxy
}

func main() {
    r := mux.NewRouter()
    r.Use(SessionHandler)
    proxy := newProxy("https://www.example.com/")
    r.PathPrefix("/").Handler(proxy)
    log.Fatal(http.ListenAndServe(":9001", r))
}

如果中间件无法实现,是否可以通过另一种方式从服务器检测响应标头?

1 个答案:

答案 0 :(得分:2)

您不能期望在设置响应头之前先读取它们。

更改此:

func SessionHandler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        log.Printf(w.Header().Get("X-SERVER-VAR"))
        next.ServeHTTP(w, r)
    })
}

对此:

func SessionHandler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        next.ServeHTTP(w, r)
        log.Printf(w.Header().Get("X-SERVER-VAR"))
    })
}