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 if(ap_should_client_block(r)) {
26 buffer = buffer_init(1025);
28 while(ap_get_client_block(r, body, 1024)) {
29 buffer_add( buffer, body );
32 if(buffer->n_used > APACHE_TOOLS_MAX_POST_SIZE) {
33 osrfLogError(OSRF_LOG_MARK, "gateway received POST larger "
34 "than %d bytes. dropping reqeust", APACHE_TOOLS_MAX_POST_SIZE);
43 tmp_buf = buffer_init(1024);
44 buffer_add(tmp_buf,arg);
45 buffer_add(tmp_buf,buffer->buf);
46 arg = (char*) apr_pstrdup(p, tmp_buf->buf);
50 arg = (char*) apr_pstrdup(p, buffer->buf);
58 if( ! arg || !arg[0] ) { /* we received no request */
64 while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
66 key = ap_getword(r->pool, (const char**) &val, '=');
70 ap_unescape_url((char*)key);
71 ap_unescape_url((char*)val);
73 string_array_add(sarray, key);
74 string_array_add(sarray, val);
76 if( sanity++ > 1000 ) {
77 osrfLogError(OSRF_LOG_MARK,
78 "Parsing URL params failed sanity check: 1000 iterations");
79 string_array_destroy(sarray);
86 osrfLogDebug(OSRF_LOG_MARK,
87 "Apache tools parsed %d params key/values", sarray->size / 2 );
94 string_array* apacheGetParamKeys(string_array* params) {
95 if(params == NULL) return NULL;
96 string_array* sarray = init_string_array(12);
98 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL param keys");
99 for( i = 0; i < params->size; i++ )
100 string_array_add(sarray, string_array_get_string(params, i++));
104 string_array* apacheGetParamValues(string_array* params, char* key) {
106 if(params == NULL || key == NULL) return NULL;
107 string_array* sarray = init_string_array(12);
109 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
111 for( i = 0; i < params->size; i++ ) {
112 char* nkey = string_array_get_string(params, i++);
113 if(key && !strcmp(nkey, key))
114 string_array_add(sarray, string_array_get_string(params, i));
120 char* apacheGetFirstParamValue(string_array* params, char* key) {
121 if(params == NULL || key == NULL) return NULL;
124 osrfLogDebug(OSRF_LOG_MARK, "Fetching first URL value for key %s", key);
125 for( i = 0; i < params->size; i++ ) {
126 char* nkey = string_array_get_string(params, i++);
127 if(key && !strcmp(nkey, key))
128 return strdup(string_array_get_string(params, i));
135 int apacheDebug( char* msg, ... ) {
136 VA_LIST_TO_STRING(msg);
137 fprintf(stderr, "%s\n", VA_BUF);
143 int apacheError( char* msg, ... ) {
144 VA_LIST_TO_STRING(msg);
145 fprintf(stderr, "%s\n", VA_BUF);
147 return HTTP_INTERNAL_SERVER_ERROR;