5 Partly adopted from Steven Grimm's uncgi tool and library.
\r
7 Extension module for the rfxswf library.
\r
8 Part of the swftools package.
\r
10 Copyright (c) 2001 Rainer Böhme <rfxswf@reflex-studio.de>
\r
12 This file is distributed under the GPL, see file COPYING for details
\r
17 #define ishex(x) (((x) >= '0' && (x) <= '9') || ((x) >= 'a' && (x) <= 'f') || ((x) >= 'A' && (x) <= 'F'))
\r
19 #define PREFIX "WWW_"
\r
21 static int htoi(unsigned char * s)
\r
26 if (isupper(c)) c = tolower(c);
\r
27 value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
\r
30 if (isupper(c)) c = tolower(c);
\r
31 value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;
\r
36 static void url_unescape(unsigned char * s)
\r
37 { unsigned char *dest = s;
\r
40 { if (s[0] == '+') dest[0] = ' ';
\r
42 { if (s[0] == '%' && ishex(s[1]) && ishex(s[2]))
\r
43 { dest[0] = (unsigned char) htoi(s + 1);
\r
46 else dest[0] = s[0];
\r
53 static void cgienv(unsigned char * var)
\r
54 { unsigned char *buf, *c, *s, *t, *oldval = NULL, *newval;
\r
55 int despace = 0, got_cr = 0;
\r
57 // fprintf(stderr,"%s\n",var);
\r
59 // fprintf(stderr,"%s\n",var);
\r
62 buf = (unsigned char*)malloc(strlen(var) + sizeof(PREFIX) + 2);
\r
65 strcpy(buf, PREFIX);
\r
67 { strcpy(&buf[sizeof(PREFIX)-1], &var[1]);
\r
70 else strcpy(&buf[sizeof(PREFIX)-1], var);
\r
72 for (c = buf; c[0] ; c++)
\r
73 { if (c[0] == '.') c[0] = '_';
\r
74 if (c[0] == '=') break;
\r
76 if (!c[0]) c[1] = 0;
\r
79 if (despace && c[1])
\r
80 { for (s = c+1; s[0] && isspace(s[0]); s++);
\r
95 while (t > c && isspace(*--t));
\r
99 if ((oldval = getenv(buf)))
\r
100 { newval = (unsigned char*)malloc(strlen(oldval) + strlen(buf) + strlen(&c[1]) + 3);
\r
101 if (!newval) return;
\r
104 sprintf(newval, "%s#%s", buf, oldval);
\r
107 oldval -= strlen(buf) + 1; // skip past VAR=
\r
122 static void scanquery(char * q)
\r
127 { next = strchr(q, '&');
\r
128 if (next) next[0] = 0;
\r
138 { char * buf = NULL;
\r
139 int size = 0, sofar = 0, got;
\r
141 buf = getenv("CONTENT_TYPE");
\r
142 if ((!buf) || strcmp(buf, "application/x-www-form-urlencoded")) return NULL;
\r
144 buf = getenv("CONTENT_LENGTH");
\r
145 if (!buf) return NULL;
\r
148 buf = (unsigned char*)malloc(size + 1);
\r
151 { got = fread(buf + sofar, 1, size - sofar, stdin);
\r
153 } while (got && sofar < size);
\r
161 { char *query, *dupquery, *method;
\r
163 query = getenv("QUERY_STRING");
\r
164 if ((query) && strlen(query))
\r
165 { dupquery = strdup(query);
\r
166 scanquery(dupquery);
\r
170 method = getenv("REQUEST_METHOD");
\r
171 if ((method) && ! strcmp(method, "POST"))
\r
172 { query = postread();
\r
173 if ((query)&&(query[0]!=0)) scanquery(query);
\r