]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix http header parsing, now it accepts short header
authorSeven Du <dujinfang@gmail.com>
Sun, 7 Sep 2014 03:47:38 +0000 (11:47 +0800)
committerSeven Du <dujinfang@gmail.com>
Sun, 7 Sep 2014 03:47:38 +0000 (11:47 +0800)
src/switch_utils.c

index c3e044bbafaf33d762cdc304cd172a266f46a858..a336502806676c5c3a58be948ab67255cde4f819 100644 (file)
@@ -3665,12 +3665,14 @@ SWITCH_DECLARE(switch_status_t) switch_http_parse_header(char *buffer, uint32_t
 
        if (i == 0) return status;
 
-       if ((body = strstr(p, "\r\n\r\n"))) {
+       if ((body = strstr(buffer, "\r\n\r\n"))) {
                *body = '\0';
                body += 4;
-       } else if (( body = strstr(p, "\n\n"))) {
+       } else if (( body = strstr(buffer, "\n\n"))) {
                *body = '\0';
                body += 2;
+       } else {
+               return status;
        }
 
        request->_buffer = strdup(buffer);
@@ -3682,6 +3684,9 @@ SWITCH_DECLARE(switch_status_t) switch_http_parse_header(char *buffer, uint32_t
        }
 
        p = strchr(request->method, ' ');
+
+       if (!p) goto err;
+
        *p++ = '\0';
 
        request->uri = p;
@@ -3699,18 +3704,12 @@ SWITCH_DECLARE(switch_status_t) switch_http_parse_header(char *buffer, uint32_t
                request->qs = p;
        }
 
-       p = strchr(http, '\n');
-
-       if (!p) goto err;
-
        if (!strncmp(http, "HTTP/1.1", 8)) {
                request->keepalive = SWITCH_TRUE;
        } else if (strncmp(http, "HTTP/1.0", 8)) {
                goto err;
        }
 
-       p++; // now the first header
-
        if (!request->headers) {
                if (switch_event_create(&request->headers, SWITCH_EVENT_CHANNEL_DATA) != SWITCH_STATUS_SUCCESS) {
                        goto err;
@@ -3718,9 +3717,17 @@ SWITCH_DECLARE(switch_status_t) switch_http_parse_header(char *buffer, uint32_t
                request->_destroy_headers = SWITCH_TRUE;
        }
 
+       p = strchr(http, '\n');
+
+       if (p) {
+               *p++ = '\0'; // now the first header
+       } else {
+               goto noheader;
+       }
+
        header_count = switch_separate_string(p, '\n', headers, sizeof(headers)/ sizeof(headers[0]));
 
-       if (header_count < 2) goto err; /* at least two lines */
+       if (header_count < 1) goto err;
 
        for (i = 0; i < header_count; i++) {
                char *header, *value;
@@ -3761,6 +3768,8 @@ SWITCH_DECLARE(switch_status_t) switch_http_parse_header(char *buffer, uint32_t
                }
        }
 
+noheader:
+
        if (request->qs) {
                switch_http_parse_qs(request, NULL);
        }