summary refs log tree commit diff
diff options
context:
space:
mode:
authorTed Unangst <tedu@tedunangst.com>2019-01-24 06:07:26 -0500
committerTed Unangst <tedu@tedunangst.com>2019-01-24 06:07:26 -0500
commit521f41791b040e0d6b336ff7bc0e298831cc3d2d (patch)
tree55affe4d9cc9a2f4244ffe260fd3029ca8cbe334
parenta836ef36f280f2a9df1e40ebf180ce2e9d5b89bd (diff)
one lua interpreter per request should be enough v0.9.5
-rw-r--r--cmdfilter.go3
-rw-r--r--filter.go16
-rw-r--r--miniwebproxy.go14
3 files changed, 16 insertions, 17 deletions
diff --git a/cmdfilter.go b/cmdfilter.go
index e0a2973..6e75a4e 100644
--- a/cmdfilter.go
+++ b/cmdfilter.go
@@ -18,5 +18,6 @@ func main() {
 
 	fd, _ := os.Open(fname)
 	resp.Body = fd
-	filter(os.Stdout, &resp, &req)
+	L := getinterpreter()
+	filter(L, os.Stdout, &resp, &req)
 }
diff --git a/filter.go b/filter.go
index a8f3e33..7704008 100644
--- a/filter.go
+++ b/filter.go
@@ -267,7 +267,7 @@ func clean(w io.Writer, node *html.Node, baseurl *url.URL) {
 	}
 }
 
-func filter(w io.Writer, resp *http.Response, req *http.Request) {
+func filter(L *Interpreter, w io.Writer, resp *http.Response, req *http.Request) {
 	if resp.StatusCode != 200 {
 		resp.Write(w)
 		return
@@ -302,7 +302,7 @@ func filter(w io.Writer, resp *http.Response, req *http.Request) {
 		gzw = gzip.NewWriter(respwriter)
 	}
 
-	go dofiltering(respwriter, gzw, reader, req)
+	go dofiltering(L, respwriter, gzw, reader, req)
 
 	resp.Header.Del("Content-Length")
 	resp.ContentLength = -1
@@ -310,7 +310,7 @@ func filter(w io.Writer, resp *http.Response, req *http.Request) {
 	resp.Write(w)
 }
 
-func dofiltering(w io.WriteCloser, gzw io.WriteCloser, reader io.Reader, req *http.Request) {
+func dofiltering(L *Interpreter, w io.WriteCloser, gzw io.WriteCloser, reader io.Reader, req *http.Request) {
 	// gzip.Writer doesn't close underlying writer
 	if gzw != nil {
 		defer w.Close()
@@ -325,8 +325,6 @@ func dofiltering(w io.WriteCloser, gzw io.WriteCloser, reader io.Reader, req *ht
 		return
 	}
 
-	L := getinterpreter()
-	defer putinterpreter(L)
 	filtresult := L.Call("filter", w, req, req.URL.Hostname(), req.URL.Path, root)
 	if filtresult == "" {
 		log.Printf("did not rewrite %s, raw rendering", req.URL.String())
@@ -335,15 +333,11 @@ func dofiltering(w io.WriteCloser, gzw io.WriteCloser, reader io.Reader, req *ht
 	}
 }
 
-func prefilter(req *http.Request) {
-	L := getinterpreter()
-	defer putinterpreter(L)
+func prefilter(L *Interpreter, req *http.Request) {
 	L.Call("prefilter", req)
 }
 
-func shouldintercept(host string) bool {
-	L := getinterpreter()
-	defer putinterpreter(L)
+func shouldintercept(L *Interpreter, host string) bool {
 	filtresult := L.Call("shouldfilter", host)
 	if filtresult != "" {
 		return true
diff --git a/miniwebproxy.go b/miniwebproxy.go
index 549e05b..5bb5b3b 100644
--- a/miniwebproxy.go
+++ b/miniwebproxy.go
@@ -92,11 +92,13 @@ func proxyreq(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	if !shouldintercept(r.URL.Hostname()) {
+	L := getinterpreter()
+	defer putinterpreter(L)
+	if !shouldintercept(L, r.URL.Hostname()) {
 		resp.Write(inconn)
 		return
 	}
-	filter(inconn, resp, r)
+	filter(L, inconn, resp, r)
 }
 
 var certcache = make(map[string]*tls.Config)
@@ -205,8 +207,10 @@ func (pxr *Proxer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		inconn.Write([]byte("HTTP/1.0 200 OK\r\n\r\n"))
 		tlsconf := getTLSConfig(r.URL.Hostname())
 
+		L := getinterpreter()
+		defer putinterpreter(L)
 		dialer := getDialer()
-		if !shouldintercept(r.URL.Hostname()) {
+		if !shouldintercept(L, r.URL.Hostname()) {
 			outconn, err := dialer.Dial("tcp", r.Host)
 			if err != nil {
 				log.Printf("failed to read request %s", err)
@@ -238,7 +242,7 @@ func (pxr *Proxer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 			inreq.Header.Set("Accept-Encoding", "gzip")
 		}
 		log.Printf("inreq url %s\n", inreq.URL.String())
-		prefilter(inreq)
+		prefilter(L, inreq)
 
 		log.Printf("dialing %s\n", inreq.URL.Host)
 		rawconn, err := dialer.Dial("tcp", inreq.URL.Host)
@@ -261,7 +265,7 @@ func (pxr *Proxer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		}
 		resp.Close = true
 		resp.Header.Set("Connection", "close")
-		filter(inconn, resp, inreq)
+		filter(L, inconn, resp, inreq)
 		return
 	}
 	proxyreq(w, r)