使用自定义的http.ResponseWriter根据来自代理请求的响应编写cookie吗?

问题描述 投票:0回答:1

我的原始问题here被标记为this问题的重复项。我没有实现它的运气,并且怀疑我的问题被误解了,所以在我的问题结束之时,我从一个更具体的问题着手。

我正在尝试基于来自反向代理的请求中的中间件内部的响应标头设置cookie。

这是工作流程:

  • 用户请求http://example.com/foo/bar
  • Go应用程序使用ReverseProxy将该请求代理到http://baz.com
  • baz.com设置响应头X-FOO
  • Go app通过使用MYAPPFOO响应标头的值设置X-FOO cookie来修改响应
  • cookie被写入用户的浏览器
  • [有人建议使用自定义http.ResponseWriter,但尝试并搜索更多信息后,尚不清楚如何解决此问题。

由于我无法掌握用例的自定义ResponseWriter的概念,因此我将发布代码,以更精确地演示在遇到困难时我想做的事情:

package main

import (

    "github.com/gorilla/mux"
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func setCookie(w http.ResponseWriter, name string, value string) {
    ...
    http.SetCookie(w, &cookie)
}

func handler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        // setCookie() works here
        // but I cannot access w.Header().Get("X-FOO")

        next.ServeHTTP(w, r)

        // I can access w.Header().Get("X-FOO") here
        // but setCookie() does not cookie the user's browser

        // If I could do it all in one place, this is what I would do:
        if r.Method == "POST" && r.URL.String() == "/login" {
            foo := w.Header().Get("X-FOO")
            setCookie(w, "MYAPPFOO", foo)

        }
    })
}

func main() {

    r := mux.NewRouter()
    r.Use(handler)
    proxy := httputil.NewSingleHostReverseProxy("https://baz.example.com/")
    r.PathPrefix("/").Handler(proxy)
    log.Fatal(http.ListenAndServe(":9001", r))
}

作为旁注,我能够按照上一个问题的注释中的建议使用ReverseProxy.ModifyResponse进行此工作,但我真的很想使用中间件来实现这一点,以使从配置中动态创建代理的代码保持干净。 (不在示例代码中)

我的原始问题在这里被标记为该问题的重复。我没有实现它的运气,并且怀疑我的问题被误解了,所以在我的问题结案之后,我从一个新的...

go
1个回答
0
投票

http.ResponseWriter方法的文档中:((已添加重点)

© www.soinside.com 2019 - 2024. All rights reserved.