@@ -8,6 +8,7 @@ declare -A QUERY_PARAMS
88declare -A FORM_DATA
99declare -A PATH_VARS
1010declare -A COOKIES
11+ declare -A SESSION
1112
1213[[ -f ' config.sh' ]] && source config.sh
1314
@@ -28,6 +29,9 @@ respond() {
2829 shift
2930 printf " HTTP/1.1 %s %s\r\n" " $CODE " " $* "
3031 header Server " bash-stack ${VERSION:- devbuild} "
32+ [[ ! -z " $SESSION_HEADER_TO_BE_WRITTEN " ]] && \
33+ printf " %s" " $SESSION_HEADER_TO_BE_WRITTEN "
34+
3135}
3236
3337end_headers () {
@@ -64,6 +68,39 @@ urldecode() {
6468 printf ' %b\n' " ${_//%/ \\ x} "
6569}
6670
71+ function create_or_resume_session() {
72+ local KEY
73+ local VAL
74+ if [[ -z " ${COOKIES[_session]} " ]]; then
75+ SESSION_ID=" $( tr -dc A-Za-z0-9 < /dev/urandom | head -c 32 ; echo ' ' ) "
76+ SESSION_HEADER_TO_BE_WRITTEN=$( header Set-Cookie " _session=$SESSION_ID ; Path=/; Secure; HttpOnly" )
77+ else
78+ SESSION_ID=$( echo " ${COOKIES[_session]} " | tr -dc A-Za-z0-9)
79+ fi
80+ if [[ -f " sessions/$SESSION_ID " ]]; then
81+ while IFS= read -r line; do
82+ KEY=" $( echo " $line " | cut -f1) "
83+ VAL=" $( echo " $line " | cut -f2-) "
84+ SESSION[" $KEY " ]=" $VAL "
85+ done < " sessions/$SESSION_ID "
86+ fi
87+ }
88+
89+ function save_session() {
90+ if [[ " ${ENABLE_SESSIONS:- false} " != true ]]; then
91+ debug " Error: You must set ENABLE_SESSIONS=true before calling save_session!"
92+ return
93+ fi
94+ local KEY
95+ if [[ -z " $SESSION_ID " ]]; then
96+ return
97+ fi
98+ touch " sessions/$SESSION_ID "
99+ for KEY in ${! SESSION[@]} ; do
100+ printf " %s\t%s\n" " $KEY " " ${SESSION[$KEY]} "
101+ done > " sessions/$SESSION_ID "
102+ }
103+
67104function _inject_hmr() {
68105 if [[ -z " $USE_HMR " ]]; then
69106 return
@@ -348,6 +385,9 @@ writeHttpResponse() {
348385 return
349386 fi
350387 matchRoute " $REQUEST_PATH "
388+
389+ [[ " ${ENABLE_SESSIONS:- false} " == " true" ]] && create_or_resume_session
390+
351391 if [[ ! -z " $USE_HMR " ]] && [[ " $REQUEST_PATH " == " /hmr" ]]; then
352392 if [[ " $REQUEST_METHOD " == " POST" ]]; then
353393 respond 204 OK
@@ -391,6 +431,7 @@ writeHttpResponse() {
391431 return
392432 fi
393433
434+
394435 if directive_test=$( head -1 " pages/${ROUTE_SCRIPT} " ) ; then
395436 if [[ " $directive_test " == " # sse" ]]; then
396437 respond 200 OK
@@ -550,6 +591,7 @@ export -f findPredefinedRoutes
550591export -f findDynamicRoutes
551592export -f findCatchAllRoutes
552593export -f matchRoute
594+ export -f save_session
553595
554596parseHttpRequest
555597writeHttpResponse
0 commit comments