3 function PATH( str, seg, out ) {
6 sub( /\/.*$/, "", seg);
7 sub( /^[^\/]*\//, "", str);
9 if ( seg == ".." ) sub(/\/[^\/]*\/?$/, "", out);
10 else if ( seg ~ /^\.?$/) sub(/\/?$/, "/", out);
11 else sub(/\/?$/, "/" seg, out);
13 if (seg == str) break;
15 if (!(str && out)) sub(/\/?$/,"/" out);
19 function HEX_DECODE( pfx, inp, out, n, k ) {
21 gsub(/[].*+?^${}()|\\[]/,"\\\\&",pfx);
22 while ( inp ) if ( n = match(inp, pfx "[0-9a-fA-F][0-9a-fA-F]") ) {
23 out = out substr(inp, 1, n - 1);
24 inp = substr(inp, n + k);
25 if (inp ~ /^[0-9]/) n = 16 * substr(inp, 1, 1);
26 else if (inp ~ /^[aA]/) n = 160;
27 else if (inp ~ /^[bB]/) n = 176;
28 else if (inp ~ /^[cC]/) n = 192;
29 else if (inp ~ /^[dD]/) n = 208;
30 else if (inp ~ /^[eE]/) n = 224;
31 else if (inp ~ /^[fF]/) n = 240;
32 if (inp ~ /^.[0-9]/) n += substr(inp, 2, 1);
33 else if (inp ~ /^.[aA]/) n += 10;
34 else if (inp ~ /^.[bB]/) n += 11;
35 else if (inp ~ /^.[cC]/) n += 12;
36 else if (inp ~ /^.[dD]/) n += 13;
37 else if (inp ~ /^.[eE]/) n += 14;
38 else if (inp ~ /^.[fF]/) n += 15;
39 out = out sprintf("%c", n);
48 function HTML( text ) {
49 gsub( /&/, "\\&", text );
50 gsub( /</, "\\<", text );
51 gsub( />/, "\\>", text );
52 gsub( /"/, "\\"", text );
53 gsub( /'/, "\\'", text );
54 gsub( /\[/, "\\[", text );
55 gsub( /\]/, "\\]", text );
56 gsub( /\r/, "\\
", text );
57 gsub( /\n/, "\\
", text );
58 gsub( /\\/, "\\\", text );
62 function URL( text ) {
63 gsub( /&/, "%26", text );
64 gsub( /"/, "%22", text );
65 gsub( /'/, "%27", text );
66 gsub( /`/, "%60", text );
67 gsub( /\?/, "%3F", text );
68 gsub( /#/, "%23", text );
69 gsub( /\[/, "%5B", text );
70 gsub( /\]/, "%5D", text );
71 gsub( / /, "%20", text );
72 gsub( /\t/, "%09", text );
73 gsub( /\r/, "%0D", text );
74 gsub( /\n/, "%0A", text );
75 gsub( /%/, "%25", text );
76 gsub( /\\/, "%5C", text );
80 function _cgilite_urldecode( str, arr, spl, form, k, n, key) {
82 split(str, form, spl);
84 key = form[k]; sub(/=.*$/, "", key);
85 sub(/^[^=]*=/, "", form[k]);
87 n = 1; while ( (key, n) in arr ) n++;
88 arr[key,n] = HEX_DECODE( "%", form[k]);
90 arr[key] = HEX_DECODE( "%", form[k]);
95 function _cgilite_request( key, val) {
96 # Read request from client connection
99 getline; REQUEST_METHOD = $1; REQUEST_URI = $2; SERVER_PROTOCOL = $3;
101 if ($0 ~ /^\r?$/) break;
102 else if ($0 ~ /^[a-zA-Z][0-9a-zA-Z_-]+: .*/) {
104 sub(/:.*$/, "", key);
107 sub(/^[^:]:[\t ]*/, "", _HEADER[key]);
108 sub(/[\t ]*\r?$/, "", _HEADER[key]);
111 CONTENT_LENGTH = _HEADER["CONTENT_LENGTH"];
112 CONTENT_TYPE = _HEADER["CONTENT_TYPE"];
114 PATH_INFO = REQUEST_URI; gsub(/\?.*$/, "", PATH_INFO)
115 PATH_INFO = PATH( HEX_DECODE( "%", PATH_INFO ) );
116 QUERY_STRING = REQUEST_URI;
117 if ( !gsub(/^[^?]+\?/, "", QUERY_STRING) ) QUERY_STRING = "";
119 # Set up _GET[]-Array
120 _cgilite_urldecode(QUERY_STRING, _GET);
122 if ( _HEADER["CONTENT_TYPE"] == "application/x-www-form-urlencoded" \
123 && _HEADER["CONTENT_LENGTH"] ) {
124 # Set up _POST[]-Array
126 val = ""; key = "head -c " _HEADER["CONTENT_LENGTH"];
127 while (key |getline) val = val $0; close(key);
128 _cgilite_urldecode(val, _POST);
131 if ( _HEADER["COOKIE"] ) {
132 # Set up _COOKIE[]-Array
133 _cgilite_urldecode(_HEADER["COOKIE"], _COOKIE, "; ?");
136 if ( _HEADER["REFERER"] ) {
137 key = HEADER["REFERER"];
138 if (! sub(/^[^\?]+?/, "", key)) key = ""
139 _cgilite_urldecode(key, _REF);
144 function _cgilite_headers() {
145 # Import request data from webserver environment variables
149 REQUEST_METHOD=""; REQUEST_URI=""; SERVER_PROTOCOL="";
150 PATH_INFO=""; QUERY_STRING=""; CONTENT_LENGTH=""; CONTENT_TYPE="";
151 split("", _GET); split("", _POST); split("", _REF);
152 split("", _HEADER); split("", _COOKIE);
154 if ( ENVIRON["REQUEST_METHOD"] )