Browse Source

send back 404's when the requested tunnel does not exist. fix a bug in how we advertise the proxy connect port in regackmsg

Alan Shreve 12 years ago
parent
commit
45adca7a2b
3 changed files with 32 additions and 27 deletions
  1. 13 4
      src/ngrok/conn/conn.go
  2. 12 12
      src/ngrok/server/http.go
  3. 7 11
      src/ngrok/server/main.go

+ 13 - 4
src/ngrok/conn/conn.go

@@ -24,20 +24,29 @@ type tcpConn struct {
 	typ string
 }
 
+type Listener struct {
+        *net.TCPAddr
+        Conns chan Conn
+}
+
 func wrapTcpConn(conn net.Conn, typ string) *tcpConn {
 	c := &tcpConn{conn, log.NewPrefixLogger(), rand.Int31(), typ}
 	c.AddLogPrefix(c.Id())
 	return c
 }
 
-func Listen(addr *net.TCPAddr, typ string) (conns chan Conn, err error) {
+func Listen(addr *net.TCPAddr, typ string) (l *Listener, err error) {
 	// listen for incoming connections
 	listener, err := net.ListenTCP("tcp", addr)
 	if err != nil {
 		return
 	}
 
-	conns = make(chan Conn)
+	l = &Listener{
+            TCPAddr: listener.Addr().(*net.TCPAddr),
+            Conns: make(chan Conn),
+        }
+
 	go func() {
 		for {
 			tcpConn, err := listener.AcceptTCP()
@@ -47,10 +56,10 @@ func Listen(addr *net.TCPAddr, typ string) (conns chan Conn, err error) {
 
 			c := wrapTcpConn(tcpConn, typ)
 			c.Info("New connection from %v", tcpConn.RemoteAddr())
-			conns <- c
+			l.Conns <- c
 		}
 	}()
-	return
+        return
 }
 
 func Wrap(conn net.Conn, typ string) *tcpConn {

+ 12 - 12
src/ngrok/server/http.go

@@ -3,6 +3,7 @@ package server
 import (
 	log "code.google.com/p/log4go"
 	"net"
+        "fmt"
 	"ngrok/conn"
 )
 
@@ -12,6 +13,12 @@ WWW-Authenticate: Basic realm="ngrok"
 Content-Length: 23
 
 Authorization required
+`
+
+        NotFound = `HTTP/1.0 404 Not Found
+Content-Length: %d
+
+Tunnel %s not found
 `
 )
 
@@ -20,22 +27,14 @@ Authorization required
  */
 func httpListener(addr *net.TCPAddr) {
 	// bind/listen for incoming connections
-	listener, err := net.ListenTCP("tcp", addr)
+        listener, err := conn.Listen(addr, "pub")
 	if err != nil {
 		panic(err)
 	}
 
-	log.Info("Listening for public http connections on %v", getTCPPort(listener.Addr()))
-	for {
-		// accept new public connections
-		tcpConn, err := listener.AcceptTCP()
-
-		if err != nil {
-			panic(err)
-		}
-
-		// handle the new connection asynchronously
-		go httpHandler(tcpConn)
+	log.Info("Listening for public http connections on %v", listener.Port)
+	for conn := range listener.Conns {
+		go httpHandler(conn)
 	}
 }
 
@@ -65,6 +64,7 @@ func httpHandler(tcpConn net.Conn) {
 	tunnel := tunnels.Get("http://" + req.Host)
 	if tunnel == nil {
 		conn.Info("No tunnel found for hostname %s", req.Host)
+                conn.Write([]byte(fmt.Sprintf(NotFound, len(req.Host) + 18, req.Host)))
 		return
 	}
 

+ 7 - 11
src/ngrok/server/main.go

@@ -46,22 +46,18 @@ func parseArgs() *Options {
 	}
 }
 
-func getTCPPort(addr net.Addr) int {
-	return addr.(*net.TCPAddr).Port
-}
-
 /**
  * Listens for new control connections from tunnel clients
  */
 func controlListener(addr *net.TCPAddr, domain string) {
 	// listen for incoming connections
-	conns, err := conn.Listen(addr, "ctl")
+	listener, err := conn.Listen(addr, "ctl")
 	if err != nil {
 		panic(err)
 	}
 
-	log.Info("Listening for control connections on %d", getTCPPort(addr))
-	for c := range conns {
+	log.Info("Listening for control connections on %d", listener.Port)
+	for c := range listener.Conns {
 		NewControl(c)
 	}
 }
@@ -70,15 +66,15 @@ func controlListener(addr *net.TCPAddr, domain string) {
  * Listens for new proxy connections from tunnel clients
  */
 func proxyListener(addr *net.TCPAddr, domain string) {
-	conns, err := conn.Listen(addr, "pxy")
+	listener, err := conn.Listen(addr, "pxy")
 	if err != nil {
 		panic(err)
 	}
 
 	// set global proxy addr variable
-	proxyAddr = fmt.Sprintf("%s:%d", domain, getTCPPort(addr))
-	log.Info("Listening for proxy connection on %d", getTCPPort(addr))
-	for conn := range conns {
+	proxyAddr = fmt.Sprintf("%s:%d", domain, listener.Port)
+	log.Info("Listening for proxy connection on %d", listener.Port)
+	for conn := range listener.Conns {
 		go func() {
 			// fail gracefully if the proxy connection dies
 			defer func() {