[tor-commits] [flashproxy/master] Add a timeout for reading HTTP requests after connect.

dcf at torproject.org dcf at torproject.org
Sat Apr 20 01:32:21 UTC 2013


commit e201fabb944dd77a21913cbcc26dcb9dd262fcd9
Author: David Fifield <david at bamsoftware.com>
Date:   Fri Apr 19 18:03:21 2013 -0700

    Add a timeout for reading HTTP requests after connect.
    
    This is a try at fixing #8626, "too many open files." Before this, a
    client could just connect to the port and wait forever before sending
    the WebSocket request, using up a descriptor.
    
    Once the WebSocket handshake is completed, you can still keep the socket
    open forever, but that's more like intended behavior.
---
 ChangeLog                               |    2 ++
 websocket-transport/websocket-server.go |   11 +++++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3c24a31..e0c11db 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,8 @@ Changes in version 1.0
   o Fixed badge rendering for a certain combination of Chrome and
     AdBlock Plus. Patch by Arlo Breault. Fixes bug 8300.
 
+  o There is now a 10-second HTTP request timeout in websocket-server.
+
 Changes in version 0.12
   o The new flashproxy-reg-url program prints a URL which, when
     requested, causes an address to be registered with the facilitator.
diff --git a/websocket-transport/websocket-server.go b/websocket-transport/websocket-server.go
index aa4fe57..1abff87 100644
--- a/websocket-transport/websocket-server.go
+++ b/websocket-transport/websocket-server.go
@@ -19,6 +19,8 @@ import (
 	"time"
 )
 
+const requestTimeout = 10 * time.Second
+
 var logFile = os.Stderr
 
 var ptInfo PtServerInfo
@@ -157,6 +159,8 @@ func proxy(local *net.TCPConn, conn *websocketConn) {
 }
 
 func websocketHandler(ws *Websocket) {
+	// Undo timeouts on HTTP request handling.
+	ws.Conn.SetDeadline(time.Time{})
 	conn := NewWebsocketConn(ws)
 
 	handlerChan <- 1
@@ -183,8 +187,11 @@ func startListener(addr *net.TCPAddr) (*net.TCPListener, error) {
 		config.Subprotocols = []string{"base64"}
 		// 16 kilobytes, possibly base64-encoded.
 		config.MaxMessageSize = 16*1024*4/3 + 1
-		http.Handle("/", config.Handler(websocketHandler))
-		err = http.Serve(ln, nil)
+		s := &http.Server{
+			Handler:     config.Handler(websocketHandler),
+			ReadTimeout: requestTimeout,
+		}
+		err = s.Serve(ln)
 		if err != nil {
 			Log("http.Serve: " + err.Error())
 		}



More information about the tor-commits mailing list