mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 19:43:32 +00:00
48ce3ad7cc
- Rewrite Slurp() API to be like string.sub() - Introduce a new Barf() API for creating files - Update Redbean `-S` sandbox flag to do unveiling
74 lines
2.3 KiB
Lua
74 lines
2.3 KiB
Lua
-- Fetch() API Demo
|
|
|
|
local function WriteForm(url)
|
|
Write([[<!doctype html>
|
|
<title>redbean fetch demo</title>
|
|
<style>
|
|
body { padding: 1em; }
|
|
h1 a { color: inherit; text-decoration: none; }
|
|
h1 img { border: none; vertical-align: middle; }
|
|
input { margin: 1em; padding: .5em; }
|
|
pre { margin-left: 2em; }
|
|
p { word-break: break-word; max-width: 650px; }
|
|
dt { font-weight: bold; }
|
|
dd { margin-top: 1em; margin-bottom: 1em; }
|
|
.hdr { text-indent: -1em; padding-left: 1em; }
|
|
</style>
|
|
<h1>
|
|
<a href="/"><img src="/redbean.png"></a>
|
|
<a href="fetch.lua">redbean fetch demo</a>
|
|
</h1>
|
|
<p>
|
|
Your redbean is able to function as an HTTP client too.
|
|
Lua server pages can use the <code>Fetch()</code> API to
|
|
to send outgoing HTTP and HTTPS requests to other web
|
|
servers. All it takes is a line of code!
|
|
</p>
|
|
<form action="fetch.lua" method="post">
|
|
<input type="text" id="url" name="url" size="70"
|
|
value="%s" placeholder="uri" autofocus>
|
|
<input type="submit" value="fetch">
|
|
</form>
|
|
]] % {EscapeHtml(url)})
|
|
end
|
|
|
|
local function main()
|
|
if IsPublicIp(GetClientAddr()) then
|
|
ServeError(403)
|
|
elseif GetMethod() == 'GET' or GetMethod() == 'HEAD' then
|
|
WriteForm("https://www.cloudflare.com/robots.txt")
|
|
elseif GetMethod() == 'POST' then
|
|
status, headers, payload = Fetch(GetParam('url'))
|
|
if status then
|
|
WriteForm(GetParam('url'))
|
|
Write('<dl>\r\n')
|
|
Write('<dt>Status\r\n')
|
|
Write('<dd><p>%d %s\r\n' % {status, GetHttpReason(status)})
|
|
Write('<dt>Headers\r\n')
|
|
Write('<dd>\r\n')
|
|
for k,v in pairs(headers) do
|
|
Write('<div class="hdr"><strong>')
|
|
Write(EscapeHtml(k))
|
|
Write('</strong>: ')
|
|
Write(EscapeHtml(v))
|
|
Write('</div>\r\n')
|
|
end
|
|
Write('<dt>Payload\r\n')
|
|
Write('<dd><pre>')
|
|
Write(EscapeHtml(VisualizeControlCodes(payload)))
|
|
Write('</pre>\r\n')
|
|
Write('</dl>\r\n')
|
|
else
|
|
err = headers
|
|
WriteForm(GetParam('url'))
|
|
Write('<h3>Error</h3>\n')
|
|
Write('<p>')
|
|
Write(EscapeHtml(VisualizeControlCodes(err)))
|
|
end
|
|
else
|
|
ServeError(405)
|
|
SetHeader('Allow', 'GET, HEAD, POST')
|
|
end
|
|
end
|
|
|
|
main()
|