Hans Leidekker : winhttp: Implement WinHttpQueryHeaders( WINHTTP_QUERY_RAW_HEADERS).
Alexandre Julliard
julliard at winehq.org
Fri Sep 5 10:34:06 CDT 2008
Module: wine
Branch: master
Commit: 6fe2edb5def17acd18f420664eebffeac66ae8e5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6fe2edb5def17acd18f420664eebffeac66ae8e5
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Sep 5 14:11:46 2008 +0200
winhttp: Implement WinHttpQueryHeaders(WINHTTP_QUERY_RAW_HEADERS).
---
dlls/winhttp/request.c | 41 ++++++++++++++++++++++++++++++++++++++---
dlls/winhttp/tests/winhttp.c | 26 +++++++++++++++++++++++++-
2 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index be951c5..ae24499 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -526,7 +526,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
header_t *header = NULL;
BOOL request_only, ret = FALSE;
int requested_index, header_index = -1;
- DWORD attr;
+ DWORD attr, len;
request_only = level & WINHTTP_QUERY_FLAG_REQUEST_HEADERS;
requested_index = index ? *index : 0;
@@ -539,10 +539,45 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
header_index = get_header_index( request, name, requested_index, request_only );
break;
}
+ case WINHTTP_QUERY_RAW_HEADERS:
+ {
+ WCHAR *headers, *p, *q;
+
+ if (request_only)
+ headers = build_request_string( request );
+ else
+ headers = request->raw_headers;
+
+ if (!(p = headers)) return FALSE;
+ for (len = 0; *p; p++) if (*p != '\r') len++;
+
+ if ((len + 1) * sizeof(WCHAR) > *buflen || !buffer)
+ {
+ len++;
+ set_last_error( ERROR_INSUFFICIENT_BUFFER );
+ }
+ else if (buffer)
+ {
+ for (p = headers, q = (WCHAR *)buffer; *p; p++, q++)
+ {
+ if (*p != '\r') *q = *p;
+ else
+ {
+ *q = 0;
+ p++; /* skip '\n' */
+ }
+ }
+ *q = 0;
+ TRACE("returning data: %s\n", debugstr_wn((WCHAR *)buffer, len));
+ ret = TRUE;
+ }
+ *buflen = len * sizeof(WCHAR);
+ if (request_only) heap_free( headers );
+ return ret;
+ }
case WINHTTP_QUERY_RAW_HEADERS_CRLF:
{
WCHAR *headers;
- DWORD len;
if (request_only)
headers = build_request_string( request );
@@ -551,7 +586,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
if (!headers) return FALSE;
len = strlenW( headers ) * sizeof(WCHAR);
- if (len + sizeof(WCHAR) > *buflen)
+ if (len + sizeof(WCHAR) > *buflen || !buffer)
{
len += sizeof(WCHAR);
set_last_error( ERROR_INSUFFICIENT_BUFFER );
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 012d703..71e4efa 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -287,7 +287,7 @@ static void test_WinHttpAddHeaders(void)
ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
test_header_name, NULL, &len, &index);
ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
- todo_wine ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
ok(index == 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
@@ -331,6 +331,30 @@ static void test_WinHttpAddHeaders(void)
"WinHttpQueryHeaders returned invalid end of header string.\n");
ok(index == 0, "WinHttpQueryHeaders incremented header index.\n");
+ index = 0;
+ len = 0;
+ SetLastError(0xdeadbeef);
+ ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
+ test_header_name, NULL, &len, &index);
+ ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
+ "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
+ ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
+ ok(index == 0, "WinHttpQueryHeaders failed: index was incremented.\n");
+
+ oldlen = len;
+ index = 0;
+ len = sizeof(buffer);
+ memset(buffer, 0xff, sizeof(buffer));
+ ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
+ test_header_name, buffer, &len, &index);
+ ok(ret == TRUE, "WinHttpQueryHeaders failed %u\n", GetLastError());
+ ok(len + sizeof(WCHAR) <= oldlen, "resulting length longer than advertized\n");
+ ok((len < sizeof(buffer) - sizeof(WCHAR)) && !buffer[len / sizeof(WCHAR)] && !buffer[len / sizeof(WCHAR) - 1],
+ "no double NULL terminator\n");
+ ok(!memcmp(buffer, test_header_begin, sizeof(test_header_begin)), "invalid beginning of header string\n");
+ ok(index == 0, "header index was incremented\n");
+
/* tests for more indices */
ret = WinHttpAddRequestHeaders(request, test_headers[1], -1L, WINHTTP_ADDREQ_FLAG_ADD);
ok(ret == TRUE, "WinHttpAddRequestHeaders failed to add duplicate header: %d\n", ret);
More information about the wine-cvs
mailing list