Мой оригинальный вопрос здесь помечен как дубликат этого вопроса. Мне не повезло реализовать его, и я подозреваю, что моя проблема неправильно понята, поэтому с закрытым вопросом я начинаю заново с более конкретного вопроса.
Я пытаюсь установить cookie на основе заголовка ответа отв промежуточном программном обеспечении в запросе с обратным прокси*http://baz.com
baz.com устанавливает заголовок ответа
X-FOO
Приложение Go изменяет ответ, устанавливая cookie
MYAPPFOO
со значением заголовка ответа
X-FOO
Файл 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
, как рекомендовано в комментариях к моему последнему вопросу, но я бы очень хотел добиться этого с помощью промежуточного программного обеспечения, чтобы сохранить код, который динамически создает прокси из конфигурации, чистым. (не в примере кода)