3 function debug(t) { printf "%s\n", t >>"/dev/stderr"; }
5 function PATH( str, seg, out ) {
8 sub( /\/.*$/, "", seg);
9 sub( /^[^\/]*\//, "", str);
11 if ( seg == ".." ) sub(/\/[^\/]*\/?$/, "", out);
12 else if ( seg ~ /^\.?$/) sub(/\/?$/, "/", out);
13 else sub(/\/?$/, "/" seg, out);
15 if (seg == str) break;
17 if (!(str && out)) sub(/\/?$/,"/" out);
21 function HEX_DECODE( pfx, inp, out, n, k ) {
23 gsub(/[].*+?^${}()|\\[]/,"\\\\&",pfx);
24 while ( inp ) if ( n = match(inp, pfx "[0-9a-fA-F][0-9a-fA-F]") ) {
25 out = out substr(inp, 1, n - 1);
26 inp = substr(inp, n + k);
27 if (inp ~ /^[0-9]/) n = 16 * substr(inp, 1, 1);
28 else if (inp ~ /^[aA]/) n = 160;
29 else if (inp ~ /^[bB]/) n = 176;
30 else if (inp ~ /^[cC]/) n = 192;
31 else if (inp ~ /^[dD]/) n = 208;
32 else if (inp ~ /^[eE]/) n = 224;
33 else if (inp ~ /^[fF]/) n = 240;
34 if (inp ~ /^.[0-9]/) n += substr(inp, 2, 1);
35 else if (inp ~ /^.[aA]/) n += 10;
36 else if (inp ~ /^.[bB]/) n += 11;
37 else if (inp ~ /^.[cC]/) n += 12;
38 else if (inp ~ /^.[dD]/) n += 13;
39 else if (inp ~ /^.[eE]/) n += 14;
40 else if (inp ~ /^.[fF]/) n += 15;
41 out = out sprintf("%c", n);
50 function HTML( text ) {
51 gsub( /&/, "\\&", text );
52 gsub( /</, "\\<", text );
53 gsub( />/, "\\>", text );
54 gsub( /"/, "\\"", text );
55 gsub( /'/, "\\'", text );
56 gsub( /\[/, "\\[", text );
57 gsub( /\]/, "\\]", text );
58 gsub( /\r/, "\\
", text );
59 gsub( /\n/, "\\
", text );
60 gsub( /\\/, "\\\", text );
64 function URL( text ) {
65 gsub( /&/, "%26", text );
66 gsub( /"/, "%22", text );
67 gsub( /'/, "%27", text );
68 gsub( /`/, "%60", text );
69 gsub( /\?/, "%3F", text );
70 gsub( /#/, "%23", text );
71 gsub( /\[/, "%5B", text );
72 gsub( /\]/, "%5D", text );
73 gsub( / /, "%20", text );
74 gsub( /\t/, "%09", text );
75 gsub( /\r/, "%0D", text );
76 gsub( /\n/, "%0A", text );
77 gsub( /%/, "%25", text );
78 gsub( /\\/, "%5C", text );
82 function _cgilite_urldecode( str, arr, spl, form, k, n, key) {
84 split(str, form, spl);
86 key = form[k]; sub(/=.*$/, "", key);
87 sub(/^[^=]*=/, "", form[k]);
89 n = 1; while ( (key, n) in arr ) n++;
90 arr[key,n] = HEX_DECODE( "%", form[k]);
92 arr[key] = HEX_DECODE( "%", form[k]);
97 function _cgilite_request( key, val) {
98 # Read request from client connection
101 getline; REQUEST_METHOD = $1; REQUEST_URI = $2; SERVER_PROTOCOL = $3;
103 if ($0 ~ /^\r?$/) break;
104 else if ($0 ~ /^[a-zA-Z][0-9a-zA-Z_-]+: .*/) {
106 sub(/:.*$/, "", key);
109 sub(/^[^:]:[\t ]*/, "", _HEADER[key]);
110 sub(/[\t ]*\r?$/, "", _HEADER[key]);
113 CONTENT_LENGTH = _HEADER["CONTENT_LENGTH"];
114 CONTENT_TYPE = _HEADER["CONTENT_TYPE"];
116 PATH_INFO = REQUEST_URI; gsub(/\?.*$/, "", PATH_INFO)
117 PATH_INFO = PATH( HEX_DECODE( "%", PATH_INFO ) );
118 QUERY_STRING = REQUEST_URI;
119 if ( !gsub(/^[^?]+\?/, "", QUERY_STRING) ) QUERY_STRING = "";
121 # Set up _GET[]-Array
122 _cgilite_urldecode(QUERY_STRING, _GET);
124 if ( _HEADER["CONTENT_TYPE"] == "application/x-www-form-urlencoded" \
125 && _HEADER["CONTENT_LENGTH"] ) {
126 # Set up _POST[]-Array
128 val = ""; key = "head -c " _HEADER["CONTENT_LENGTH"];
129 while (key |getline) val = val $0; close(key);
130 _cgilite_urldecode(val, _POST);
133 if ( _HEADER["COOKIE"] ) {
134 # Set up _COOKIE[]-Array
135 _cgilite_urldecode(_HEADER["COOKIE"], _COOKIE, "; ?");
138 if ( _HEADER["REFERER"] ) {
139 key = HEADER["REFERER"];
140 if (! sub(/^[^\?]+?/, "", key)) key = ""
141 _cgilite_urldecode(key, _REF);
146 function _cgilite_headers() {
147 # Import request data from webserver environment variables
151 REQUEST_METHOD=""; REQUEST_URI=""; SERVER_PROTOCOL="";
152 PATH_INFO=""; QUERY_STRING=""; CONTENT_LENGTH=""; CONTENT_TYPE="";
153 split("", _GET); split("", _POST); split("", _REF);
154 split("", _HEADER); split("", _COOKIE);
156 if ( ENVIRON["REQUEST_METHOD"] ) {