if( r == NULL ) return NULL;
- char* arg = r->args; /* url query string */
+ char* arg = NULL;
apr_pool_t *p = r->pool; /* memory pool */
- osrfStringArray* sarray = osrfNewStringArray(12); /* method parameters */
-
- growing_buffer* buffer = NULL; /* POST data */
- growing_buffer* tmp_buf = NULL; /* temp buffer */
-
- char* key = NULL; /* query item name */
- char* val = NULL; /* query item value */
/* gather the post args and append them to the url query string */
if( !strcmp(r->method,"POST") ) {
if(ap_should_client_block(r)) {
- char body[1025];
- memset(body,0,sizeof(body));
- buffer = buffer_init(1025);
+ growing_buffer* buffer = buffer_init(1025);
+ /* Start with url query string, if any */
+
+ if(r->args && r->args[0])
+ buffer_add(buffer, r->args);
+
+ char body[1025];
osrfLogDebug(OSRF_LOG_MARK, "gateway client has post data, reading...");
-
+
+ /* Append POST data */
+
long bread;
- while( (bread = ap_get_client_block(r, body, 1024)) ) {
+ while( (bread = ap_get_client_block(r, body, sizeof(body) - 1)) ) {
if(bread < 0) {
osrfLogInfo(OSRF_LOG_MARK,
break;
}
+ body[bread] = '\0';
buffer_add( buffer, body );
- memset(body,0,sizeof(body));
osrfLogDebug(OSRF_LOG_MARK,
- "gateway read %d bytes: %d bytes of data so far", bread, buffer->n_used);
-
- if(buffer->n_used == 0) break;
+ "gateway read %ld bytes: %d bytes of data so far", bread, buffer->n_used);
if(buffer->n_used > APACHE_TOOLS_MAX_POST_SIZE) {
osrfLogError(OSRF_LOG_MARK, "gateway received POST larger "
osrfLogDebug(OSRF_LOG_MARK, "gateway done reading post data");
- if(arg && arg[0]) {
-
- tmp_buf = buffer_init(1024);
- buffer_add(tmp_buf,arg);
- buffer_add(tmp_buf,buffer->buf);
- arg = (char*) apr_pstrdup(p, tmp_buf->buf);
- buffer_free(tmp_buf);
-
- } else if(buffer->n_used > 0){
- arg = (char*) apr_pstrdup(p, buffer->buf);
-
- } else {
+ if(buffer->n_used > 0)
+ arg = apr_pstrdup(p, buffer->buf);
+ else
arg = NULL;
- }
buffer_free(buffer);
}
return NULL;
}
-
osrfLogDebug(OSRF_LOG_MARK, "parsing URL params from post/get request data: %s", arg);
+
+ osrfStringArray* sarray = osrfNewStringArray(12); /* method parameters */
int sanity = 0;
+ char* key = NULL; /* query item name */
+ char* val = NULL; /* query item value */
+
+ /* Parse the post/get request data into a series of name/value pairs. */
+ /* Load each name into an even-numbered slot of an osrfStringArray, and */
+ /* the corresponding value into the following odd-numbered slot. */
+
while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
key = ap_getword(r->pool, (const char**) &val, '=');
if(!key || !key[0])
break;
- ap_unescape_url((char*)key);
- ap_unescape_url((char*)val);
+ ap_unescape_url(key);
+ ap_unescape_url(val);
osrfLogDebug(OSRF_LOG_MARK, "parsed URL params %s=%s", key, val);
}
- if(sarray)
- osrfLogDebug(OSRF_LOG_MARK,
- "Apache tools parsed %d params key/values", sarray->size / 2 );
+ osrfLogDebug(OSRF_LOG_MARK,
+ "Apache tools parsed %d params key/values", sarray->size / 2 );
return sarray;
}