aboutsummaryrefslogtreecommitdiff
path: root/go
diff options
context:
space:
mode:
authorchrislusf <chris.lu@gmail.com>2015-11-22 09:31:39 -0800
committerchrislusf <chris.lu@gmail.com>2015-11-22 09:31:43 -0800
commit70d050416baa4acc5d3721a10429432c8d107505 (patch)
treedcb61aeab57f682269e86491331718e45cda415e /go
parentdcb8215482cc0a304960192652a694640121afcd (diff)
downloadseaweedfs-70d050416baa4acc5d3721a10429432c8d107505.tar.xz
seaweedfs-70d050416baa4acc5d3721a10429432c8d107505.zip
fix
set HTTP_X_FORWARDED_FOR when proxying https://github.com/chrislusf/seaweedfs/issues/214
Diffstat (limited to 'go')
-rw-r--r--go/security/guard.go17
-rw-r--r--go/weed/weed_server/master_server.go8
2 files changed, 24 insertions, 1 deletions
diff --git a/go/security/guard.go b/go/security/guard.go
index 696b79d69..3c7e3bce3 100644
--- a/go/security/guard.go
+++ b/go/security/guard.go
@@ -6,6 +6,7 @@ import (
"net"
"net/http"
"regexp"
+ "strings"
"github.com/chrislusf/seaweedfs/go/glog"
)
@@ -81,12 +82,26 @@ func (g *Guard) Secure(f func(w http.ResponseWriter, r *http.Request)) func(w ht
}
}
+func GetActualRemoteHost(r *http.Request) (host string, err error) {
+ host = r.Header.Get("HTTP_X_FORWARDED_FOR")
+ if host == "" {
+ host = r.Header.Get("X-FORWARDED-FOR")
+ }
+ if strings.Contains(host, ",") {
+ host = host[0:strings.Index(host, ",")]
+ }
+ if host == "" {
+ host, _, err = net.SplitHostPort(r.RemoteAddr)
+ }
+ return
+}
+
func (g *Guard) checkWhiteList(w http.ResponseWriter, r *http.Request) error {
if len(g.whiteList) == 0 {
return nil
}
- host, _, err := net.SplitHostPort(r.RemoteAddr)
+ host, err := GetActualRemoteHost(r)
if err == nil {
for _, ip := range g.whiteList {
diff --git a/go/weed/weed_server/master_server.go b/go/weed/weed_server/master_server.go
index 3f6b3bc2d..c5d9646c9 100644
--- a/go/weed/weed_server/master_server.go
+++ b/go/weed/weed_server/master_server.go
@@ -113,6 +113,14 @@ func (ms *MasterServer) proxyToLeader(f func(w http.ResponseWriter, r *http.Requ
}
glog.V(4).Infoln("proxying to leader", ms.Topo.RaftServer.Leader())
proxy := httputil.NewSingleHostReverseProxy(targetUrl)
+ director := proxy.Director
+ proxy.Director = func(req *http.Request) {
+ actualHost, err := security.GetActualRemoteHost(req)
+ if err == nil {
+ req.Header.Set(("HTTP_X_FORWARDED_FOR", actualHost)
+ }
+ director(req)
+ }
proxy.Transport = util.Transport
proxy.ServeHTTP(w, r)
} else {