1 #include "apachetools.h"
3 osrfStringArray* apacheParseParms(request_rec* r) {
5 if( r == NULL ) return NULL;
8 apr_pool_t *p = r->pool; /* memory pool */
10 /* gather the post args and append them to the url query string */
11 if( !strcmp(r->method,"POST") ) {
13 ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
15 osrfLogDebug(OSRF_LOG_MARK, "gateway reading post data..");
17 if(ap_should_client_block(r)) {
19 growing_buffer* buffer = buffer_init(1025);
21 /* Start with url query string, if any */
23 if(r->args && r->args[0])
24 buffer_add(buffer, r->args);
28 osrfLogDebug(OSRF_LOG_MARK, "gateway client has post data, reading...");
30 /* Append POST data */
33 while( (bread = ap_get_client_block(r, body, sizeof(body) - 1)) ) {
36 osrfLogInfo(OSRF_LOG_MARK,
37 "ap_get_client_block(): returned error, exiting POST reader");
42 buffer_add( buffer, body );
44 osrfLogDebug(OSRF_LOG_MARK,
45 "gateway read %ld bytes: %d bytes of data so far", bread, buffer->n_used);
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);
55 osrfLogDebug(OSRF_LOG_MARK, "gateway done reading post data");
57 if(buffer->n_used > 0)
58 arg = apr_pstrdup(p, buffer->buf);
67 osrfLogDebug(OSRF_LOG_MARK, "gateway done mangling post data");
69 if( !arg || !arg[0] ) { /* we received no request */
73 osrfLogDebug(OSRF_LOG_MARK, "parsing URL params from post/get request data: %s", arg);
75 osrfStringArray* sarray = osrfNewStringArray(12); /* method parameters */
77 char* key = NULL; /* query item name */
78 char* val = NULL; /* query item value */
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. */
84 while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
86 key = ap_getword(r->pool, (const char**) &val, '=');
93 osrfLogDebug(OSRF_LOG_MARK, "parsed URL params %s=%s", key, val);
95 osrfStringArrayAdd(sarray, key);
96 osrfStringArrayAdd(sarray, val);
98 if( sanity++ > 1000 ) {
99 osrfLogError(OSRF_LOG_MARK,
100 "Parsing URL params failed sanity check: 1000 iterations");
101 osrfStringArrayFree(sarray);
107 osrfLogDebug(OSRF_LOG_MARK,
108 "Apache tools parsed %d params key/values", sarray->size / 2 );
115 osrfStringArray* apacheGetParamKeys(osrfStringArray* params) {
116 if(params == NULL) return NULL;
117 osrfStringArray* sarray = osrfNewStringArray(12);
119 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL param keys");
120 for( i = 0; i < params->size; i++ )
121 osrfStringArrayAdd(sarray, osrfStringArrayGetString(params, i++));
125 osrfStringArray* apacheGetParamValues(osrfStringArray* params, char* key) {
127 if(params == NULL || key == NULL) return NULL;
128 osrfStringArray* sarray = osrfNewStringArray(12);
130 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
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));
141 char* apacheGetFirstParamValue(osrfStringArray* params, char* key) {
142 if(params == NULL || key == NULL) return NULL;
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));
156 int apacheDebug( char* msg, ... ) {
157 VA_LIST_TO_STRING(msg);
158 fprintf(stderr, "%s\n", VA_BUF);
164 int apacheError( char* msg, ... ) {
165 VA_LIST_TO_STRING(msg);
166 fprintf(stderr, "%s\n", VA_BUF);
168 return HTTP_INTERNAL_SERVER_ERROR;
172 /* taken more or less directly from O'Reillly - Writing Apache Modules in Perl and C */
175 apr_table_t* apacheParseCookies(request_rec *r) {
177 const char *data = apr_table_get(r->headers_in, "Cookie");
178 osrfLogDebug(OSRF_LOG_MARK, "Loaded cookies: %s", data);
180 apr_table_t* cookies;
182 if(!data) return NULL;
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);