1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
| | -- Copyright (C) 2019-2021 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
|