aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Wang <brucewangno1@gmail.com>2019-11-25 22:37:30 +0800
committerBruce Wang <brucewangno1@gmail.com>2019-11-25 22:37:30 +0800
commit922776151e17b16a5617b519e2e1bdde04c98165 (patch)
tree287f6521eae1250c23ff2d283251544705233e9d
parent2e07aab7eac55a99dc215fdf4d7d8828cf6c19c3 (diff)
downloadseaweedfs-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.go58
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)
}