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:
parent
2ee4609eb1
commit
590816c6d4
1 changed files with 91 additions and 74 deletions
165
bin/werc.rc
165
bin/werc.rc
|
|
@ -6,23 +6,30 @@ forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]'
|
|||
|
||||
# Expected input: ls -F style, $sitedir/path/to/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)$//; '
|
||||
|
||||
# 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 $*)
|
||||
dirfilter=$dirfilter^'/^'$i'$/d; '
|
||||
}
|
||||
|
||||
# Sidebar
|
||||
# Standard handlers
|
||||
fn nav_tree {
|
||||
if(! ~ $#sideBarNavTitle 0)
|
||||
echo '<p class="sideBarTitle">'$"sideBarNavTitle':</p>'
|
||||
# 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
|
||||
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/ '
|
||||
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 tpl_handler { template $* }
|
||||
|
|
@ -77,6 +83,12 @@ fn dir_listing_handler {
|
|||
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 {
|
||||
|
||||
if(test -f $local_path.md)
|
||||
|
|
@ -133,13 +145,6 @@ sitesdir=sites
|
|||
for(i in siteTitle siteSubTitle pageTitle extraHeaders)
|
||||
$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
|
||||
|
||||
if(test -f etc/initrc.local)
|
||||
|
|
@ -148,71 +153,83 @@ if(test -f etc/initrc.local)
|
|||
for(a in $werc_apps)
|
||||
. ./$a/app.rc
|
||||
|
||||
# Parse request URL
|
||||
# NOTE: $REQUEST_URI is not officially in CGI 1.1, but seems to be de-facto
|
||||
req_path=`{echo -n $REQUEST_URI | sed 's/\?.*//; s/'^$forbidden_uri_chars^'//g; s/\.\.*/./g; 1q'}
|
||||
local_path=$sitedir$req_path
|
||||
ifs='/' { args=`{echo -n $req_path} }
|
||||
fn werc_exec_request {
|
||||
site=$SERVER_NAME
|
||||
base_url=http://$site
|
||||
sitedir=$sitesdir/$site
|
||||
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
|
||||
if(~ $REQUEST_METHOD POST) {
|
||||
load_post_args
|
||||
login_user
|
||||
}
|
||||
# Note: $REQUEST_URI is not officially in CGI 1.1, but seems to be de-facto
|
||||
req_path=`{echo -n $REQUEST_URI | sed 's/\?.*//; s!//+!/!g; s/'^$forbidden_uri_chars^'//g; s/\.\.*/./g; 1q'}
|
||||
local_path=$sitedir$req_path
|
||||
ifs='/' { args=`{echo -n $req_path} }
|
||||
|
||||
if(! ~ $#args 0)
|
||||
pageTitle=`{ echo $args|sed -e 's/ / - /g' -e 's/_/ /g' }
|
||||
|
||||
if(~ $req_path */index)
|
||||
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
|
||||
# Preload post args for templates where cgi's stdin is not accessible
|
||||
if(~ $REQUEST_METHOD POST) {
|
||||
load_post_args
|
||||
login_user
|
||||
}
|
||||
}
|
||||
cd $werc_root
|
||||
|
||||
# Redirections and other preprocessing
|
||||
if(~ $#redirectPermanent 1) {
|
||||
perm_redirect $"redirectPermanent
|
||||
}
|
||||
if not if(~ $#redirectPermanent 2) {
|
||||
from='http://'^$SERVER_NAME^$req_path
|
||||
to=`{echo $from|sed 's@'^$redirectPermanent(1)^'@'^$redirectPermanent(2)^'@'}
|
||||
if(! ~ $to $from)
|
||||
perm_redirect $to
|
||||
if(~ $req_path */index)
|
||||
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 $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
|
||||
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
|
||||
werc_exec_request
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue