diff options
| author | Michael Kaufmann <mail@michael-kaufmann.ch> | 2016-06-28 10:57:30 +0200 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2016-08-25 14:49:39 +0200 | 
| commit | 7bda07b0466a192e082f32d363d1b1ce1881d483 (patch) | |
| tree | 1d8dc93fed93978c3a49e9789d08523b867f7d59 /lib | |
| parent | 9cb851e3718a6af4ca7c42de6ff98f929b7d2f49 (diff) | |
HTTP: stop parsing headers when switching to unknown protocols
- unknown protocols probably won't send more headers (e.g. WebSocket)
- improved comments and moved them to the correct case statements
Closes #899
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/http.c | 33 | 
1 files changed, 23 insertions, 10 deletions
| diff --git a/lib/http.c b/lib/http.c index 15991336a..087d1af02 100644 --- a/lib/http.c +++ b/lib/http.c @@ -3054,19 +3054,19 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,  #endif /* CURL_DOES_CONVERSIONS */        if(100 <= k->httpcode && 199 >= k->httpcode) { -        /* -         * We have made a HTTP PUT or POST and this is 1.1-lingo -         * that tells us that the server is OK with this and ready -         * to receive the data. -         * However, we'll get more headers now so we must get -         * back into the header-parsing state! -         */ -        k->header = TRUE; -        k->headerline = 0; /* restart the header line counter */ -          /* "A user agent MAY ignore unexpected 1xx status responses." */          switch(k->httpcode) {          case 100: +          /* +           * We have made a HTTP PUT or POST and this is 1.1-lingo +           * that tells us that the server is OK with this and ready +           * to receive the data. +           * However, we'll get more headers now so we must get +           * back into the header-parsing state! +           */ +          k->header = TRUE; +          k->headerline = 0; /* restart the header line counter */ +            /* if we did wait for this do enable write now! */            if(k->exp100 > EXP100_SEND_DATA) {              k->exp100 = EXP100_SEND_DATA; @@ -3076,9 +3076,14 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,          case 101:            /* Switching Protocols */            if(k->upgr101 == UPGR101_REQUESTED) { +            /* Switching to HTTP/2 */              infof(data, "Received 101\n");              k->upgr101 = UPGR101_RECEIVED; +            /* we'll get more headers (HTTP/2 response) */ +            k->header = TRUE; +            k->headerline = 0; /* restart the header line counter */ +              /* switch to http2 now. The bytes after response headers                 are also processed here, otherwise they are lost. */              result = Curl_http2_switched(conn, k->str, *nread); @@ -3086,8 +3091,16 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,                return result;              *nread = 0;            } +          else { +            /* Switching to another protocol (e.g. WebSocket) */ +            k->header = FALSE; /* no more header to parse! */ +          }            break;          default: +          /* the status code 1xx indicates a provisional response, so +             we'll get another set of headers */ +          k->header = TRUE; +          k->headerline = 0; /* restart the header line counter */            break;          }        } | 
