2021-03-25 09:21:13 +00:00
-- redbean lua server page demo
local function main ( )
2021-03-29 08:22:49 +00:00
-- This is the best way to print data to the console or log file.
Log ( kLogWarn , " hello from \ e[1mlua \ e[0m! " )
2021-03-27 14:29:55 +00:00
-- This check is pedantic but might be good to have.
2021-03-25 09:21:13 +00:00
if GetMethod ( ) ~= ' GET ' and GetMethod ( ) ~= ' HEAD ' then
ServeError ( 405 )
SetHeader ( ' Allow ' , ' GET, HEAD ' )
return
end
-- These two lines are optional.
-- The default behavior is to do this if you don't.
SetStatus ( 200 ) -- Shorthand for SetStatus(200, "OK")
SetHeader ( ' Content-Type ' , ' text/html; charset=utf-8 ' )
-- Response data is buffered until the script finishes running.
-- Compression is applied automatically, based on your headers.
2021-04-21 02:14:21 +00:00
Write ( ' <!doctype html> \r \n ' )
Write ( ' <title>redbean</title> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( ' <h1> \r \n ' )
Write ( ' <img style="vertical-align:middle" src="data:image/png;base64, \r \n ' )
Write ( EncodeBase64 ( LoadAsset ( ' /redbean.png ' ) ) )
Write ( ' "> \r \n ' )
Write ( ' redbean lua server page demo \r \n ' )
Write ( ' </h1> \r \n ' )
2021-03-25 09:21:13 +00:00
2021-03-29 08:22:49 +00:00
-- Prevent caching.
-- We need this because we're doing things like putting the client's
-- IP address in the response so we naturally don't want that cached
SetHeader ( ' Expires ' , FormatHttpDateTime ( GetDate ( ) ) )
SetHeader ( ' Cache-Control ' , ' no-cache, must-revalidate, max-age=0 ' )
2021-04-25 00:09:01 +00:00
-- GetUrl() is the resolved Request-URI (TODO: Maybe change API to return a URL object?)
Write ( ' <p>Thank you for visiting <code> ' )
Write ( GetUrl ( ) ) -- redbean encoded this value so it doesn't need html entity escaping
Write ( ' </code> \r \n ' )
2021-04-21 02:14:21 +00:00
-- GetParam(NAME) is the fastest easiest way to get URL and FORM params
-- If you want the RequestURL query params specifically in full do this
Write ( ' <h3>request url parameters</h3> \r \n ' )
params = ParseUrl ( GetUrl ( ) ) . params -- like GetParams() but w/o form body
if params and # params > 0 then
Write ( ' <dl> \r \n ' )
2021-03-25 09:21:13 +00:00
for i = 1 , # params do
Write ( ' <dt> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( params [ i ] [ 1 ] ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
2021-03-25 09:21:13 +00:00
if params [ i ] [ 2 ] then
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( params [ i ] [ 2 ] ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
2021-03-25 09:21:13 +00:00
end
end
2021-04-21 02:14:21 +00:00
Write ( ' </dl> \r \n ' )
2021-04-25 00:09:01 +00:00
Write ( " <p>Whatever you do, don't click on " )
Write ( ' <a href=" ' )
Write ( EscapeHtml ( EscapePath ( GetPath ( ) ) .. ' ?magic ' ) )
Write ( ' "> ' )
Write ( EscapeHtml ( VisualizeControlCodes ( GetPath ( ) ) ) )
Write ( ' ?magic</a> \r \n ' )
2021-03-25 09:21:13 +00:00
else
2021-04-21 02:14:21 +00:00
Write ( ' <p> \r \n ' )
Write ( ' <em>none</em><br> \r \n ' )
2021-03-25 09:21:13 +00:00
Write ( ' ProTip: Try <a href=" ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( EscapePath ( GetPath ( ) ) .. ' ?x=hi%20there%00%C0%80&y&z&z= ' .. EscapeParam ( ' & ' ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' ">clicking here</a>! \r \n ' )
2021-03-25 09:21:13 +00:00
end
2021-03-27 14:29:55 +00:00
2021-04-21 02:14:21 +00:00
-- redbean command line arguments
-- these come *after* the c getopt server arguments
Write ( ' <h3>command line arguments</h3> \r \n ' )
2021-03-27 14:29:55 +00:00
if # argv > 0 then
2021-04-21 02:14:21 +00:00
Write ( ' <ul> \r \n ' )
2021-03-27 14:29:55 +00:00
for i = 1 , # argv do
Write ( ' <li> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( argv [ i ] ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
2021-03-27 14:29:55 +00:00
end
2021-04-21 02:14:21 +00:00
Write ( ' </ul> \r \n ' )
2021-03-27 14:29:55 +00:00
else
2021-04-21 02:14:21 +00:00
Write ( ' <p><em>none</em> \r \n ' )
2021-03-27 14:29:55 +00:00
end
2021-03-28 07:10:17 +00:00
Write ( [ [
< h3 > post request html form demo </ h3 >
2021-04-18 18:34:59 +00:00
< form action = " redbean-form.lua " method = " post " >
2021-03-28 07:10:17 +00:00
< input type = " text " id = " firstname " name = " firstname " >
< label for = " firstname " > first name </ label >
< br >
< input type = " text " id = " lastname " name = " lastname " >
< label for = " lastname " > last name </ label >
< br >
< input type = " submit " value = " Submit " >
</ form >
] ] )
Write ( [ [
< h3 > xmlhttprequest request demo </ h3 >
< input id = " x " value = " lâtìn1 " >
2021-03-28 14:54:21 +00:00
< label for = " x " > X - Custom - Header </ label >< br >
< button id = " send " > send </ button >< br >
2021-03-28 07:10:17 +00:00
< div id = " result " ></ div >
< script >
function OnSend ( ) {
var r = new XMLHttpRequest ( ) ;
r.onload = function ( ) {
document.getElementById ( " result " ) . innerText = this.getResponseHeader ( ' X-Custom-Header ' ) ;
} ;
2021-04-18 18:34:59 +00:00
r.open ( ' POST ' , ' redbean-xhr.lua ' ) ;
2021-03-28 07:10:17 +00:00
r.setRequestHeader ( ' X-Custom-Header ' , document.getElementById ( ' x ' ) . value ) ;
r.send ( ) ;
}
document.getElementById ( ' send ' ) . onclick = OnSend ;
</ script >
] ] )
2021-03-28 14:54:21 +00:00
2021-04-21 02:14:21 +00:00
-- fast redbean apis for accessing already parsed request data
Write ( ' <h3>extra information</h3> \r \n ' )
Write ( ' <dl> \r \n ' )
Write ( ' <dt>GetMethod() \r \n ' )
Write ( ' <dd> ' )
Write ( EscapeHtml ( GetMethod ( ) ) ) -- & and ' are legal in http methods
Write ( ' \r \n ' )
if GetUser ( ) then
Write ( ' <dt>GetUser() \r \n ' )
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( GetUser ( ) ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
end
if GetScheme ( ) then
Write ( ' <dt>GetScheme() \r \n ' )
Write ( ' <dd> ' )
Write ( GetScheme ( ) )
Write ( ' \r \n ' )
end
if GetPass ( ) then
Write ( ' <dt>GetPass() \r \n ' )
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( GetPass ( ) ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
end
2021-04-23 17:45:19 +00:00
Write ( ' <dt>GetHost() <small>(from HTTP Request-URI or Host header or X-Forwarded-Host header or Berkeley Sockets)</small> \r \n ' )
2021-04-21 02:14:21 +00:00
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( GetHost ( ) ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( ' <dt>GetPort() <small>(from HTTP Request-URI or Host header or X-Forwarded-Host header or Berkeley Sockets)</small> \r \n ' )
2021-04-21 02:14:21 +00:00
Write ( ' <dd> ' )
Write ( tostring ( GetPort ( ) ) )
Write ( ' \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( ' <dt>GetPath() <small>(from HTTP Request-URI)</small> \r \n ' )
Write ( ' <dd> ' )
Write ( EscapeHtml ( VisualizeControlCodes ( GetPath ( ) ) ) )
Write ( ' \r \n ' )
Write ( ' <dt>GetEffectivePath() <small>(actual path used internally to load the lua asset: routed depending on host, request path, and rewrites)</small> \r \n ' )
2021-04-21 02:14:21 +00:00
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( GetEffectivePath ( ) ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
if GetFragment ( ) then
Write ( ' <dt>GetFragment() \r \n ' )
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( GetFragment ( ) ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
end
2021-05-14 12:36:58 +00:00
Write ( ' <dt>GetRemoteAddr() <small>(from Berkeley Sockets or X-Forwarded-For header)</small> \r \n ' )
2021-04-21 02:14:21 +00:00
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
ip , port = GetRemoteAddr ( )
2022-04-24 16:59:22 +00:00
Write ( ' %s, %d ' % { FormatIp ( ip ) , port } )
2021-04-23 17:45:19 +00:00
if CategorizeIp ( ip ) then
Write ( ' <br> \r \n ' )
Write ( CategorizeIp ( ip ) )
end
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( ' <dt>GetClientAddr() \r \n ' )
2021-03-28 14:54:21 +00:00
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
ip , port = GetClientAddr ( )
2022-04-24 16:59:22 +00:00
Write ( ' %s, %d ' % { FormatIp ( ip ) , port } )
2021-04-23 17:45:19 +00:00
if CategorizeIp ( ip ) then
Write ( ' <br> \r \n ' )
Write ( CategorizeIp ( ip ) )
end
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
Write ( ' <dt>GetServerIp() \r \n ' )
2021-03-28 14:54:21 +00:00
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
ip , port = GetServerAddr ( )
2022-04-24 16:59:22 +00:00
Write ( ' %s, %d ' % { FormatIp ( ip ) , port } )
2021-04-23 17:45:19 +00:00
if CategorizeIp ( ip ) then
Write ( ' <br> \r \n ' )
Write ( CategorizeIp ( ip ) )
end
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
Write ( ' </dl> \r \n ' )
-- redbean apis for generalized parsing and encoding
referer = GetHeader ( ' Referer ' )
if referer then
url = ParseUrl ( referer )
if url.scheme then
url.scheme = string.upper ( url.scheme )
end
Write ( ' <h3>referer url</h3> \r \n ' )
Write ( ' <p> \r \n ' )
Write ( EscapeHtml ( EncodeUrl ( url ) ) )
Write ( ' <dl> \r \n ' )
if url.scheme then
Write ( ' <dt>scheme \r \n ' )
Write ( ' <dd> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( url.scheme )
2021-04-21 02:14:21 +00:00
end
if url.user then
Write ( ' <dt>user \r \n ' )
Write ( ' <dd> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.user ) ) )
2021-04-21 02:14:21 +00:00
end
if url.pass then
Write ( ' <dt>pass \r \n ' )
Write ( ' <dd> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.pass ) ) )
2021-04-21 02:14:21 +00:00
end
if url.host then
Write ( ' <dt>host \r \n ' )
Write ( ' <dd> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.host ) ) )
2021-04-21 02:14:21 +00:00
end
if url.port then
Write ( ' <dt>port \r \n ' )
Write ( ' <dd> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.port ) ) )
2021-04-21 02:14:21 +00:00
end
if url.path then
Write ( ' <dt>path \r \n ' )
Write ( ' <dd> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.path ) ) )
2021-04-21 02:14:21 +00:00
end
if url.params then
Write ( ' <dt>params \r \n ' )
Write ( ' <dd> \r \n ' )
Write ( ' <dl> \r \n ' )
for i = 1 , # url.params do
Write ( ' <dt> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.params [ i ] [ 1 ] ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
if url.params [ i ] [ 2 ] then
Write ( ' <dd> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.params [ i ] [ 2 ] ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
end
end
Write ( ' </dl> \r \n ' )
end
if url.fragment then
Write ( ' <dt>fragment \r \n ' )
Write ( ' <dd> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( url.fragment ) ) )
2021-04-21 02:14:21 +00:00
end
Write ( ' </dl> \r \n ' )
end
Write ( ' <h3>posix extended regular expressions</h3> \r \n ' )
2021-04-23 17:45:19 +00:00
s = ' my ' .. FormatIp ( GetRemoteAddr ( ) ) .. ' ip '
-- traditional regular expressions
m , a , b , c , d = re.search ( [[\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)]] , s , re.BASIC )
-- easy api (~10x slower because compile is O(2ⁿ) and search is O(n))
m , a , b , c , d = re.search ( [[([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})]] , s )
-- proper api (especially if you put the re.compile() line in /.init.lua)
pat = re.compile ( [[([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})]] )
m , a , b , c , d = pat : search ( s ) -- m and rest are nil if match not found
2021-04-21 02:14:21 +00:00
Write ( ' <pre> \r \n ' )
2021-04-24 20:58:34 +00:00
Write ( [[pat = re.compile('([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})')]] )
2022-04-24 16:59:22 +00:00
Write ( ' \r \n m,a,b,c,d = pat:search(%q) \r \n ' % { s } )
2021-04-21 02:14:21 +00:00
Write ( ' </pre> \r \n ' )
Write ( ' <dl> \r \n ' )
Write ( ' <dt>m \r \n ' )
Write ( ' <dd> ' )
2022-04-24 16:59:22 +00:00
Write ( " %q " % { m } )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
Write ( ' <dt>a \r \n ' )
Write ( ' <dd> ' )
2022-04-24 16:59:22 +00:00
Write ( " %q " % { a } )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
Write ( ' <dt>b \r \n ' )
Write ( ' <dd> ' )
2022-04-24 16:59:22 +00:00
Write ( " %q " % { b } )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
Write ( ' <dt>c \r \n ' )
Write ( ' <dd> ' )
2022-04-24 16:59:22 +00:00
Write ( " %q " % { c } )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
Write ( ' <dt>d \r \n ' )
Write ( ' <dd> ' )
2022-04-24 16:59:22 +00:00
Write ( " %q " % { d } )
2021-04-21 02:14:21 +00:00
Write ( ' \r \n ' )
Write ( ' </dl> \r \n ' )
2021-04-23 17:45:19 +00:00
Write ( ' <h3>source code to this page</h3> \r \n ' )
Write ( ' <pre> \r \n ' )
Write ( EscapeHtml ( LoadAsset ( GetEffectivePath ( ) ) ) )
Write ( ' </pre> \r \n ' )
2021-04-21 02:14:21 +00:00
-- redbean zip assets
Write ( ' <h3>zip assets</h3> \r \n ' )
paths = GetZipPaths ( )
if # paths > 0 then
Write ( ' <ul> \r \n ' )
for i = 1 , # paths do
Write ( ' <li> \r \n ' )
Write ( ' <a href=" ' )
Write ( EscapeHtml ( EscapePath ( paths [ i ] ) ) )
Write ( ' "> ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( paths [ i ] ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' </a> ' )
if IsHiddenPath ( paths [ i ] ) then
Write ( ' <small>[HIDDEN]</small> ' )
end
if not IsAcceptablePath ( paths [ i ] ) then
Write ( ' <small>[BLOCKED]</small> ' )
end
2022-06-24 01:54:35 +00:00
if not IsAssetCompressed ( paths [ i ] ) then
2021-04-21 02:14:21 +00:00
Write ( ' <small>[UNCOMPRESSED]</small> ' )
end
if ( GetAssetMode ( paths [ i ] ) & 0xF000 ) == 0x4000 then
Write ( ' <small>[DIRECTORY]</small> ' )
end
Write ( ' <br> \r \n ' )
Write ( ' Modified: ' )
2022-06-24 01:54:35 +00:00
Write ( FormatHttpDateTime ( GetAssetLastModifiedTime ( paths [ i ] ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' <br> \r \n ' )
Write ( ' Mode: ' )
2022-04-24 16:59:22 +00:00
Write ( " 0%o " % { GetAssetMode ( paths [ i ] ) } )
2021-04-21 02:14:21 +00:00
Write ( ' <br> \r \n ' )
Write ( ' Size: ' )
Write ( tostring ( GetAssetSize ( paths [ i ] ) ) )
Write ( ' <br> \r \n ' )
if GetComment ( paths [ i ] ) then
Write ( ' Comment: ' )
2021-04-23 17:45:19 +00:00
Write ( EscapeHtml ( VisualizeControlCodes ( GetComment ( paths [ i ] ) ) ) )
2021-04-21 02:14:21 +00:00
Write ( ' <br> \r \n ' )
end
Write ( ' \r \n ' )
end
Write ( ' </ul> \r \n ' )
else
Write ( ' <p><em>none</em> \r \n ' )
end
2021-03-25 09:21:13 +00:00
end
main ( )