2016-05-03 5 views
3

Ich benutze httputil.ReverseProxy, um Amazon S3-Dateien an meine Clients zu übertragen. Ich möchte alle Header von Amazon ausblenden - ist das möglich ohne Reverse Proxy neu zu implementieren?Golang: Kann ich Antwortheader aus ReverseProxy entfernen?

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 ? 
+0

Leider 'ResponseWriter' ist eine Schnittstelle und stellt nur einen Getter für die 'Header'-Sammlung zur Verfügung, also glaube ich nicht, dass es einen einfachen Weg dafür gibt. Sie könnten die Sammlung iterieren und alle auf "null" setzen, aber das ist ein schlechter Ersatz für etwas wie "w.Headers = nil" ... – evanmcdonnal

Antwort

3

Sie implementieren können 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, 
} 
0

Dies war meine Lösung zu entfernen/ersetzen alle http.ReverseProxy Antwort-Header:

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) 
}