diff options
author | Ted Unangst <tedu@tedunangst.com> | 2019-01-24 06:07:26 -0500 |
---|---|---|
committer | Ted Unangst <tedu@tedunangst.com> | 2019-01-24 06:07:26 -0500 |
commit | 521f41791b040e0d6b336ff7bc0e298831cc3d2d (patch) | |
tree | 55affe4d9cc9a2f4244ffe260fd3029ca8cbe334 | |
parent | a836ef36f280f2a9df1e40ebf180ce2e9d5b89bd (diff) |
one lua interpreter per request should be enough v0.9.5
-rw-r--r-- | cmdfilter.go | 3 | ||||
-rw-r--r-- | filter.go | 16 | ||||
-rw-r--r-- | miniwebproxy.go | 14 |
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) |