aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-09-24 18:09:52 -0700
committerChris Lu <chris.lu@gmail.com>2020-09-24 18:09:52 -0700
commitdbf5327b9874bf7137eb53cbe04cd362efeb864c (patch)
tree0812cf8bc8bb12b2c77d328fe5b1fce93c15254d
parent7726965a472fdb46b40f93f396bbb6c878b7fcd7 (diff)
downloadseaweedfs-dbf5327b9874bf7137eb53cbe04cd362efeb864c.tar.xz
seaweedfs-dbf5327b9874bf7137eb53cbe04cd362efeb864c.zip
s3: handle response-content-encoding
fix https://github.com/chrislusf/seaweedfs/issues/1487
-rw-r--r--weed/s3api/s3api_object_handlers.go23
1 files changed, 23 insertions, 0 deletions
diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go
index bb03048c8..ea3cb47dd 100644
--- a/weed/s3api/s3api_object_handlers.go
+++ b/weed/s3api/s3api_object_handlers.go
@@ -210,6 +210,15 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h
}
+var passThroughHeaders = []string{
+ "response-cache-control",
+ "response-content-disposition",
+ "response-content-encoding",
+ "response-content-language",
+ "response-content-type",
+ "response-expires",
+}
+
func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, destUrl string, responseFn func(proxyResponse *http.Response, w http.ResponseWriter)) {
glog.V(2).Infof("s3 proxying %s to %s", r.Method, destUrl)
@@ -226,6 +235,19 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des
proxyReq.Header.Set("X-Forwarded-For", r.RemoteAddr)
for header, values := range r.Header {
+ // handle s3 related headers
+ passed := false
+ for _, h := range passThroughHeaders {
+ if strings.ToLower(header) == h && len(values) > 0 {
+ proxyReq.Header.Add(header[len("response-"):], values[0])
+ passed = true
+ break
+ }
+ }
+ if passed {
+ continue
+ }
+ // handle other headers
for _, value := range values {
proxyReq.Header.Add(header, value)
}
@@ -248,6 +270,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des
responseFn(resp, w)
}
+
func passThroughResponse(proxyResponse *http.Response, w http.ResponseWriter) {
for k, v := range proxyResponse.Header {
w.Header()[k] = v