Module: wine Branch: master Commit: 2617fb6dea8e114ef2ade1c0167147b531194e31 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2617fb6dea8e114ef2ade1c016...
Author: Hans Leidekker hans@it.vu.nl Date: Sun Feb 17 20:41:56 2008 +0100
wininet: Handle the "100 Continue" response by ignoring it.
---
dlls/wininet/http.c | 58 ++++++++++++++++++++++++--------------------- dlls/wininet/tests/http.c | 18 +++++++++++-- 2 files changed, 46 insertions(+), 30 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 8f932c3..63491d0 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -3020,6 +3020,7 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr) BOOL bSuccess = FALSE; INT rc = 0; static const WCHAR szCrLf[] = {'\r','\n',0}; + static const WCHAR szHundred[] = {'1','0','0',0}; char bufferA[MAX_REPLY_LEN]; LPWSTR status_code, status_text; DWORD cchMaxRawHeaders = 1024; @@ -3034,19 +3035,37 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr) if (!NETCON_connected(&lpwhr->netConnection)) goto lend;
- /* - * HACK peek at the buffer - */ - NETCON_recv(&lpwhr->netConnection, buffer, buflen, MSG_PEEK, &rc); + do { + /* + * HACK peek at the buffer + */ + buflen = MAX_REPLY_LEN; + NETCON_recv(&lpwhr->netConnection, buffer, buflen, MSG_PEEK, &rc);
- /* - * We should first receive 'HTTP/1.x nnn OK' where nnn is the status code. - */ - buflen = MAX_REPLY_LEN; - memset(buffer, 0, MAX_REPLY_LEN); - if (!NETCON_getNextLine(&lpwhr->netConnection, bufferA, &buflen)) - goto lend; - MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN ); + /* + * We should first receive 'HTTP/1.x nnn OK' where nnn is the status code. + */ + memset(buffer, 0, MAX_REPLY_LEN); + if (!NETCON_getNextLine(&lpwhr->netConnection, bufferA, &buflen)) + goto lend; + MultiByteToWideChar( CP_ACP, 0, bufferA, buflen, buffer, MAX_REPLY_LEN ); + + /* split the version from the status code */ + status_code = strchrW( buffer, ' ' ); + if( !status_code ) + goto lend; + *status_code++=0; + + /* split the status code from the status text */ + status_text = strchrW( status_code, ' ' ); + if( !status_text ) + goto lend; + *status_text++=0; + + TRACE("version [%s] status code [%s] status text [%s]\n", + debugstr_w(buffer), debugstr_w(status_code), debugstr_w(status_text) ); + + } while (!strcmpW(status_code, szHundred)); /* ignore "100 Continue" responses */
/* regenerate raw headers */ while (cchRawHeaders + buflen + strlenW(szCrLf) > cchMaxRawHeaders) @@ -3060,21 +3079,6 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr) cchRawHeaders += sizeof(szCrLf)/sizeof(szCrLf[0])-1; lpszRawHeaders[cchRawHeaders] = '\0';
- /* split the version from the status code */ - status_code = strchrW( buffer, ' ' ); - if( !status_code ) - goto lend; - *status_code++=0; - - /* split the status code from the status text */ - status_text = strchrW( status_code, ' ' ); - if( !status_text ) - goto lend; - *status_text++=0; - - TRACE("version [%s] status code [%s] status text [%s]\n", - debugstr_w(buffer), debugstr_w(status_code), debugstr_w(status_text) ); - HTTP_ProcessHeader(lpwhr, szStatus, status_code, HTTP_ADDHDR_FLAG_REPLACE);
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index 910771d..4aed85d 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -1305,18 +1305,21 @@ done: ok(InternetCloseHandle(hSession), "Close session handle failed\n"); }
+static const char contmsg[] = +"HTTP/1.1 100 Continue\r\n"; + static const char okmsg[] = -"HTTP/1.0 200 OK\r\n" +"HTTP/1.1 200 OK\r\n" "Server: winetest\r\n" "\r\n";
static const char notokmsg[] = -"HTTP/1.0 400 Bad Request\r\n" +"HTTP/1.1 400 Bad Request\r\n" "Server: winetest\r\n" "\r\n";
static const char noauthmsg[] = -"HTTP/1.0 401 Unauthorized\r\n" +"HTTP/1.1 401 Unauthorized\r\n" "Server: winetest\r\n" "\r\n";
@@ -1435,6 +1438,14 @@ static DWORD CALLBACK server_thread(LPVOID param) send(c, notokmsg, sizeof notokmsg-1, 0); }
+ if (strstr(buffer, "GET /test6")) + { + send(c, contmsg, sizeof contmsg-1, 0); + send(c, contmsg, sizeof contmsg-1, 0); + send(c, okmsg, sizeof okmsg-1, 0); + send(c, page1, sizeof page1-1, 0); + } + if (strstr(buffer, "GET /quit")) { send(c, okmsg, sizeof okmsg-1, 0); @@ -1663,6 +1674,7 @@ static void test_http_connection(void) test_proxy_direct(si.port); test_header_handling_order(si.port); test_basic_request(si.port, "POST", "/test5"); + test_basic_request(si.port, "GET", "/test6");
/* send the basic request again to shutdown the server thread */ test_basic_request(si.port, "GET", "/quit");