aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api/s3api_object_handlers.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2018-07-21 18:49:47 -0700
committerChris Lu <chris.lu@gmail.com>2018-07-21 18:49:47 -0700
commit8f240276db2ff1a23d54c9731c3de1e0859a20c1 (patch)
tree1520d72eca9d10f11bca3ccb1a1383462680ba30 /weed/s3api/s3api_object_handlers.go
parentbfa87b4f509fe7ed70b09e6ed7d9d0c388afab7b (diff)
downloadseaweedfs-8f240276db2ff1a23d54c9731c3de1e0859a20c1.tar.xz
seaweedfs-8f240276db2ff1a23d54c9731c3de1e0859a20c1.zip
s3 add HEAD DELETE
Diffstat (limited to 'weed/s3api/s3api_object_handlers.go')
-rw-r--r--weed/s3api/s3api_object_handlers.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go
index 132b0e753..41820667c 100644
--- a/weed/s3api/s3api_object_handlers.go
+++ b/weed/s3api/s3api_object_handlers.go
@@ -7,6 +7,7 @@ import (
"github.com/gorilla/mux"
"io/ioutil"
"net/http"
+ "io"
)
var (
@@ -88,3 +89,67 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request)
writeSuccessResponseEmpty(w)
}
+
+func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) {
+
+ destUrl := fmt.Sprintf("http://%s%s%s",
+ s3a.option.Filer, s3a.option.BucketsPath, r.RequestURI)
+
+ s3a.proxyToFiler(w, r, destUrl)
+
+}
+
+func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request) {
+
+ destUrl := fmt.Sprintf("http://%s%s%s",
+ s3a.option.Filer, s3a.option.BucketsPath, r.RequestURI)
+
+ s3a.proxyToFiler(w, r, destUrl)
+
+}
+
+func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Request) {
+
+ destUrl := fmt.Sprintf("http://%s%s%s",
+ s3a.option.Filer, s3a.option.BucketsPath, r.RequestURI)
+
+ s3a.proxyToFiler(w, r, destUrl)
+
+}
+
+func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, destUrl string) {
+
+ glog.V(2).Infof("s3 proxying %s to %s", r.Method, destUrl)
+
+ proxyReq, err := http.NewRequest(r.Method, destUrl, r.Body)
+
+ 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)
+
+ 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()
+
+ for k, v := range resp.Header {
+ w.Header()[k] = v
+ }
+ w.WriteHeader(resp.StatusCode)
+ io.Copy(w, resp.Body)
+}