1 #include "apachetools.h"
3 string_array* apacheParseParms(request_rec* r) {
5 if( r == NULL ) return NULL;
7 char* arg = r->args; /* url query string */
8 apr_pool_t *p = r->pool; /* memory pool */
9 string_array* sarray = init_string_array(12); /* method parameters */
11 growing_buffer* buffer = NULL; /* POST data */
12 growing_buffer* tmp_buf = NULL; /* temp buffer */
14 char* key = NULL; /* query item name */
15 char* val = NULL; /* query item value */
17 /* gather the post args and append them to the url query string */
18 if( !strcmp(r->method,"POST") ) {
20 ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
22 osrfLogDebug(OSRF_LOG_MARK, "gateway reading post data..");
24 if(ap_should_client_block(r)) {
28 buffer = buffer_init(1025);
31 while( (bread = ap_get_client_block(r, body, 1024)) ) {
34 osrfLogInfo(OSRF_LOG_MARK,
35 "ap_get_client_block(): returned error, exiting POST reader");
39 buffer_add( buffer, body );
42 osrfLogDebug(OSRF_LOG_MARK,
43 "gateway read %d bytes: %d bytes of data so far", bread, buffer->n_used);
45 if(buffer->n_used == 0) break;
47 if(buffer->n_used > APACHE_TOOLS_MAX_POST_SIZE) {
48 osrfLogError(OSRF_LOG_MARK, "gateway received POST larger "
49 "than %d bytes. dropping reqeust", APACHE_TOOLS_MAX_POST_SIZE);
55 osrfLogDebug(OSRF_LOG_MARK, "gateway done reading post data");
59 tmp_buf = buffer_init(1024);
60 buffer_add(tmp_buf,arg);
61 buffer_add(tmp_buf,buffer->buf);
62 arg = (char*) apr_pstrdup(p, tmp_buf->buf);
65 } else if(buffer->n_used > 0){
66 arg = (char*) apr_pstrdup(p, buffer->buf);
77 osrfLogDebug(OSRF_LOG_MARK, "gateway done mangling post data");
79 if( !arg || !arg[0] ) { /* we received no request */
84 osrfLogDebug(OSRF_LOG_MARK, "parsing URL params from post/get request data: %s", arg);
86 while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
88 key = ap_getword(r->pool, (const char**) &val, '=');
92 ap_unescape_url((char*)key);
93 ap_unescape_url((char*)val);
95 osrfLogDebug(OSRF_LOG_MARK, "parsed URL params %s=%s", key, val);
97 string_array_add(sarray, key);
98 string_array_add(sarray, val);
100 if( sanity++ > 1000 ) {
101 osrfLogError(OSRF_LOG_MARK,
102 "Parsing URL params failed sanity check: 1000 iterations");
103 string_array_destroy(sarray);
110 osrfLogDebug(OSRF_LOG_MARK,
111 "Apache tools parsed %d params key/values", sarray->size / 2 );
118 string_array* apacheGetParamKeys(string_array* params) {
119 if(params == NULL) return NULL;
120 string_array* sarray = init_string_array(12);
122 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL param keys");
123 for( i = 0; i < params->size; i++ )
124 string_array_add(sarray, string_array_get_string(params, i++));
128 string_array* apacheGetParamValues(string_array* params, char* key) {
130 if(params == NULL || key == NULL) return NULL;
131 string_array* sarray = init_string_array(12);
133 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
135 for( i = 0; i < params->size; i++ ) {
136 char* nkey = string_array_get_string(params, i++);
137 if(key && !strcmp(nkey, key))
138 string_array_add(sarray, string_array_get_string(params, i));
144 char* apacheGetFirstParamValue(string_array* params, char* key) {
145 if(params == NULL || key == NULL) return NULL;
148 osrfLogDebug(OSRF_LOG_MARK, "Fetching first URL value for key %s", key);
149 for( i = 0; i < params->size; i++ ) {
150 char* nkey = string_array_get_string(params, i++);
151 if(key && !strcmp(nkey, key))
152 return strdup(string_array_get_string(params, i));
159 int apacheDebug( char* msg, ... ) {
160 VA_LIST_TO_STRING(msg);
161 fprintf(stderr, "%s\n", VA_BUF);
167 int apacheError( char* msg, ... ) {
168 VA_LIST_TO_STRING(msg);
169 fprintf(stderr, "%s\n", VA_BUF);
171 return HTTP_INTERNAL_SERVER_ERROR;