Vojtech Vitek - golang.cz
Vojtech Vitek - golang.cz

Reputation: 27754

Golang: Can I remove response headers coming from ReverseProxy?

I'm using httputil.ReverseProxy to proxy Amazon s3 files to my clients. I'd like to hide all headers coming from Amazon - is that possible without having to reimplement Reverse Proxy?

proxy := httputil.ReverseProxy{Director: func(r *http.Request) {
    r.Header = http.Header{} // Don't send client's request headers to Amazon.
    r.URL = proxyURL
    r.Host = proxyURL.Host
}}
proxy.ServeHTTP(w, r) // How do I remove w.Headers ?

Upvotes: 4

Views: 7621

Answers (2)

Vojtech Vitek - golang.cz
Vojtech Vitek - golang.cz

Reputation: 27754

This was my solution to remove/replace all the http.ReverseProxy response headers:

type responseHeadersTransport http.Header

func (t responseHeadersTransport) RoundTrip(r *http.Request) (*http.Response, error) {
    resp, err := http.DefaultTransport.RoundTrip(r)
    if err != nil {
        return nil, err
    }
    resp.Header = http.Header(t)
    return resp, nil
}


func ProxyFile(w http.ResponseWriter, r *http.Request) {
    // ...

    headers := http.Header{}
    headers.Set("Content-Type", file.ContentType)
    headers.Set("Content-Length", fmt.Sprintf("%d", file.Filesize))
    headers.Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s\"", file.Filename))

    proxy := httputil.ReverseProxy{
        Director: func(r *http.Request) { // Remove request headers.
            r.Header = http.Header{}
            r.URL = proxyURL
            r.Host = proxyURL.Host
        },
        Transport: responseHeadersTransport(headers), // Replace response headers.
    }
    proxy.ServeHTTP(w, r)
}

Upvotes: 3

Uvelichitel
Uvelichitel

Reputation: 8490

You can implement ReverseProxy.Transport

type MyTransport struct{
    header http.Header
}
func (t MyTransport) RoundTrip(r *Request) (*Response, error){
    resp, err := http.DefaultTransport.RoundTrip(r)
    resp.Header = t.header
    return resp, err
}
mytransport := MyTransport{
//construct Header
}
proxy := httputil.ReverseProxy{Director: func(r *http.Request) {
    r.Header = http.Header{} // Don't send client's request headers to Amazon.
    r.URL = proxyURL
    r.Host = proxyURL.Host
  },
  Transport: mytransport,
}

Upvotes: 5

Related Questions