summary refs log tree commit diff
diff options
context:
space:
mode:
authorTed Unangst <tedu@tedunangst.com>2019-03-07 00:54:44 -0500
committerTed Unangst <tedu@tedunangst.com>2019-03-07 00:54:44 -0500
commitb73247ee3afb33eca48e8573315bce72ddadb6ba (patch)
treec0468f30020e50874bb90ee172461f795b290e0b
parentfe0308730848cc65ca0ce39c8e4e4062a5b3af13 (diff)
attempt to deal with websockets. maybe it works. v0.9.9
-rw-r--r--filter.lua4
-rw-r--r--miniwebproxy.go40
2 files changed, 26 insertions, 18 deletions
diff --git a/filter.lua b/filter.lua
index 1440013..85cf1b7 100644
--- a/filter.lua
+++ b/filter.lua
@@ -29,7 +29,7 @@ function shouldfilter(host)
 	if host:match("amazon.com") then return "" end
 	if host:match("twitter.com") then return "" end
 	if host:match("cdn.googlesource.com") then return "" end
-	return "yeah"
+	return "y"
 end
 
 function prefilter(req)
@@ -40,7 +40,7 @@ end
 
 function filter(outw, req, host, path, root)
 	print("trying to filter in lua", host, path)
-	if path == "/" then
+	if true or path == "/" then
 		return ""
 	end
 	local article
diff --git a/miniwebproxy.go b/miniwebproxy.go
index a7d765a..a49e6de 100644
--- a/miniwebproxy.go
+++ b/miniwebproxy.go
@@ -235,13 +235,11 @@ func connect(ctx context.Context, dest string, desthost string) (net.Conn, error
 	return conn, nil
 }
 
-var MyTransport http.Transport
-
-func init() {
-	dt := http.DefaultTransport.(*http.Transport)
-	MyTransport = *dt
-	MyTransport.Proxy = nil
-	MyTransport.DialContext = getDialer().DialContext
+var MyTransport = http.Transport{
+	MaxIdleConns:        20,
+	IdleConnTimeout:     90 * time.Second,
+	TLSHandshakeTimeout: 10 * time.Second,
+	DialContext:         getDialer().DialContext,
 }
 
 func (pxr *Proxer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -283,15 +281,6 @@ func (pxr *Proxer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	serverconn, err := connect(ctx, dest, desthost)
-	if err != nil {
-		log.Printf("failed to connect: %s", err)
-		writeerror(clientconn, fmt.Sprintf("failed to connect: %s", err))
-		return
-	}
-	defer serverconn.Close()
-	// serverconn.SetDeadline(deadline)
-
 	clientconn.Write([]byte("HTTP/1.0 200 OK\r\n\r\n"))
 	tlsconf := getTLSConfig(desthost)
 	clientconn = tls.Server(clientconn, tlsconf)
@@ -325,12 +314,31 @@ func (pxr *Proxer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		if clientreq.Header.Get("Accept-Encoding") != "" {
 			clientreq.Header.Set("Accept-Encoding", "gzip")
 		}
+		log.Printf("clientreq url %s\n", clientreq.URL.String())
 		prefilter(L, clientreq)
 		clientreq.URL.Host = clientreq.URL.Hostname()
 
+		if clientreq.Header.Get("Upgrade") == "websocket" {
+			log.Printf("attempted upgrade to websocket")
+			serverconn, err := connect(ctx, dest, desthost)
+			if err != nil {
+				log.Printf("failed to connect: %s", err)
+				writeerror(clientconn, fmt.Sprintf("failed to connect: %s", err))
+				return
+			}
+			p := make(chan net.Conn)
+			clientreq.Write(serverconn)
+			go copyuntildone(clientconn, serverconn, p)
+			go copyuntildone(serverconn, clientconn, p)
+			closewhendone(p)
+			log.Printf("finished websocket")
+			return
+		}
+
 		serverresp, err := MyTransport.RoundTrip(clientreq)
 		if err != nil {
 			log.Printf("err requesting: %s", err)
+			writeerror(clientconn, "error proxying request")
 			return
 		}
 		filter(L, clientconn, serverresp, clientreq)