diff options
| author | Bruce Wang <brucewangno1@gmail.com> | 2019-11-25 22:37:30 +0800 |
|---|---|---|
| committer | Bruce Wang <brucewangno1@gmail.com> | 2019-11-25 22:37:30 +0800 |
| commit | 922776151e17b16a5617b519e2e1bdde04c98165 (patch) | |
| tree | 287f6521eae1250c23ff2d283251544705233e9d | |
| parent | 2e07aab7eac55a99dc215fdf4d7d8828cf6c19c3 (diff) | |
| download | seaweedfs-922776151e17b16a5617b519e2e1bdde04c98165.tar.xz seaweedfs-922776151e17b16a5617b519e2e1bdde04c98165.zip | |
followed @chrislusf and @iliul 's suggestions. Commits is moved to branch s3-select and proxyToFiler is modified to accommodate S3 Select
| -rw-r--r-- | weed/s3api/s3api_object_handlers.go | 58 |
1 files changed, 14 insertions, 44 deletions
diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 3ec77d511..bc5121c87 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -118,10 +118,15 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h } func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, destUrl string, responseFn func(proxyResonse *http.Response, w http.ResponseWriter)) { + var method string + method = r.Method - glog.V(2).Infof("s3 proxying %s to %s", r.Method, destUrl) + if r.URL.RawQuery == "select&select-type=2" { + method = "GET" + } + glog.V(2).Infof("s3 proxying %s to %s", method, destUrl) - proxyReq, err := http.NewRequest(r.Method, destUrl, r.Body) + proxyReq, err := http.NewRequest(method, destUrl, r.Body) if err != nil { glog.Errorf("NewRequest %s: %v", destUrl, err) @@ -237,13 +242,13 @@ func (s3a *S3ApiServer) SelectObjectContent(w http.ResponseWriter, r *http.Reque if err != nil { if serr, ok := err.(s3select.SelectError); ok { encodedErrorResponse := encodeResponse(cmd.APIErrorResponse{ - Code: serr.ErrorCode(), - Message: serr.ErrorMessage(), + Code: serr.ErrorCode(), + Message: serr.ErrorMessage(), BucketName: bucket, - Key: object, - Resource: r.URL.Path, - RequestID: w.Header().Get(xhttp.AmzRequestID), - HostID: "", + Key: object, + Resource: r.URL.Path, + RequestID: w.Header().Get(xhttp.AmzRequestID), + HostID: "", }) writeResponse(w, serr.HTTPStatusCode(), encodedErrorResponse, "application/xml") } else { @@ -285,40 +290,5 @@ func (s3a *S3ApiServer) SelectObjectContent(w http.ResponseWriter, r *http.Reque s3Select.Evaluate(w) s3Select.Close() } - s3a.proxyToFilerS3Select(w, r, destUrl, passThroughResponseSelectObjectContent) -} - -func (s3a *S3ApiServer) proxyToFilerS3Select(w http.ResponseWriter, r *http.Request, destUrl string, - responseFn func(proxyResonse *http.Response, w http.ResponseWriter)) { - - glog.V(2).Infof("s3 proxying %s to %s", "GET", destUrl) - - proxyReq, err := http.NewRequest("GET", destUrl, nil) - - if err != nil { - glog.Errorf("NewRequest %s: %v", destUrl, err) - writeErrorResponse(w, ErrInternalError, r.URL) - return - } - - proxyReq.Header.Set("Host", s3a.option.Filer) - proxyReq.Header.Set("X-Forwarded-For", r.RemoteAddr) - proxyReq.Header.Set("Etag-MD5", "True") - - for header, values := range r.Header { - for _, value := range values { - proxyReq.Header.Add(header, value) - } - } - - resp, postErr := client.Do(proxyReq) - - if postErr != nil { - glog.Errorf("post to filer: %v", postErr) - writeErrorResponse(w, ErrInternalError, r.URL) - return - } - defer resp.Body.Close() - - responseFn(resp, w) + s3a.proxyToFiler(w, r, destUrl, passThroughResponseSelectObjectContent) } |
