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