|
|
|
@ -14,13 +14,13 @@ shopt -s lastpipe
|
|
|
|
|
# =============== |
|
|
|
|
|
|
|
|
|
# $1: Log file for redirecting stdout to |
|
|
|
|
function redirectStdout() { |
|
|
|
|
function redirect_stdout() { |
|
|
|
|
local output="$1"; |
|
|
|
|
[ -z "$output" ] && output="/dev/null"; |
|
|
|
|
|
|
|
|
|
exec 5<&1; |
|
|
|
|
_exprashRedirectStdout="$output"; |
|
|
|
|
exec 1>>"$_exprashRedirectStdout"; |
|
|
|
|
_exprash_redirect_stdout="$output"; |
|
|
|
|
exec 1>>"$_exprash_redirect_stdout"; |
|
|
|
|
printf '%s: %s\n' "${REQUEST_METHOD:-UNKNOWN}" "${PATH_INFO:-/}" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -54,23 +54,23 @@ function delete() {
|
|
|
|
|
|
|
|
|
|
# $1: path |
|
|
|
|
function all() { |
|
|
|
|
[ "$_exprashRouteHandled" -eq 1 ] && return 1; |
|
|
|
|
[ -n "$_exprashErrorMessage" ] && return 1; |
|
|
|
|
[ "$_exprash_route_handled" -eq 1 ] && return 1; |
|
|
|
|
[ -n "$_exprash_error_message" ] && return 1; |
|
|
|
|
|
|
|
|
|
# Reset params |
|
|
|
|
_exprashParams=(); |
|
|
|
|
_exprash_params=(); |
|
|
|
|
|
|
|
|
|
_pathMatch "$1" _exprashParams || return 1; |
|
|
|
|
_exprashRouteHandled=1; |
|
|
|
|
_path_match "$1" _exprash_params || return 1; |
|
|
|
|
_exprash_route_handled=1; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function use() { |
|
|
|
|
[ "$_exprashRouteHandled" -eq 1 ] && return 1; |
|
|
|
|
[ -n "$_exprashErrorMessage" ] && return 1; |
|
|
|
|
[ "$_exprash_route_handled" -eq 1 ] && return 1; |
|
|
|
|
[ -n "$_exprash_error_message" ] && return 1; |
|
|
|
|
|
|
|
|
|
_exprashRouteHandled=1; |
|
|
|
|
_exprash_route_handled=1; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -79,48 +79,48 @@ function use() {
|
|
|
|
|
# ===================== |
|
|
|
|
|
|
|
|
|
# $1: path |
|
|
|
|
function getError() { |
|
|
|
|
function get_error() { |
|
|
|
|
[ "$REQUEST_METHOD" != "GET" ] && return 1; |
|
|
|
|
allError "$1"; |
|
|
|
|
all_error "$1"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: path |
|
|
|
|
function postError() { |
|
|
|
|
function post_error() { |
|
|
|
|
[ "$REQUEST_METHOD" != "POST" ] && return 1; |
|
|
|
|
allError "$1"; |
|
|
|
|
all_error "$1"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: path |
|
|
|
|
function putError() { |
|
|
|
|
function put_error() { |
|
|
|
|
[ "$REQUEST_METHOD" != "PUT" ] && return 1; |
|
|
|
|
allError "$1"; |
|
|
|
|
all_error "$1"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: path |
|
|
|
|
function deleteError() { |
|
|
|
|
function delete_error() { |
|
|
|
|
[ "$REQUEST_METHOD" != "DELETE" ] && return 1; |
|
|
|
|
allError "$1"; |
|
|
|
|
all_error "$1"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: path |
|
|
|
|
function allError() { |
|
|
|
|
[ "$_exprashRouteHandled" -eq 1 ] && return 1; |
|
|
|
|
[ -z "$_exprashErrorMessage" ] && return 1; |
|
|
|
|
function all_error() { |
|
|
|
|
[ "$_exprash_route_handled" -eq 1 ] && return 1; |
|
|
|
|
[ -z "$_exprash_error_message" ] && return 1; |
|
|
|
|
|
|
|
|
|
# Reset params |
|
|
|
|
_exprashParams=(); |
|
|
|
|
_exprash_params=(); |
|
|
|
|
|
|
|
|
|
_pathMatch "$1" _exprashParams || return 1; |
|
|
|
|
_exprashRouteHandled=1; |
|
|
|
|
_path_match "$1" _exprash_params || return 1; |
|
|
|
|
_exprash_route_handled=1; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function useError() { |
|
|
|
|
[ "$_exprashRouteHandled" -eq 1 ] && return 1; |
|
|
|
|
[ -z "$_exprashErrorMessage" ] && return 1; |
|
|
|
|
function use_error() { |
|
|
|
|
[ "$_exprash_route_handled" -eq 1 ] && return 1; |
|
|
|
|
[ -z "$_exprash_error_message" ] && return 1; |
|
|
|
|
|
|
|
|
|
_exprashRouteHandled=1; |
|
|
|
|
_exprash_route_handled=1; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -130,20 +130,20 @@ function useError() {
|
|
|
|
|
|
|
|
|
|
# $1 (optional): error message |
|
|
|
|
function next() { |
|
|
|
|
_exprashRouteHandled=0; |
|
|
|
|
[ -n "$1" ] && _exprashErrorMessage="$1"; |
|
|
|
|
_exprash_route_handled=0; |
|
|
|
|
[ -n "$1" ] && _exprash_error_message="$1"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# ============= |
|
|
|
|
# App Functions |
|
|
|
|
# ============= |
|
|
|
|
|
|
|
|
|
function errorMessage() { |
|
|
|
|
printf '%s' "$_exprashErrorMessage"; |
|
|
|
|
function get_error_message() { |
|
|
|
|
printf '%s' "$_exprash_error_message"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function hasErrorMessage() { |
|
|
|
|
[ -n "$_exprashErrorMessage" ]; |
|
|
|
|
function has_error_message() { |
|
|
|
|
[ -n "$_exprash_error_message" ]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# ================= |
|
|
|
@ -152,59 +152,60 @@ function hasErrorMessage() {
|
|
|
|
|
|
|
|
|
|
# $1: param name |
|
|
|
|
function param() { |
|
|
|
|
printf '%s\n' "${_exprashParams[$1]}"; |
|
|
|
|
printf '%s\n' "${_exprash_params[$1]}"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function hasParam() { |
|
|
|
|
[[ -v "_exprashParams[$1]" ]]; |
|
|
|
|
function has_param() { |
|
|
|
|
[[ -v "_exprash_params[$1]" ]]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: key |
|
|
|
|
# $2: (optional) index for accessing array parameters |
|
|
|
|
function query() { |
|
|
|
|
_multiGet _exprashQuery "$1" "$2" |
|
|
|
|
_multi_get _exprash_query "$1" "$2" |
|
|
|
|
} |
|
|
|
|
# $1: key |
|
|
|
|
function hasQuery() { |
|
|
|
|
_multiHas _exprashQuery "$1" |
|
|
|
|
function has_query() { |
|
|
|
|
_multi_has _exprash_query "$1" |
|
|
|
|
} |
|
|
|
|
# $1: key |
|
|
|
|
function lenQuery() { |
|
|
|
|
_multiLen _exprashQuery "$1" |
|
|
|
|
function len_query() { |
|
|
|
|
_multi_len _exprash_query "$1" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Call this function to parse URLencoded request bodies |
|
|
|
|
function useBody() { |
|
|
|
|
if [[ "${HTTP_CONTENT_TYPE,,}" == "application/x-www-form-urlencoded" ]]; then |
|
|
|
|
_parseUrlEncoded _exprashBody |
|
|
|
|
function use_body() { |
|
|
|
|
if [[ "${HTTP_CONTENT_TYPE,,}" == "application/x-www-form-urlencoded" ]]; |
|
|
|
|
then |
|
|
|
|
_parse_url_encoded _exprash_body |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
# $1: key |
|
|
|
|
# $2: (optional) index for accessing array parameters |
|
|
|
|
function body() { |
|
|
|
|
_multiGet _exprashBody "$1" "$2" |
|
|
|
|
_multi_get _exprash_body "$1" "$2" |
|
|
|
|
} |
|
|
|
|
# $1: key |
|
|
|
|
function hasBody() { |
|
|
|
|
_multiHas _exprashBody "$1" |
|
|
|
|
function has_body() { |
|
|
|
|
_multi_has _exprash_body "$1" |
|
|
|
|
} |
|
|
|
|
# $1: key |
|
|
|
|
function lenBody() { |
|
|
|
|
_multiLen _exprashBody "$1" |
|
|
|
|
function len_body() { |
|
|
|
|
_multi_len _exprash_body "$1" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: key |
|
|
|
|
function cookie() { |
|
|
|
|
printf '%s' "${_exprashCookies[$1]}" |
|
|
|
|
printf '%s' "${_exprash_cookies[$1]}" |
|
|
|
|
} |
|
|
|
|
# $1: key |
|
|
|
|
function hasCookie() { |
|
|
|
|
[[ -v "_exprashCookies[$1]" ]] |
|
|
|
|
function has_cookie() { |
|
|
|
|
[[ -v "_exprash_cookies[$1]" ]] |
|
|
|
|
} |
|
|
|
|
# $1: key |
|
|
|
|
# $2: value |
|
|
|
|
function setCookie() { |
|
|
|
|
_exprashSetCookies["$1"]="$2" |
|
|
|
|
function set_cookie() { |
|
|
|
|
_exprash_set_cookies["$1"]="$2" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# ================== |
|
|
|
@ -212,16 +213,16 @@ function setCookie() {
|
|
|
|
|
# ================== |
|
|
|
|
|
|
|
|
|
function send() { |
|
|
|
|
if [ "$_exprashHeadersSent" -eq 0 ]; then |
|
|
|
|
sendHeaders |
|
|
|
|
_exprashHeadersSent=1 |
|
|
|
|
if [ "$_exprash_headers_sent" -eq 0 ]; then |
|
|
|
|
send_headers |
|
|
|
|
_exprash_headers_sent=1 |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
_sendRaw |
|
|
|
|
_send_raw |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function sendJson() { |
|
|
|
|
setHeader 'Content-Type' 'application/json' |
|
|
|
|
function send_json() { |
|
|
|
|
set_header 'Content-Type' 'application/json' |
|
|
|
|
send |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -233,31 +234,34 @@ function redirect() {
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
status '302' |
|
|
|
|
setHeader 'Location' "$path" |
|
|
|
|
set_header 'Location' "$path" |
|
|
|
|
printf 'Redirecting to: %s' "$path" | send |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: satus code |
|
|
|
|
function status() { |
|
|
|
|
setHeader "Status" "$1" |
|
|
|
|
set_header "Status" "$1" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: Header Name |
|
|
|
|
# $2: Header Value |
|
|
|
|
function setHeader() { |
|
|
|
|
_exprashHeaders["$1"]="$2" |
|
|
|
|
function set_header() { |
|
|
|
|
_exprash_headers["$1"]="$2" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function sendHeaders() { |
|
|
|
|
printf '%s\n' "Content-Type: ${_exprashHeaders['Content-Type']}" | _sendRaw |
|
|
|
|
for key in "${!_exprashHeaders[@]}"; do |
|
|
|
|
function send_headers() { |
|
|
|
|
printf '%s\n' "Content-Type: ${_exprash_headers['Content-Type']}" | \ |
|
|
|
|
_send_raw |
|
|
|
|
for key in "${!_exprash_headers[@]}"; do |
|
|
|
|
[ "$key" == 'Content-Type' ] && continue |
|
|
|
|
printf '%s\n' "${key}: ${_exprashHeaders[$key]}" | _sendRaw |
|
|
|
|
printf '%s\n' "${key}: ${_exprash_headers[$key]}" | \ |
|
|
|
|
_send_raw |
|
|
|
|
done; |
|
|
|
|
for key in "${!_exprashSetCookies[@]}"; do |
|
|
|
|
printf '%s\n' "Set-Cookie: ${key}=${_exprashSetCookies[$key]}" | _sendRaw |
|
|
|
|
for key in "${!_exprash_set_cookies[@]}"; do |
|
|
|
|
printf '%s\n' "Set-Cookie: ${key}=${_exprash_set_cookies[$key]}" | \ |
|
|
|
|
_send_raw |
|
|
|
|
done; |
|
|
|
|
printf '\n' | _sendRaw |
|
|
|
|
printf '\n' | _send_raw |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -267,7 +271,7 @@ function sendHeaders() {
|
|
|
|
|
|
|
|
|
|
# Call this function to automatically manage sessions |
|
|
|
|
# $1: (optional) session dir, defaults to "session" in the current directory |
|
|
|
|
function useSession() { |
|
|
|
|
function use_session() { |
|
|
|
|
local session_dir=$1 |
|
|
|
|
|
|
|
|
|
# Create default session directory |
|
|
|
@ -277,10 +281,10 @@ function useSession() {
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
# Setup session globals |
|
|
|
|
_exprashUseSession=1 |
|
|
|
|
_exprashSessionDir=$session_dir |
|
|
|
|
_exprash_use_session=1 |
|
|
|
|
_exprash_session_dir=$session_dir |
|
|
|
|
|
|
|
|
|
_loadSession || _createSession || return 1 |
|
|
|
|
_load_session || _create_session || return 1 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Set a session variable |
|
|
|
@ -290,9 +294,9 @@ function session() {
|
|
|
|
|
local name="$1" |
|
|
|
|
if [[ -v 2 ]]; then |
|
|
|
|
local value="$2" |
|
|
|
|
_exprashSession["$name"]="$value" |
|
|
|
|
_exprash_session["$name"]="$value" |
|
|
|
|
else |
|
|
|
|
printf '%s' "${_exprashSession["$name"]}" |
|
|
|
|
printf '%s' "${_exprash_session["$name"]}" |
|
|
|
|
fi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -300,21 +304,21 @@ function session() {
|
|
|
|
|
# Internals |
|
|
|
|
# ========= |
|
|
|
|
|
|
|
|
|
function _sendRaw() { |
|
|
|
|
[ -n "$_exprashRedirectStdout" ] && exec >&5; |
|
|
|
|
function _send_raw() { |
|
|
|
|
[ -n "$_exprash_redirect_stdout" ] && exec >&5; |
|
|
|
|
cat; |
|
|
|
|
[ -n "$_exprashRedirectStdout" ] && exec 1>>"$_exprashRedirectStdout"; |
|
|
|
|
[ -n "$_exprash_redirect_stdout" ] && exec 1>>"$_exprash_redirect_stdout"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: path |
|
|
|
|
# $2: (nameref) array |
|
|
|
|
function _pathToArray() { |
|
|
|
|
function _path_to_array() { |
|
|
|
|
readarray -t "$2" < <(printf '%s\n' "$1" | tr '/' '\n' | grep .); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: route |
|
|
|
|
# $2: (nameref) associative array for params |
|
|
|
|
function _pathMatch() { |
|
|
|
|
function _path_match() { |
|
|
|
|
[ -z ${PATH_INFO+x} ] && return 1; |
|
|
|
|
[ -z ${1+x} ] && return 1; |
|
|
|
|
|
|
|
|
@ -322,33 +326,33 @@ function _pathMatch() {
|
|
|
|
|
local route="$1"; |
|
|
|
|
|
|
|
|
|
# Params associative array |
|
|
|
|
local -n routeParams="$2"; |
|
|
|
|
local -n route_params="$2"; |
|
|
|
|
|
|
|
|
|
local pathArr; |
|
|
|
|
_pathToArray "$path" pathArr; |
|
|
|
|
local path_arr; |
|
|
|
|
_path_to_array "$path" path_arr; |
|
|
|
|
|
|
|
|
|
local routeArr; |
|
|
|
|
_pathToArray "$route" routeArr; |
|
|
|
|
local route_arr; |
|
|
|
|
_path_to_array "$route" route_arr; |
|
|
|
|
|
|
|
|
|
# Get max path length |
|
|
|
|
local routeLen=${#routeArr[@]}; |
|
|
|
|
local pathLen=${#pathArr[@]}; |
|
|
|
|
local maxLen=$(( routeLen >= pathLen ? routeLen : pathLen )); |
|
|
|
|
local route_len=${#route_arr[@]}; |
|
|
|
|
local path_len=${#path_arr[@]}; |
|
|
|
|
local maxLen=$(( route_len >= path_len ? route_len : path_len )); |
|
|
|
|
|
|
|
|
|
for ((i=0; i<maxLen; i++)); do |
|
|
|
|
local routeComponent="${routeArr[$i]}"; |
|
|
|
|
local pathComponent="${pathArr[$i]}"; |
|
|
|
|
local route_component="${route_arr[$i]}"; |
|
|
|
|
local path_component="${path_arr[$i]}"; |
|
|
|
|
|
|
|
|
|
# If route component starts with ":" |
|
|
|
|
if [[ "$routeComponent" == :* ]] && [ -n "$pathComponent" ]; then |
|
|
|
|
routeParams["${routeComponent:1}"]="$pathComponent"; |
|
|
|
|
elif [[ "$routeComponent" == '*' ]] && [ -n "$pathComponent" ]; then |
|
|
|
|
if [[ "$route_component" == :* ]] && [ -n "$path_component" ]; then |
|
|
|
|
route_params["${route_component:1}"]="$path_component"; |
|
|
|
|
elif [[ "$route_component" == '*' ]] && [ -n "$path_component" ]; then |
|
|
|
|
continue; |
|
|
|
|
elif [[ "$routeComponent" == '**' ]] && [ -n "$pathComponent" ]; then |
|
|
|
|
elif [[ "$route_component" == '**' ]] && [ -n "$path_component" ]; then |
|
|
|
|
break; |
|
|
|
|
else |
|
|
|
|
# Confirm paths match |
|
|
|
|
[ "$routeComponent" != "$pathComponent" ] && return 1; |
|
|
|
|
[ "$route_component" != "$path_component" ] && return 1; |
|
|
|
|
fi; |
|
|
|
|
done; |
|
|
|
|
|
|
|
|
@ -362,24 +366,24 @@ function _pathMatch() {
|
|
|
|
|
# $1: (nameref) associative array |
|
|
|
|
# $2: key |
|
|
|
|
# $3: value |
|
|
|
|
function _multiAdd() { |
|
|
|
|
local -n multiArr="$1" |
|
|
|
|
function _multi_add() { |
|
|
|
|
local -n multi_arr="$1" |
|
|
|
|
local key="$2" |
|
|
|
|
local value="$3" |
|
|
|
|
local i=0 |
|
|
|
|
while [[ -v "multiArr[$i,$key]" ]]; do |
|
|
|
|
while [[ -v "multi_arr[$i,$key]" ]]; do |
|
|
|
|
(( i++ )) |
|
|
|
|
done |
|
|
|
|
multiArr["$i,$key"]="$value" |
|
|
|
|
multi_arr["$i,$key"]="$value" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: (nameref) associative array |
|
|
|
|
# $2: key |
|
|
|
|
function _multiLen() { |
|
|
|
|
local -n multiArr="$1" |
|
|
|
|
function _multi_len() { |
|
|
|
|
local -n multi_arr="$1" |
|
|
|
|
local key="$2" |
|
|
|
|
local i=0 |
|
|
|
|
while [[ -v "multiArr[$i,$key]" ]]; do |
|
|
|
|
while [[ -v "multi_arr[$i,$key]" ]]; do |
|
|
|
|
(( i++ )) |
|
|
|
|
done |
|
|
|
|
printf '%s' "$i" |
|
|
|
@ -387,20 +391,20 @@ function _multiLen() {
|
|
|
|
|
|
|
|
|
|
# $1: (nameref) associative array |
|
|
|
|
# $2: key |
|
|
|
|
function _multiHas() { |
|
|
|
|
local -n multiArr="$1" |
|
|
|
|
function _multi_has() { |
|
|
|
|
local -n multi_arr="$1" |
|
|
|
|
local key="$2" |
|
|
|
|
[[ -v "multiArr[0,$key]" ]] |
|
|
|
|
[[ -v "multi_arr[0,$key]" ]] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: (nameref) associative array |
|
|
|
|
# $2: key |
|
|
|
|
# $3: index |
|
|
|
|
function _multiGet() { |
|
|
|
|
local -n multiArr="$1" |
|
|
|
|
function _multi_get() { |
|
|
|
|
local -n multi_arr="$1" |
|
|
|
|
local key="$2" |
|
|
|
|
local i="${3:-0}"; |
|
|
|
|
printf '%s' "${multiArr[$i,$key]}" |
|
|
|
|
printf '%s' "${multi_arr[$i,$key]}" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# ================== |
|
|
|
@ -408,24 +412,24 @@ function _multiGet() {
|
|
|
|
|
# ================== |
|
|
|
|
|
|
|
|
|
# $1 | stdin: urlencoded string |
|
|
|
|
decodeUri () { |
|
|
|
|
local input_str="${1-"$(< /dev/stdin)"}" |
|
|
|
|
decode_uri () { |
|
|
|
|
local input_str="${1-"$(cat)"}" |
|
|
|
|
input_str="${input_str//+/ }"; |
|
|
|
|
echo -e "${input_str//%/\\x}"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# $1: (nameref) multi associative array |
|
|
|
|
# $2 | stdin: url encoded data |
|
|
|
|
function _parseUrlEncoded() { |
|
|
|
|
function _parse_url_encoded() { |
|
|
|
|
local -n parsedArr="$1" |
|
|
|
|
local url_encoded_str="${2-"$(< /dev/stdin)"}" |
|
|
|
|
local url_encoded_str="${2-"$(cat)"}" |
|
|
|
|
local pair name value |
|
|
|
|
|
|
|
|
|
while IFS= read -d '&' -r pair || [ "$pair" ]; do |
|
|
|
|
name=$(decodeUri "${pair%%=*}") |
|
|
|
|
value=$(decodeUri "${pair#*=}") |
|
|
|
|
name=$(decode_uri "${pair%%=*}") |
|
|
|
|
value=$(decode_uri "${pair#*=}") |
|
|
|
|
if [ -n "$name" ]; then |
|
|
|
|
_multiAdd parsedArr "$name" "$value" |
|
|
|
|
_multi_add parsedArr "$name" "$value" |
|
|
|
|
fi; |
|
|
|
|
done <<< "$url_encoded_str" |
|
|
|
|
} |
|
|
|
@ -436,15 +440,15 @@ function _parseUrlEncoded() {
|
|
|
|
|
|
|
|
|
|
# $1: (nameref) associative array |
|
|
|
|
# $2 | stdin: cookie string to parse |
|
|
|
|
function _parseCookies() { |
|
|
|
|
function _parse_cookies() { |
|
|
|
|
local -n parsedArr="$1" |
|
|
|
|
local cookie_str="${2-"$(< /dev/stdin)"}" |
|
|
|
|
|
|
|
|
|
local pair name value |
|
|
|
|
|
|
|
|
|
while IFS= read -d ';' -r pair || [ "$pair" ]; do |
|
|
|
|
name="$(_trim "${pair%%=*}" | decodeUri)" |
|
|
|
|
value="$(_trim "${pair#*=}" | decodeUri)" |
|
|
|
|
name="$(_trim "${pair%%=*}" | decode_uri)" |
|
|
|
|
value="$(_trim "${pair#*=}" | decode_uri)" |
|
|
|
|
if [ -n "$name" ]; then |
|
|
|
|
parsedArr["$name"]="$value" |
|
|
|
|
fi |
|
|
|
@ -455,29 +459,29 @@ function _parseCookies() {
|
|
|
|
|
# Session |
|
|
|
|
# ======= |
|
|
|
|
|
|
|
|
|
function _loadSession() { |
|
|
|
|
[ "$_exprashUseSession" -eq 1 ] || return 1 |
|
|
|
|
[ -n "$_exprashSessionDir" ] || return 1 |
|
|
|
|
hasCookie "$_exprashSessionCookieName" || return 1 |
|
|
|
|
function _load_session() { |
|
|
|
|
[ "$_exprash_use_session" -eq 1 ] || return 1 |
|
|
|
|
[ -n "$_exprash_session_dir" ] || return 1 |
|
|
|
|
has_cookie "$_exprash_session_cookie_name" || return 1 |
|
|
|
|
|
|
|
|
|
local session_id |
|
|
|
|
session_id="$(cookie "$_exprashSessionCookieName")" |
|
|
|
|
local session_file="${_exprashSessionDir%/}/$session_id.session" |
|
|
|
|
session_id="$(cookie "$_exprash_session_cookie_name")" |
|
|
|
|
local session_file="${_exprash_session_dir%/}/$session_id.session" |
|
|
|
|
|
|
|
|
|
# shellcheck disable=SC1090 |
|
|
|
|
source "$session_file" || return 1 |
|
|
|
|
|
|
|
|
|
# Set globals |
|
|
|
|
_exprashSessionId=$session_id |
|
|
|
|
_exprash_sessionId=$session_id |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function _createSession() { |
|
|
|
|
[ "$_exprashUseSession" -eq 1 ] || return 1 |
|
|
|
|
[ -n "$_exprashSessionDir" ] || return 1 |
|
|
|
|
function _create_session() { |
|
|
|
|
[ "$_exprash_use_session" -eq 1 ] || return 1 |
|
|
|
|
[ -n "$_exprash_session_dir" ] || return 1 |
|
|
|
|
|
|
|
|
|
# mktemp args |
|
|
|
|
local args=() |
|
|
|
|
args+=('-p' "$_exprashSessionDir") |
|
|
|
|
args+=('-p' "$_exprash_session_dir") |
|
|
|
|
args+=("$(printf 'X%.0s' {1..32}).session") |
|
|
|
|
|
|
|
|
|
local session_file |
|
|
|
@ -486,21 +490,21 @@ function _createSession() {
|
|
|
|
|
local session_id=${session_file_name%%.*} |
|
|
|
|
|
|
|
|
|
# Set cookie |
|
|
|
|
setCookie "$_exprashSessionCookieName" "$session_id" |
|
|
|
|
set_cookie "$_exprash_session_cookie_name" "$session_id" |
|
|
|
|
|
|
|
|
|
# Set globals |
|
|
|
|
_exprashSessionId=$session_id |
|
|
|
|
_exprashSession=() |
|
|
|
|
_exprash_sessionId=$session_id |
|
|
|
|
_exprash_session=() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function _saveSession() { |
|
|
|
|
[ "$_exprashUseSession" -eq 1 ] || return 1 |
|
|
|
|
[ -n "$_exprashSessionDir" ] || return 1 |
|
|
|
|
[ -n "$_exprashSessionId" ] || return 1 |
|
|
|
|
function _save_session() { |
|
|
|
|
[ "$_exprash_use_session" -eq 1 ] || return 1 |
|
|
|
|
[ -n "$_exprash_session_dir" ] || return 1 |
|
|
|
|
[ -n "$_exprash_sessionId" ] || return 1 |
|
|
|
|
|
|
|
|
|
local session_file="${_exprashSessionDir%/}/${_exprashSessionId}.session" |
|
|
|
|
local session_file="${_exprash_session_dir%/}/${_exprash_sessionId}.session" |
|
|
|
|
|
|
|
|
|
declare -p _exprashSession | sed '1 s/\([^-]*-\)/\1g/' > "$session_file" |
|
|
|
|
declare -p _exprash_session | sed '1 s/\([^-]*-\)/\1g/' > "$session_file" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# ================= |
|
|
|
@ -523,44 +527,44 @@ function _trim() {
|
|
|
|
|
# Shutdown |
|
|
|
|
# ======== |
|
|
|
|
|
|
|
|
|
function _exprashShutdown() { |
|
|
|
|
_saveSession |
|
|
|
|
function _exprash_shutdown() { |
|
|
|
|
_save_session |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# ============== |
|
|
|
|
# Initialization |
|
|
|
|
# ============== |
|
|
|
|
function _exprashInit() { |
|
|
|
|
_exprashRedirectStdout='' |
|
|
|
|
|
|
|
|
|
declare -gA _exprashParams=() |
|
|
|
|
declare -gA _exprashBody=() |
|
|
|
|
declare -gA _exprashQuery=() |
|
|
|
|
declare -gA _exprashHeaders=() |
|
|
|
|
declare -gA _exprashCookies=() |
|
|
|
|
declare -gA _exprashSetCookies=() |
|
|
|
|
|
|
|
|
|
_exprashUseSession=0 |
|
|
|
|
_exprashSessionDir='' |
|
|
|
|
_exprashSessionId='' |
|
|
|
|
declare -gA _exprashSession=() |
|
|
|
|
_exprashSessionCookieName='exprash_session' |
|
|
|
|
|
|
|
|
|
_exprashRouteHandled=0 |
|
|
|
|
_exprashErrorMessage='' |
|
|
|
|
_exprashHeadersSent=0 |
|
|
|
|
_exprashHeaders['Content-Type']='text/html' |
|
|
|
|
function _exprash_init() { |
|
|
|
|
_exprash_redirect_stdout='' |
|
|
|
|
|
|
|
|
|
declare -gA _exprash_params=() |
|
|
|
|
declare -gA _exprash_body=() |
|
|
|
|
declare -gA _exprash_query=() |
|
|
|
|
declare -gA _exprash_headers=() |
|
|
|
|
declare -gA _exprash_cookies=() |
|
|
|
|
declare -gA _exprash_set_cookies=() |
|
|
|
|
|
|
|
|
|
_exprash_use_session=0 |
|
|
|
|
_exprash_session_dir='' |
|
|
|
|
_exprash_sessionId='' |
|
|
|
|
declare -gA _exprash_session=() |
|
|
|
|
_exprash_session_cookie_name='exprash_session' |
|
|
|
|
|
|
|
|
|
_exprash_route_handled=0 |
|
|
|
|
_exprash_error_message='' |
|
|
|
|
_exprash_headers_sent=0 |
|
|
|
|
_exprash_headers['Content-Type']='text/html' |
|
|
|
|
|
|
|
|
|
# Parse query string |
|
|
|
|
_parseUrlEncoded _exprashQuery "$QUERY_STRING" |
|
|
|
|
_parse_url_encoded _exprash_query "$QUERY_STRING" |
|
|
|
|
|
|
|
|
|
# Parse cookies |
|
|
|
|
_parseCookies _exprashCookies "$HTTP_COOKIE" |
|
|
|
|
_parse_cookies _exprash_cookies "$HTTP_COOKIE" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# Shutdown trap |
|
|
|
|
trap _exprashShutdown EXIT |
|
|
|
|
trap _exprash_shutdown EXIT |
|
|
|
|
|
|
|
|
|
# Initialize exprash |
|
|
|
|
_exprashInit |
|
|
|
|
_exprash_init |
|
|
|
|
|
|
|
|
|