aboutsummaryrefslogtreecommitdiff
path: root/weed/server/filer_server_handlers_proxy.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/filer_server_handlers_proxy.go')
-rw-r--r--weed/server/filer_server_handlers_proxy.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/weed/server/filer_server_handlers_proxy.go b/weed/server/filer_server_handlers_proxy.go
new file mode 100644
index 000000000..8d73bc960
--- /dev/null
+++ b/weed/server/filer_server_handlers_proxy.go
@@ -0,0 +1,66 @@
+package weed_server
+
+import (
+ "github.com/chrislusf/seaweedfs/weed/glog"
+ "github.com/chrislusf/seaweedfs/weed/util"
+ "io"
+ "math/rand"
+ "net/http"
+)
+
+var (
+ client *http.Client
+)
+
+func init() {
+ client = &http.Client{Transport: &http.Transport{
+ MaxIdleConnsPerHost: 1024,
+ }}
+}
+
+func (fs *FilerServer) proxyToVolumeServer(w http.ResponseWriter, r *http.Request, fileId string) {
+
+ urlStrings, err := fs.filer.MasterClient.GetLookupFileIdFunction()(fileId)
+ if err != nil {
+ glog.Errorf("locate %s: %v", fileId, err)
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ if len(urlStrings) == 0 {
+ w.WriteHeader(http.StatusNotFound)
+ return
+ }
+
+ proxyReq, err := http.NewRequest(r.Method, urlStrings[rand.Intn(len(urlStrings))], r.Body)
+ if err != nil {
+ glog.Errorf("NewRequest %s: %v", urlStrings[0], err)
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ proxyReq.Header.Set("Host", r.Host)
+ proxyReq.Header.Set("X-Forwarded-For", r.RemoteAddr)
+
+ for header, values := range r.Header {
+ for _, value := range values {
+ proxyReq.Header.Add(header, value)
+ }
+ }
+
+ proxyResponse, postErr := client.Do(proxyReq)
+
+ if postErr != nil {
+ glog.Errorf("post to filer: %v", postErr)
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+ defer util.CloseResponse(proxyResponse)
+
+ for k, v := range proxyResponse.Header {
+ w.Header()[k] = v
+ }
+ w.WriteHeader(proxyResponse.StatusCode)
+ io.Copy(w, proxyResponse.Body)
+
+}