>백엔드 개발 >Golang >중복된 서버 헤더를 방지하기 위해 Go 미들웨어가 HTTP 헤더를 어떻게 제어할 수 있습니까?

중복된 서버 헤더를 방지하기 위해 Go 미들웨어가 HTTP 헤더를 어떻게 제어할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-21 03:28:14528검색

How Can Go Middleware Control HTTP Headers to Prevent Duplicate Server Headers?

외부 Go 미들웨어에서 HTTP 헤더 제어

이 시나리오에는 기존 서버 헤더를 재정의하는 데 사용하려는 Go 미들웨어인 Server가 있습니다. 맞춤 값. 그러나 요청 체인 아래의 핸들러가 w.Header().Add("Server", "foo")를 호출하면 응답에 여러 서버 헤더가 생성됩니다.

의도된 동작은 서버를 갖는 것입니다. 미들웨어는 다른 모든 헤더가 작성된 후에만 헤더 값을 추가합니다. 그러나 ServeHTTP의 의미론에 따르면 호출이 완료되기 전에 헤더를 작성해야 합니다.

사용자 정의 ResponseWriter 사용

한 가지 해결 방법은 모든 헤더 쓰기를 가로채고 서버에 삽입하는 사용자 정의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.