]> git.plutz.net Git - cgilite/blob - cgilite.awk
debug function
[cgilite] / cgilite.awk
1 #!/bin/env awk -f
2
3 function PATH( str,    seg, out ) {
4   while ( str ) {
5     seg = str;
6     sub( /\/.*$/, "", seg);
7     sub( /^[^\/]*\//, "", str);
8  
9     if      ( seg == ".." )  sub(/\/[^\/]*\/?$/, "", out);
10     else if ( seg ~ /^\.?$/) sub(/\/?$/, "/", out);
11     else sub(/\/?$/, "/" seg, out);
12
13     if (seg == str) break;
14   }
15   if (!(str && out)) sub(/\/?$/,"/" out);
16   return out;
17 }
18
19 function HEX_DECODE( pfx, inp,    out, n, k ) {
20   k = length(pfx);
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);
40     inp = substr(inp, 3);
41   } else {
42     out = out inp;
43     break;
44   }
45   return out;
46 }
47
48 function HTML( text ) {
49   gsub( /&/,  "\\&",  text );
50   gsub( /</,  "\\&lt;",   text );
51   gsub( />/,  "\\&gt;",   text );
52   gsub( /"/,  "\\&quot;", text );
53   gsub( /'/,  "\\&#x27;", text );
54   gsub( /\[/, "\\&#x5B;", text );
55   gsub( /\]/, "\\&#x5D;", text );
56   gsub( /\r/, "\\&#x0D;", text );
57   gsub( /\n/, "\\&#x0A;", text );
58   gsub( /\\/, "\\&#x5C;", text );
59   return text;
60 }
61
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 );
77   return text;
78 }
79
80 function _cgilite_urldecode( str, arr, spl,   form, k, n, key) {
81   if (! spl) spl="&"
82   split(str, form, spl);
83   for ( k in form ) {
84     key = form[k]; sub(/=.*$/, "", key);
85     sub(/^[^=]*=/, "", form[k]);
86     if ( key in arr ) {
87       n = 1; while ( (key, n) in arr ) n++;
88       arr[key,n] = HEX_DECODE( "%", form[k]);
89     } else {
90       arr[key] = HEX_DECODE( "%", form[k]);
91     }
92   }
93 }
94
95 function _cgilite_request(    key, val) {
96   # Read request from client connection
97
98   # Read Headers
99   getline; REQUEST_METHOD = $1; REQUEST_URI = $2; SERVER_PROTOCOL = $3;
100   while ( getline ) {
101     if ($0 ~ /^\r?$/) break;
102     else if ($0 ~ /^[a-zA-Z][0-9a-zA-Z_-]+: .*/) {
103       key = toupper($0);
104       sub(/:.*$/, "", key);
105       gsub(/-/, "_", key);
106       _HEADER[key] = $0;
107       sub(/^[^:]:[\t ]*/, "", _HEADER[key]);
108       sub(/[\t ]*\r?$/, "", _HEADER[key]);
109     }
110   }
111   CONTENT_LENGTH = _HEADER["CONTENT_LENGTH"];
112   CONTENT_TYPE   = _HEADER["CONTENT_TYPE"];
113
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 = "";
118
119   # Set up _GET[]-Array
120   _cgilite_urldecode(QUERY_STRING, _GET);
121
122   if ( _HEADER["CONTENT_TYPE"] == "application/x-www-form-urlencoded" \
123        && _HEADER["CONTENT_LENGTH"] ) {
124     # Set up _POST[]-Array
125
126     val = ""; key = "head -c " _HEADER["CONTENT_LENGTH"];
127     while (key |getline) val = val $0; close(key);
128     _cgilite_urldecode(val, _POST);
129   }
130
131   if ( _HEADER["COOKIE"] ) {
132     # Set up _COOKIE[]-Array
133     _cgilite_urldecode(_HEADER["COOKIE"], _COOKIE, "; ?");
134   }
135
136   if ( _HEADER["REFERER"] ) {
137     key = HEADER["REFERER"];
138     if (! sub(/^[^\?]+?/, "", key)) key = ""
139     _cgilite_urldecode(key, _REF);
140   }
141
142 }
143
144 function _cgilite_headers() {
145   # Import request data from webserver environment variables
146 }
147
148 BEGIN {
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);
153
154   if ( ENVIRON["REQUEST_METHOD"] )
155     _cgilite_headers();
156   else
157     _cgilite_request();
158 }