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 */
9 growing_buffer* buffer = buffer_init(1025);
11 /* gather the post args and append them to the url query string */
12 if( !strcmp(r->method,"POST") ) {
14 ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
16 osrfLogDebug(OSRF_LOG_MARK, "gateway reading post data..");
18 if(ap_should_client_block(r)) {
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");
60 if(r->args && r->args[0])
61 buffer_add(buffer, r->args);
65 if(buffer->n_used > 0)
66 arg = apr_pstrdup(p, buffer->buf);
71 if( !arg || !arg[0] ) { /* we received no request */
75 osrfLogDebug(OSRF_LOG_MARK, "parsing URL params from post/get request data: %s", arg);
77 osrfStringArray* sarray = osrfNewStringArray(12); /* method parameters */
79 char* key = NULL; /* query item name */
80 char* val = NULL; /* query item value */
82 /* Parse the post/get request data into a series of name/value pairs. */
83 /* Load each name into an even-numbered slot of an osrfStringArray, and */
84 /* the corresponding value into the following odd-numbered slot. */
86 while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
88 key = ap_getword(r->pool, (const char**) &val, '=');
95 osrfLogDebug(OSRF_LOG_MARK, "parsed URL params %s=%s", key, val);
97 osrfStringArrayAdd(sarray, key);
98 osrfStringArrayAdd(sarray, val);
100 if( sanity++ > 1000 ) {
101 osrfLogError(OSRF_LOG_MARK,
102 "Parsing URL params failed sanity check: 1000 iterations");
103 osrfStringArrayFree(sarray);
109 osrfLogDebug(OSRF_LOG_MARK,
110 "Apache tools parsed %d params key/values", sarray->size / 2 );
117 osrfStringArray* apacheGetParamKeys(osrfStringArray* params) {
118 if(params == NULL) return NULL;
119 osrfStringArray* sarray = osrfNewStringArray(12);
121 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL param keys");
122 for( i = 0; i < params->size; i++ )
123 osrfStringArrayAdd(sarray, osrfStringArrayGetString(params, i++));
127 osrfStringArray* apacheGetParamValues(osrfStringArray* params, char* key) {
129 if(params == NULL || key == NULL) return NULL;
130 osrfStringArray* sarray = osrfNewStringArray(12);
132 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
134 for( i = 0; i < params->size; i++ ) {
135 const char* nkey = osrfStringArrayGetString(params, i++);
136 if(nkey && !strcmp(nkey, key))
137 osrfStringArrayAdd(sarray, osrfStringArrayGetString(params, i));
143 char* apacheGetFirstParamValue(osrfStringArray* params, char* key) {
144 if(params == NULL || key == NULL) return NULL;
147 osrfLogDebug(OSRF_LOG_MARK, "Fetching first URL value for key %s", key);
148 for( i = 0; i < params->size; i++ ) {
149 const char* nkey = osrfStringArrayGetString(params, i++);
150 if(nkey && !strcmp(nkey, key))
151 return strdup(osrfStringArrayGetString(params, i));
158 int apacheDebug( char* msg, ... ) {
159 VA_LIST_TO_STRING(msg);
160 fprintf(stderr, "%s\n", VA_BUF);
166 int apacheError( char* msg, ... ) {
167 VA_LIST_TO_STRING(msg);
168 fprintf(stderr, "%s\n", VA_BUF);
170 return HTTP_INTERNAL_SERVER_ERROR;
174 /* taken more or less directly from O'Reillly - Writing Apache Modules in Perl and C */
177 apr_table_t* apacheParseCookies(request_rec *r) {
179 const char *data = apr_table_get(r->headers_in, "Cookie");
180 osrfLogDebug(OSRF_LOG_MARK, "Loaded cookies: %s", data);
182 apr_table_t* cookies;
184 if(!data) return NULL;
186 cookies = apr_make_table(r->pool, 4);
187 while(*data && (pair = ap_getword(r->pool, &data, ';'))) {
188 const char *name, *value;
189 if(*data == ' ') ++data;
190 name = ap_getword(r->pool, &pair, '=');
191 while(*pair && (value = ap_getword(r->pool, &pair, '&'))) {
192 ap_unescape_url((char *)value);
193 apr_table_add(cookies, name, value);