about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-04-24 22:44:04 +0000
committerEric Wong <e@80x24.org>2019-04-25 03:12:08 +0000
commite460a9fdf3b557203f0225989b0676c98264067d (patch)
tree6a1d88ba098450af948ef7237f604f3ffa9ac757
parent3b6e9cd2a321b15d7042b8a5e2af2bfe6781d4e0 (diff)
downloadpublic-inbox-e460a9fdf3b557203f0225989b0676c98264067d.tar.gz
I'm using this as the cgit about-filter and source-filter
in https://80x24.org/public-inbox.git
-rw-r--r--MANIFEST1
-rw-r--r--examples/cgit-wwwhighlight-filter.lua105
2 files changed, 106 insertions, 0 deletions
diff --git a/MANIFEST b/MANIFEST
index 9858b9ee..ed8ff491 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -39,6 +39,7 @@ examples/apache2_perl.conf
 examples/apache2_perl_old.conf
 examples/cgi-webrick.rb
 examples/cgit-commit-filter.lua
+examples/cgit-wwwhighlight-filter.lua
 examples/cgit.psgi
 examples/highlight.psgi
 examples/logrotate.conf
diff --git a/examples/cgit-wwwhighlight-filter.lua b/examples/cgit-wwwhighlight-filter.lua
new file mode 100644
index 00000000..a267d1c8
--- /dev/null
+++ b/examples/cgit-wwwhighlight-filter.lua
@@ -0,0 +1,105 @@
+-- Copyright (C) 2019 all contributors <meta@public-inbox.org>
+-- License: GPL-2.0+ <https://www.gnu.org/licenses/gpl-2.0.txt>
+--
+-- This filter accesses the PublicInbox::WwwHighlight PSGI endpoint
+-- (see examples/highlight.psgi)
+--
+-- Dependencies: lua-http
+--
+-- disclaimer: written by someone who does not know Lua.
+--
+-- This requires cgit linked with Lua
+-- Usage (in your cgitrc(5) config file):
+--
+--   source-filter=lua:/path/to/this/script.lua
+--   about-filter=lua:/path/to/this/script.lua
+--
+local wwwhighlight_url = 'http://127.0.0.1:9090/'
+local req_timeout = 10
+local too_big = false
+
+-- match $PublicInbox::HTTP::MAX_REQUEST_BUFFER
+local max_len = 10 * 1024 * 1024
+
+-- about-filter needs surrounding <pre> tags if all we do is
+-- highlight and linkify
+local pre = true
+
+function filter_open(...)
+        req_body = ""
+
+        -- detect when we're used in an about-filter
+        local repo_url = os.getenv('CGIT_REPO_URL')
+        if repo_url then
+                local path_info = os.getenv('PATH_INFO')
+                rurl = path_info:match("^/(.+)/about/?$")
+                pre = rurl == repo_url
+        end
+
+        -- hand filename off for language detection
+        local fn = select(1, ...)
+        if fn then
+                local http_util = require 'http.util'
+                wwwhighlight_url = wwwhighlight_url .. http_util.encodeURI(fn)
+        end
+end
+
+-- try to buffer the entire source in memory
+function filter_write(str)
+        if too_big then
+                html(str)
+        elseif (req_body:len() + str:len()) > max_len then
+                too_big = true
+                req_body = ""
+                html(req_body)
+                html(str)
+        else
+                req_body = req_body .. str
+        end
+end
+
+function fail(err)
+        io.stderr:write(tostring(err), "\n")
+        if pre then
+                html("<pre>")
+        end
+        html_txt(req_body)
+        if pre then
+                html("</pre>")
+        end
+        return 1
+end
+
+function filter_close()
+        if too_big then
+                return 0
+        end
+        local request = require 'http.request'
+        local req = request.new_from_uri(wwwhighlight_url)
+        req.headers:upsert(':method', 'PUT')
+        req:set_body(req_body)
+
+        -- don't wait for 100-Continue message from the PSGI app
+        req.headers:delete('expect')
+
+        local headers, stream = req:go(req_timeout)
+        if headers == nil then
+                return fail(stream)
+        end
+        local status = headers:get(':status')
+        if status ~= '200' then
+                return fail('status ' .. status)
+        end
+        local body, err = stream:get_body_as_string()
+        if not body and err then
+                return fail(err)
+        end
+        if pre then
+                html("<pre>")
+        end
+        html(body)
+        if pre then
+                html("</pre>")
+        end
+        return 0
+end