Replace $redirectPermanent with new conf_perm_redirect function. New notices_handler for error/note/success notification boxes. Rename hide_paths to conf_hide_paths. Reorder variable setting, all req-specifc vars are set after initrc and app sourcing, moved request handling code to its own function, this makes us ready to do scgi and other optimizations.

This commit is contained in:
Uriel 2009-01-30 16:18:07 +01:00
parent 2ee4609eb1
commit 590816c6d4

View file

@ -6,23 +6,30 @@ forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]'
# Expected input: ls -F style, $sitedir/path/to/files/ # Expected input: ls -F style, $sitedir/path/to/files/
# <ls -F+x><symlink hack><Useless?><hiden files > # <ls -F+x><symlink hack><Useless?><hiden files >
dirfilter='s/\*$//; s,/+\./+,/,g; s,^\./,,; /\/[._][^\/]/d; /'^$forbidden_uri_chars^'/d; /^\/(robots|sitemap)\.txt$|\/index\.(md|html|txt|tpl)$/d; /_werc\/?$/d; ' dirfilter='s/\*$//; s,/+\./+,/,g; s,^\./,,; /\/[._][^\/]/d; /'$forbidden_uri_chars'/d; /^\/(robots|sitemap)\.txt$|\/index\.(md|html|txt|tpl)$/d; /_werc\/?$/d; '
dirclean=' s/\.(md|html|txt)$//; ' dirclean=' s/\.(md|html|txt)$//; '
# To be used from config files # To be used from config files
fn hide_paths { fn conf_perm_redirect {
if(~ $#* 1)
perm_redirect $1
if not
perm_redir_patterns=($perm_redir_patterns $1 $2)
}
fn conf_hide_paths {
for(i in $*) for(i in $*)
dirfilter=$dirfilter^'/^'$i'$/d; ' dirfilter=$dirfilter^'/^'$i'$/d; '
} }
# Sidebar # Standard handlers
fn nav_tree { fn nav_tree {
if(! ~ $#sideBarNavTitle 0) if(! ~ $#sideBarNavTitle 0)
echo '<p class="sideBarTitle">'$"sideBarNavTitle':</p>' echo '<p class="sideBarTitle">'$"sideBarNavTitle':</p>'
# Ignore stderr, last path element might be a file that doesn't exist (eg., foo for foo.md) # Ignore stderr, last path element might be a file that doesn't exist (eg., foo for foo.md)
# /./ to deal with p9p's ls failure to follow dir symlinks otherwise # /./ to deal with p9p's ls failure to follow dir symlinks otherwise
ls -F $sitedir/./$req_paths_list >[2]/dev/null \ ls -F $sitedir/./$req_paths_list >[2]/dev/null \
| sed 's!^'$sitedir'!!; '^$dirfilter^'/\/[^_.\/][^\/]*(\.(md|txt|html)|\/)$/!d; '^$dirclean \ | sed 's!^'$sitedir'!!; '$dirfilter'/\/[^_.\/][^\/]*(\.(md|txt|html)|\/)$/!d; '$dirclean \
| sort -u | awk -F/ ' | sort -u | awk -F/ '
function p(x, y, s) { for(i=0; i < x-y; i+=1) print s } function p(x, y, s) { for(i=0; i < x-y; i+=1) print s }
{ {
@ -48,7 +55,6 @@ fn nav_tree {
} }
# Handlers
fn md_handler { $formatter < $1 } fn md_handler { $formatter < $1 }
fn tpl_handler { template $* } fn tpl_handler { template $* }
@ -77,6 +83,12 @@ fn dir_listing_handler {
echo '</ul>' echo '</ul>'
} }
fn notices_handler {
for(type in notify_errors notify_notes notify_success)
for(n in $$type)
echo '<div class="'$type'"><b>'$"n'</b></div>'
}
fn setup_handlers { fn setup_handlers {
if(test -f $local_path.md) if(test -f $local_path.md)
@ -133,13 +145,6 @@ sitesdir=sites
for(i in siteTitle siteSubTitle pageTitle extraHeaders) for(i in siteTitle siteSubTitle pageTitle extraHeaders)
$i = '' $i = ''
# TODO: Per-req variables should move after initrc loading.
site=$SERVER_NAME
base_url=http://$site/
sitedir=$sitesdir/$site
master_template=`{get_lib_file default_master.tpl}
current_date_time=`{date}
. ./etc/initrc . ./etc/initrc
if(test -f etc/initrc.local) if(test -f etc/initrc.local)
@ -148,71 +153,83 @@ if(test -f etc/initrc.local)
for(a in $werc_apps) for(a in $werc_apps)
. ./$a/app.rc . ./$a/app.rc
# Parse request URL fn werc_exec_request {
# NOTE: $REQUEST_URI is not officially in CGI 1.1, but seems to be de-facto site=$SERVER_NAME
req_path=`{echo -n $REQUEST_URI | sed 's/\?.*//; s/'^$forbidden_uri_chars^'//g; s/\.\.*/./g; 1q'} base_url=http://$site
local_path=$sitedir$req_path sitedir=$sitesdir/$site
ifs='/' { args=`{echo -n $req_path} } master_template=`{get_lib_file default_master.tpl}
current_date_time=`{date}
# Hack: preload post data so we can access it from templates where cgi's stdin is not accesible # Note: $REQUEST_URI is not officially in CGI 1.1, but seems to be de-facto
if(~ $REQUEST_METHOD POST) { req_path=`{echo -n $REQUEST_URI | sed 's/\?.*//; s!//+!/!g; s/'^$forbidden_uri_chars^'//g; s/\.\.*/./g; 1q'}
load_post_args local_path=$sitedir$req_path
login_user ifs='/' { args=`{echo -n $req_path} }
}
if(! ~ $#args 0) # Preload post args for templates where cgi's stdin is not accessible
pageTitle=`{ echo $args|sed -e 's/ / - /g' -e 's/_/ /g' } if(~ $REQUEST_METHOD POST) {
load_post_args
if(~ $req_path */index) login_user
perm_redirect `{echo $req_path | sed 's,/index$,/,'}
if(~ $local_path */) {
if(test -d $local_path)
local_path=$local_path^'index'
if not # XXX: This redir might step on apps with synthetic dirs.
perm_redirect `{echo $req_path|sed 's,/+$,,'}
}
if not if(test -d $local_path)
perm_redirect $req_path^'/'
cd $sitedir
req_paths_list='/' # Note: req_paths_list doesn't include 'stnythetic' dirs.
conf_wd='/' # Used in config files to know where we are in the document tree.
if(test -f _werc/config)
. _werc/config
for(i in $args) {
conf_wd=$conf_wd^$i
req_paths_list=($req_paths_list $conf_wd)
if(test -d $i) {
conf_wd=$conf_wd^'/'
cd $i
if(test -f _werc/config)
. _werc/config
} }
}
cd $werc_root
# Redirections and other preprocessing if(~ $req_path */index)
if(~ $#redirectPermanent 1) { perm_redirect `{echo $req_path | sed 's,/index$,/,'}
perm_redirect $"redirectPermanent
} if(~ $local_path */) {
if not if(~ $#redirectPermanent 2) { if(test -d $local_path)
from='http://'^$SERVER_NAME^$req_path local_path=$local_path^'index'
to=`{echo $from|sed 's@'^$redirectPermanent(1)^'@'^$redirectPermanent(2)^'@'} if not # XXX: This redir might step on apps with synthetic dirs.
if(! ~ $to $from) perm_redirect `{echo $req_path|sed 's,/+$,,'}
perm_redirect $to }
if not if(test -d $local_path)
perm_redirect $base_url^$req_path^'/'
if(! ~ $#args 0)
pageTitle=`{ echo $args|sed -e 's/ / - /g' -e 's/_/ /g' }
cd $sitedir
req_paths_list='/' # Note: req_paths_list doesn't include 'stnythetic' dirs.
conf_wd='/' # Used in config files to know where we are in the document tree.
if(test -f _werc/config)
. _werc/config
for(i in $args) {
conf_wd=$conf_wd^$i
req_paths_list=($req_paths_list $conf_wd)
if(test -d $i) {
conf_wd=$conf_wd'/'
cd $i
if(test -f _werc/config)
. _werc/config
}
}
cd $werc_root
f=();t=()
for(i in $perm_redir_patterns) {
if(~ $#f 0)
f=$i
if not {
t=$i
from=$base_url^$req_path
to=`{ echo $from | sed 's!'$f'!'$t'!' }
if(! ~ $to $from)
perm_redirect $to
f=()
}
}
# Set Page title
if(~ $pageTitle '')
pageTitle=$siteTitle' '$siteSubTitle
if not
pageTitle=$"pageTitle' | '$"siteTitle' '$"siteSubTitle
setup_handlers
if(! ~ $#debug 0)
dprint $"SERVER_NAME^$"REQUEST_URI - $"HTTP_USER_AGENT - $"REQUEST_METHOD - $"handler_body_main - $"master_template
template $headers $master_template | awk_buffer
echo $res_tail
} }
# Set Page title werc_exec_request
if(~ $pageTitle '')
pageTitle=$siteTitle^' '^$siteSubTitle
if not
pageTitle=$"pageTitle^' | '^$"siteTitle^' '^$"siteSubTitle
setup_handlers
if(! ~ $#debug 0)
dprint ' '$"SERVER_NAME^$"REQUEST_URI' - '$"HTTP_USER_AGENT' - '$"REQUEST_METHOD' - '$"handler_body_main - $"master_template
template $headers $master_template | awk_buffer
echo $res_tail