Patch from Scott McKellar:
[OpenSRF.git] / src / gateway / apachetools.c
1 #include "apachetools.h"
2
3 osrfStringArray* apacheParseParms(request_rec* r) {
4
5         if( r == NULL ) return NULL;
6
7         char* arg = NULL;
8         apr_pool_t *p = r->pool;        /* memory pool */
9
10         /* gather the post args and append them to the url query string */
11         if( !strcmp(r->method,"POST") ) {
12
13                 ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
14                 
15                 osrfLogDebug(OSRF_LOG_MARK, "gateway reading post data..");
16
17                 if(ap_should_client_block(r)) {
18
19                         growing_buffer* buffer = buffer_init(1025);
20
21                         /* Start with url query string, if any */
22                         
23                         if(r->args && r->args[0])
24                                 buffer_add(buffer, r->args);
25
26                         char body[1025];
27
28                         osrfLogDebug(OSRF_LOG_MARK, "gateway client has post data, reading...");
29
30                         /* Append POST data */
31                         
32                         long bread;
33                         while( (bread = ap_get_client_block(r, body, sizeof(body) - 1)) ) {
34
35                                 if(bread < 0) {
36                                         osrfLogInfo(OSRF_LOG_MARK, 
37                                                 "ap_get_client_block(): returned error, exiting POST reader");
38                                         break;
39                                 }
40
41                                 body[bread] = '\0';
42                                 buffer_add( buffer, body );
43
44                                 osrfLogDebug(OSRF_LOG_MARK, 
45                                         "gateway read %ld bytes: %d bytes of data so far", bread, buffer->n_used);
46
47                                 if(buffer->n_used > APACHE_TOOLS_MAX_POST_SIZE) {
48                                         osrfLogError(OSRF_LOG_MARK, "gateway received POST larger "
49                                                 "than %d bytes. dropping request", APACHE_TOOLS_MAX_POST_SIZE);
50                                         buffer_free(buffer);
51                                         return NULL;
52                                 }
53                         }
54
55                         osrfLogDebug(OSRF_LOG_MARK, "gateway done reading post data");
56         
57                         if(buffer->n_used > 0)
58                                 arg = apr_pstrdup(p, buffer->buf);
59                         else
60                                 arg = NULL; 
61
62                         buffer_free(buffer);
63                 }
64         } 
65
66
67         osrfLogDebug(OSRF_LOG_MARK, "gateway done mangling post data");
68
69         if( !arg || !arg[0] ) { /* we received no request */
70                 return NULL;
71         }
72
73         osrfLogDebug(OSRF_LOG_MARK, "parsing URL params from post/get request data: %s", arg);
74         
75         osrfStringArray* sarray         = osrfNewStringArray(12); /* method parameters */
76         int sanity = 0;
77         char* key                                       = NULL; /* query item name */
78         char* val                                       = NULL; /* query item value */
79
80         /* Parse the post/get request data into a series of name/value pairs.   */
81         /* Load each name into an even-numbered slot of an osrfStringArray, and */
82         /* the corresponding value into the following odd-numbered slot.        */
83
84         while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
85
86                 key = ap_getword(r->pool, (const char**) &val, '=');
87                 if(!key || !key[0])
88                         break;
89
90                 ap_unescape_url(key);
91                 ap_unescape_url(val);
92
93                 osrfLogDebug(OSRF_LOG_MARK, "parsed URL params %s=%s", key, val);
94
95                 osrfStringArrayAdd(sarray, key);
96                 osrfStringArrayAdd(sarray, val);
97
98                 if( sanity++ > 1000 ) {
99                         osrfLogError(OSRF_LOG_MARK, 
100                                 "Parsing URL params failed sanity check: 1000 iterations");
101                         osrfStringArrayFree(sarray);
102                         return NULL;
103                 }
104
105         }
106
107         osrfLogDebug(OSRF_LOG_MARK,
108                 "Apache tools parsed %d params key/values", sarray->size / 2 );
109
110         return sarray;
111 }
112
113
114
115 osrfStringArray* apacheGetParamKeys(osrfStringArray* params) {
116         if(params == NULL) return NULL; 
117         osrfStringArray* sarray = osrfNewStringArray(12);
118         int i;
119         osrfLogDebug(OSRF_LOG_MARK, "Fetching URL param keys");
120         for( i = 0; i < params->size; i++ ) 
121                 osrfStringArrayAdd(sarray, osrfStringArrayGetString(params, i++));
122         return sarray;
123 }
124
125 osrfStringArray* apacheGetParamValues(osrfStringArray* params, char* key) {
126
127         if(params == NULL || key == NULL) return NULL;  
128         osrfStringArray* sarray = osrfNewStringArray(12);
129
130         osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
131         int i;
132         for( i = 0; i < params->size; i++ ) {
133                 char* nkey = osrfStringArrayGetString(params, i++);
134                 if(key && !strcmp(nkey, key)) 
135                         osrfStringArrayAdd(sarray, osrfStringArrayGetString(params, i));
136         }
137         return sarray;
138 }
139
140
141 char* apacheGetFirstParamValue(osrfStringArray* params, char* key) {
142         if(params == NULL || key == NULL) return NULL;  
143
144         int i;
145         osrfLogDebug(OSRF_LOG_MARK, "Fetching first URL value for key %s", key);
146         for( i = 0; i < params->size; i++ ) {
147                 char* nkey = osrfStringArrayGetString(params, i++);
148                 if(key && !strcmp(nkey, key)) 
149                         return strdup(osrfStringArrayGetString(params, i));
150         }
151
152         return NULL;
153 }
154
155
156 int apacheDebug( char* msg, ... ) {
157         VA_LIST_TO_STRING(msg);
158         fprintf(stderr, "%s\n", VA_BUF);
159         fflush(stderr);
160         return 0;
161 }
162
163
164 int apacheError( char* msg, ... ) {
165         VA_LIST_TO_STRING(msg);
166         fprintf(stderr, "%s\n", VA_BUF);
167         fflush(stderr);
168         return HTTP_INTERNAL_SERVER_ERROR; 
169 }
170
171
172 /* taken more or less directly from O'Reillly - Writing Apache Modules in Perl and C */
173 /* needs updating...
174  
175 apr_table_t* apacheParseCookies(request_rec *r) {
176
177    const char *data = apr_table_get(r->headers_in, "Cookie");
178         osrfLogDebug(OSRF_LOG_MARK, "Loaded cookies: %s", data);
179
180    apr_table_t* cookies;
181    const char *pair;
182    if(!data) return NULL;
183
184    cookies = apr_make_table(r->pool, 4);
185    while(*data && (pair = ap_getword(r->pool, &data, ';'))) {
186        const char *name, *value;
187        if(*data == ' ') ++data;
188        name = ap_getword(r->pool, &pair, '=');
189        while(*pair && (value = ap_getword(r->pool, &pair, '&'))) {
190            ap_unescape_url((char *)value);
191            apr_table_add(cookies, name, value);
192        }
193    }
194
195     return cookies;
196 }
197
198 */ 
199
200