[tor-commits] [meek/master] Factor out code to get the original client IP address.

dcf at torproject.org dcf at torproject.org
Sun Dec 20 20:09:35 UTC 2015


commit 1377d0e6ee7a21b441e718729f8b08180df1ceee
Author: David Fifield <david at bamsoftware.com>
Date:   Sun Dec 13 22:07:06 2015 -0800

    Factor out code to get the original client IP address.
    
    This is working towards #13171. Currently it's just getting
    req.RemoteAddr as before, except that it's now setting the port number
    to ":0" in all cases.
---
 meek-server/meek-server.go |   14 +++++++++++++-
 meek-server/useraddr.go    |   20 ++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/meek-server/meek-server.go b/meek-server/meek-server.go
index 5b28e79..482fa3c 100644
--- a/meek-server/meek-server.go
+++ b/meek-server/meek-server.go
@@ -122,6 +122,18 @@ func (state *State) Get(w http.ResponseWriter, req *http.Request) {
 	w.Write([]byte("I’m just a happy little web server.\n"))
 }
 
+// Get a string representing the original client address, if available, as a
+// "host:port" string suitable to pass as the addr parameter to pt.DialOr. Never
+// fails: if the original client address is not available, returns "". If the
+// original client address is available, the returned port number is always 1.
+func getUseraddr(req *http.Request) string {
+	ip, err := originalClientIP(req)
+	if err != nil {
+		return ""
+	}
+	return net.JoinHostPort(ip.String(), "1")
+}
+
 // Look up a session by id, or create a new one (with its OR port connection) if
 // it doesn't already exist.
 func (state *State) GetSession(sessionID string, req *http.Request) (*Session, error) {
@@ -132,7 +144,7 @@ func (state *State) GetSession(sessionID string, req *http.Request) (*Session, e
 	if session == nil {
 		// log.Printf("unknown session id %q; creating new session", sessionID)
 
-		or, err := pt.DialOr(&ptInfo, req.RemoteAddr, ptMethodName)
+		or, err := pt.DialOr(&ptInfo, getUseraddr(req), ptMethodName)
 		if err != nil {
 			return nil, err
 		}
diff --git a/meek-server/useraddr.go b/meek-server/useraddr.go
new file mode 100644
index 0000000..6695d6d
--- /dev/null
+++ b/meek-server/useraddr.go
@@ -0,0 +1,20 @@
+package main
+
+import (
+	"fmt"
+	"net"
+	"net/http"
+)
+
+// Return the original client IP address as best as it can be determined.
+func originalClientIP(req *http.Request) (net.IP, error) {
+	host, _, err := net.SplitHostPort(req.RemoteAddr)
+	if err != nil {
+		return nil, err
+	}
+	ip := net.ParseIP(host)
+	if ip == nil {
+		return nil, fmt.Errorf("cannot parse %q as IP address")
+	}
+	return ip, nil
+}





More information about the tor-commits mailing list