1 #include "apachetools.h"
3 osrfStringArray* 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 osrfStringArray* sarray = osrfNewStringArray(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)) {
27 memset(body,0,sizeof(body));
28 buffer = buffer_init(1025);
31 osrfLogDebug(OSRF_LOG_MARK, "gateway client has post data, reading...");
34 while( (bread = ap_get_client_block(r, body, 1024)) ) {
37 osrfLogInfo(OSRF_LOG_MARK,
38 "ap_get_client_block(): returned error, exiting POST reader");
42 buffer_add( buffer, body );
43 memset(body,0,sizeof(body));
45 osrfLogDebug(OSRF_LOG_MARK,
46 "gateway read %d bytes: %d bytes of data so far", bread, buffer->n_used);
48 if(buffer->n_used == 0) break;
50 if(buffer->n_used > APACHE_TOOLS_MAX_POST_SIZE) {
51 osrfLogError(OSRF_LOG_MARK, "gateway received POST larger "
52 "than %d bytes. dropping request", APACHE_TOOLS_MAX_POST_SIZE);
58 osrfLogDebug(OSRF_LOG_MARK, "gateway done reading post data");
62 tmp_buf = buffer_init(1024);
63 buffer_add(tmp_buf,arg);
64 buffer_add(tmp_buf,buffer->buf);
65 arg = (char*) apr_pstrdup(p, tmp_buf->buf);
68 } else if(buffer->n_used > 0){
69 arg = (char*) apr_pstrdup(p, buffer->buf);
80 osrfLogDebug(OSRF_LOG_MARK, "gateway done mangling post data");
82 if( !arg || !arg[0] ) { /* we received no request */
87 osrfLogDebug(OSRF_LOG_MARK, "parsing URL params from post/get request data: %s", arg);
89 while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
91 key = ap_getword(r->pool, (const char**) &val, '=');
95 ap_unescape_url((char*)key);
96 ap_unescape_url((char*)val);
98 osrfLogDebug(OSRF_LOG_MARK, "parsed URL params %s=%s", key, val);
100 osrfStringArrayAdd(sarray, key);
101 osrfStringArrayAdd(sarray, val);
103 if( sanity++ > 1000 ) {
104 osrfLogError(OSRF_LOG_MARK,
105 "Parsing URL params failed sanity check: 1000 iterations");
106 osrfStringArrayFree(sarray);
113 osrfLogDebug(OSRF_LOG_MARK,
114 "Apache tools parsed %d params key/values", sarray->size / 2 );
121 osrfStringArray* apacheGetParamKeys(osrfStringArray* params) {
122 if(params == NULL) return NULL;
123 osrfStringArray* sarray = osrfNewStringArray(12);
125 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL param keys");
126 for( i = 0; i < params->size; i++ )
127 osrfStringArrayAdd(sarray, osrfStringArrayGetString(params, i++));
131 osrfStringArray* apacheGetParamValues(osrfStringArray* params, char* key) {
133 if(params == NULL || key == NULL) return NULL;
134 osrfStringArray* sarray = osrfNewStringArray(12);
136 osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
138 for( i = 0; i < params->size; i++ ) {
139 char* nkey = osrfStringArrayGetString(params, i++);
140 if(key && !strcmp(nkey, key))
141 osrfStringArrayAdd(sarray, osrfStringArrayGetString(params, i));
147 char* apacheGetFirstParamValue(osrfStringArray* params, char* key) {
148 if(params == NULL || key == NULL) return NULL;
151 osrfLogDebug(OSRF_LOG_MARK, "Fetching first URL value for key %s", key);
152 for( i = 0; i < params->size; i++ ) {
153 char* nkey = osrfStringArrayGetString(params, i++);
154 if(key && !strcmp(nkey, key))
155 return strdup(osrfStringArrayGetString(params, i));
162 int apacheDebug( char* msg, ... ) {
163 VA_LIST_TO_STRING(msg);
164 fprintf(stderr, "%s\n", VA_BUF);
170 int apacheError( char* msg, ... ) {
171 VA_LIST_TO_STRING(msg);
172 fprintf(stderr, "%s\n", VA_BUF);
174 return HTTP_INTERNAL_SERVER_ERROR;
178 /* taken more or less directly from O'Reillly - Writing Apache Modules in Perl and C */
181 apr_table_t* apacheParseCookies(request_rec *r) {
183 const char *data = apr_table_get(r->headers_in, "Cookie");
184 osrfLogDebug(OSRF_LOG_MARK, "Loaded cookies: %s", data);
186 apr_table_t* cookies;
188 if(!data) return NULL;
190 cookies = apr_make_table(r->pool, 4);
191 while(*data && (pair = ap_getword(r->pool, &data, ';'))) {
192 const char *name, *value;
193 if(*data == ' ') ++data;
194 name = ap_getword(r->pool, &pair, '=');
195 while(*pair && (value = ap_getword(r->pool, &pair, '&'))) {
196 ap_unescape_url((char *)value);
197 apr_table_add(cookies, name, value);