이 시나리오에는 기존 서버 헤더를 재정의하는 데 사용하려는 Go 미들웨어인 Server가 있습니다. 맞춤 값. 그러나 요청 체인 아래의 핸들러가 w.Header().Add("Server", "foo")를 호출하면 응답에 여러 서버 헤더가 생성됩니다.
의도된 동작은 서버를 갖는 것입니다. 미들웨어는 다른 모든 헤더가 작성된 후에만 헤더 값을 추가합니다. 그러나 ServeHTTP의 의미론에 따르면 호출이 완료되기 전에 헤더를 작성해야 합니다.
한 가지 해결 방법은 모든 헤더 쓰기를 가로채고 서버에 삽입하는 사용자 정의 ResponseWriter를 만드는 것입니다. 모든 헤더가 플러시되기 직전의 헤더입니다. 예는 다음과 같습니다.
type serverWriter struct { w http.ResponseWriter name string wroteHeader bool } func (s serverWriter) WriteHeader(code int) { if !s.wroteHeader { s.w.Header().Set("Server", s.name) s.wroteHeader = true } s.w.WriteHeader(code) } func (s serverWriter) Write(b []byte) (int, error) { return s.w.Write(b) } func (s serverWriter) Header() http.Header { return s.w.Header() }
참고: 이 접근 방식에는 추가 간접 계층이 필요합니다.
업데이트된 서버 미들웨어는 이 사용자 정의 ResponseWriter를 활용할 수 있습니다.
// Server attaches a Server header to the response. func Server(h http.Handler, serverName string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sw := serverWriter{ w: w, name: serverName, wroteHeader: false, } h.ServeHTTP(sw, r) }) }
이 솔루션은 시기에 관계없이 적절한 시간에 서버 헤더가 추가되도록 보장합니다. 또는 요청 체인에 헤더가 추가되는 위치입니다.
자세한 내용은 https://kev.inburke.com/kevin/how-to-write-go-middleware/를 참조하세요.
위 내용은 중복된 서버 헤더를 방지하기 위해 Go 미들웨어가 HTTP 헤더를 어떻게 제어할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!