* Contributor(s):
*
* Anthony Minessale II <anthm@freeswitch.org>
+ * Seven Du <dujinfang@gmail.com>
*
*
* switch_utils.h -- Compatability and Helper Code
const char *referer;
const char *user;
switch_bool_t keepalive;
+ const char *content_type;
+ switch_size_t content_length;
switch_event_t *headers;
void *user_data; /* private user data */
SWITCH_DECLARE(switch_status_t) switch_http_parse_header(char *buffer, uint32_t datalen, switch_http_request_t *request);
SWITCH_DECLARE(void) switch_http_free_request(switch_http_request_t *request);
SWITCH_DECLARE(void) switch_http_dump_request(switch_http_request_t *request);
+/**
+ * parse http query string
+ * \param[in] request the http request object
+ * \param[in] qs the query string buffer
+ *
+ * qs buffer will be modified, so be sure to dup the qs before passing into this function if you want to keep the original string untouched
+ * if qs is NULL, the it will parse request->qs, request->qs will be duplicated before parse to avoid being modified
+ */
+
+SWITCH_DECLARE(void) switch_http_parse_qs(switch_http_request_t *request, char *qs);
SWITCH_END_EXTERN_C
#endif
*
* Anthony Minessale II <anthm@freeswitch.org>
* Juan Jose Comellas <juanjo@comellas.org>
+ * Seven Du <dujinfang@gmail.com>
*
*
* switch_utils.c -- Compatibility and Helper Code
#endif
}
+SWITCH_DECLARE(void) switch_http_parse_qs(switch_http_request_t *request, char *qs)
+{
+ char *q;
+ char *next;
+ char *name, *val;
+
+ if (qs) {
+ q = qs;
+ } else { /*parse our own qs, dup to avoid modify the original string */
+ q = strdup(request->qs);
+ }
+
+ switch_assert(q);
+ next = q;
+
+ do {
+ char *p;
+
+ if ((next = strchr(next, '&'))) {
+ *next++ = '\0';
+ }
+
+ for (p = q; p && *p; p++) {
+ if (*p == '+') *p = ' ';
+ }
+
+ switch_url_decode(q);
+
+ name = q;
+ if ((val = strchr(name, '='))) {
+ *val++ = '\0';
+ switch_event_add_header_string(request->headers, SWITCH_STACK_BOTTOM, name, val);
+ }
+ q = next;
+ } while (q);
+
+ if (!qs) {
+ switch_safe_free(q);
+ }
+}
+
SWITCH_DECLARE(switch_status_t) switch_http_parse_header(char *buffer, uint32_t datalen, switch_http_request_t *request)
{
switch_status_t status = SWITCH_STATUS_FALSE;
p = strchr(request->uri, ' ');
if (!p) goto err;
- *p++ = '\0';
+ *p++ = '\0';
http = p;
+
+ p = strchr(request->uri, '?');
+
+ if (p) {
+ *p++ = '\0';
+ request->qs = p;
+ }
+
p = strchr(http, '\n');
if (!p) goto err;
if (*p) request->port = (switch_port_t)atoi(p);
}
+ } else if (!strncasecmp(header, "Content-Type", 12)) {
+ request->content_type = value;
+ } else if (!strncasecmp(header, "Content-Length", 14)) {
+ request->content_length = atoi(value);
+ } else if (!strncasecmp(header, "Referer", 7)) {
+ request->referer = value;
}
}
+ if (request->qs) {
+ switch_http_parse_qs(request, NULL);
+ }
+
return SWITCH_STATUS_SUCCESS;
err: