]> git.evergreen-ils.org Git - Evergreen.git/blob - OpenSRF/src/gateway/apachetools.c
handling any less-than zero returns
[Evergreen.git] / OpenSRF / 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                 osrfLogDebug(OSRF_LOG_MARK, "gateway reading post data..");
23
24                 if(ap_should_client_block(r)) {
25
26                         char body[1025];
27                         memset(body,0,1025);
28                         buffer = buffer_init(1025);
29         
30                         long bread;
31                         while( (bread = ap_get_client_block(r, body, 1024)) ) {
32
33                                 if(bread < 0) {
34                                         osrfLogInfo(OSRF_LOG_MARK, 
35                                                 "ap_get_client_block(): returned error, exiting POST reader");
36                                         break;
37                                 }
38
39                                 buffer_add( buffer, body );
40                                 memset(body,0,1025);
41
42                                 osrfLogDebug(OSRF_LOG_MARK, 
43                                         "gateway read %d bytes: %d bytes of data so far", bread, buffer->n_used);
44
45                                 if(buffer->n_used == 0) break;
46
47                                 if(buffer->n_used > APACHE_TOOLS_MAX_POST_SIZE) {
48                                         osrfLogError(OSRF_LOG_MARK, "gateway received POST larger "
49                                                 "than %d bytes. dropping reqeust", APACHE_TOOLS_MAX_POST_SIZE);
50                                         buffer_free(buffer);
51                                         return NULL;
52                                 }
53                         }
54
55                         osrfLogDebug(OSRF_LOG_MARK, "gateway done reading post data");
56         
57                         if(arg && arg[0]) {
58
59                                 tmp_buf = buffer_init(1024);
60                                 buffer_add(tmp_buf,arg);
61                                 buffer_add(tmp_buf,buffer->buf);
62                                 arg = (char*) apr_pstrdup(p, tmp_buf->buf);
63                                 buffer_free(tmp_buf);
64
65                         } else if(buffer->n_used > 0){
66                                         arg = (char*) apr_pstrdup(p, buffer->buf);
67
68                         } else { 
69                                 arg = NULL; 
70                         }
71
72                         buffer_free(buffer);
73                 }
74         } 
75
76
77         osrfLogDebug(OSRF_LOG_MARK, "gateway done mangling post data");
78
79         if( !arg || !arg[0] ) { /* we received no request */
80                 return NULL;
81         }
82
83
84         osrfLogDebug(OSRF_LOG_MARK, "parsing URL params from post/get request data: %s", arg);
85         int sanity = 0;
86         while( arg && (val = ap_getword(p, (const char**) &arg, '&'))) {
87
88                 key = ap_getword(r->pool, (const char**) &val, '=');
89                 if(!key || !key[0])
90                         break;
91
92                 ap_unescape_url((char*)key);
93                 ap_unescape_url((char*)val);
94
95                 osrfLogDebug(OSRF_LOG_MARK, "parsed URL params %s=%s", key, val);
96
97                 string_array_add(sarray, key);
98                 string_array_add(sarray, val);
99
100                 if( sanity++ > 1000 ) {
101                         osrfLogError(OSRF_LOG_MARK, 
102                                 "Parsing URL params failed sanity check: 1000 iterations");
103                         string_array_destroy(sarray);
104                         return NULL;
105                 }
106
107         }
108
109         if(sarray)
110                 osrfLogDebug(OSRF_LOG_MARK, 
111                         "Apache tools parsed %d params key/values", sarray->size / 2 );
112
113         return sarray;
114 }
115
116
117
118 string_array* apacheGetParamKeys(string_array* params) {
119         if(params == NULL) return NULL; 
120         string_array* sarray    = init_string_array(12); 
121         int i;
122         osrfLogDebug(OSRF_LOG_MARK, "Fetching URL param keys");
123         for( i = 0; i < params->size; i++ ) 
124                 string_array_add(sarray, string_array_get_string(params, i++)); 
125         return sarray;
126 }
127
128 string_array* apacheGetParamValues(string_array* params, char* key) {
129
130         if(params == NULL || key == NULL) return NULL;  
131         string_array* sarray    = init_string_array(12); 
132
133         osrfLogDebug(OSRF_LOG_MARK, "Fetching URL values for key %s", key);
134         int i;
135         for( i = 0; i < params->size; i++ ) {
136                 char* nkey = string_array_get_string(params, i++);      
137                 if(key && !strcmp(nkey, key)) 
138                         string_array_add(sarray, string_array_get_string(params, i));   
139         }
140         return sarray;
141 }
142
143
144 char* apacheGetFirstParamValue(string_array* params, char* key) {
145         if(params == NULL || key == NULL) return NULL;  
146
147         int i;
148         osrfLogDebug(OSRF_LOG_MARK, "Fetching first URL value for key %s", key);
149         for( i = 0; i < params->size; i++ ) {
150                 char* nkey = string_array_get_string(params, i++);      
151                 if(key && !strcmp(nkey, key)) 
152                         return strdup(string_array_get_string(params, i));
153         }
154
155         return NULL;
156 }
157
158
159 int apacheDebug( char* msg, ... ) {
160         VA_LIST_TO_STRING(msg);
161         fprintf(stderr, "%s\n", VA_BUF);
162         fflush(stderr);
163         return 0;
164 }
165
166
167 int apacheError( char* msg, ... ) {
168         VA_LIST_TO_STRING(msg);
169         fprintf(stderr, "%s\n", VA_BUF);
170         fflush(stderr);
171         return HTTP_INTERNAL_SERVER_ERROR; 
172 }
173
174