]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/gateway/apachetools.c
added some logging, etc.
[OpenSRF.git] / src / gateway / apachetools.c
1 #include "apachetools.h"
2
3 string_array* apacheParseParms(request_rec* r) {
4
5         if( r == NULL ) return NULL;
6
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 */
10
11         growing_buffer* buffer          = NULL; /* POST data */
12         growing_buffer* tmp_buf         = NULL; /* temp buffer */
13
14         char* key                                               = NULL; /* query item name */
15         char* val                                               = NULL; /* query item value */
16
17         /* gather the post args and append them to the url query string */
18         if( !strcmp(r->method,"POST") ) {
19
20                 ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK);
21
22                 if(ap_should_client_block(r)) {
23
24                         char body[1025];
25                         memset(body,0,1025);
26                         buffer = buffer_init(1025);
27         
28                         while(ap_get_client_block(r, body, 1024)) {
29                                 buffer_add( buffer, body );
30                                 memset(body,0,1025);
31
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);
35                                         buffer_free(buffer);
36                                         arg = NULL;
37                                 }
38
39                         }
40         
41                         if(arg && arg[0]) {
42
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);
47                                 buffer_free(tmp_buf);
48
49                         } else {
50                                 arg = (char*) apr_pstrdup(p, buffer->buf);
51                         }
52
53                         buffer_free(buffer);
54                 }
55         } 
56
57
58         if( ! arg || !arg[0] ) { /* we received no request */
59                 return NULL;
60         }
61
62
63         int sanity = 0;
64         while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
65
66                 key = ap_getword(r->pool, (const char**) &val, '=');
67                 if(!key || !key[0])
68                         break;
69
70                 ap_unescape_url((char*)key);
71                 ap_unescape_url((char*)val);
72
73                 string_array_add(sarray, key);
74                 string_array_add(sarray, val);
75
76                 if( sanity++ > 1000 ) {
77                         osrfLogError(OSRF_LOG_MARK, 
78                                 "Parsing URL params failed sanity check: 1000 iterations");
79                         string_array_destroy(sarray);
80                         return NULL;
81                 }
82
83         }
84
85         if(sarray)
86                 osrfLogDebug(OSRF_LOG_MARK, 
87                         "Apache tools parsed %d params key/values", sarray->size / 2 );
88
89         return sarray;
90 }
91
92
93
94 string_array* apacheGetParamKeys(string_array* params) {
95         if(params == NULL) return NULL; 
96         string_array* sarray    = init_string_array(12); 
97         int i;
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++)); 
101         return sarray;
102 }
103
104 string_array* apacheGetParamValues(string_array* params, char* key) {
105
106         if(params == NULL || key == NULL) return NULL;  
107         string_array* sarray    = init_string_array(12); 
108
109         osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
110         int i;
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));   
115         }
116         return sarray;
117 }
118
119
120 char* apacheGetFirstParamValue(string_array* params, char* key) {
121         if(params == NULL || key == NULL) return NULL;  
122
123         int i;
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));
129         }
130
131         return NULL;
132 }
133
134
135 int apacheDebug( char* msg, ... ) {
136         VA_LIST_TO_STRING(msg);
137         fprintf(stderr, "%s\n", VA_BUF);
138         fflush(stderr);
139         return 0;
140 }
141
142
143 int apacheError( char* msg, ... ) {
144         VA_LIST_TO_STRING(msg);
145         fprintf(stderr, "%s\n", VA_BUF);
146         fflush(stderr);
147         return HTTP_INTERNAL_SERVER_ERROR; 
148 }
149
150