From 131801fc70e004e2b20e61ba7144080c663a9074 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 2 Mar 2020 21:35:01 -0600 Subject: [PATCH] http.sys: Handle the "+" URL wildcard. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48530 Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/http.sys/http.c | 6 +++++ dlls/httpapi/tests/httpapi.c | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/dlls/http.sys/http.c b/dlls/http.sys/http.c index 25c8a1955a7..f424a4fecc3 100644 --- a/dlls/http.sys/http.c +++ b/dlls/http.sys/http.c @@ -802,6 +802,12 @@ static BOOL host_matches(const struct connection *conn, const struct request_que { const char *conn_host = (conn->url[0] == '/') ? conn->host : conn->url + 7; + if (queue->url[7] == '+') + { + const char *queue_port = strchr(queue->url + 7, ':'); + return !strncmp(queue_port, strchr(conn_host, ':'), strlen(queue_port) - 1 /* strip final slash */); + } + return !memicmp(queue->url + 7, conn_host, strlen(queue->url) - 8 /* strip final slash */); } diff --git a/dlls/httpapi/tests/httpapi.c b/dlls/httpapi/tests/httpapi.c index 5a9f3c3178e..fa39742cb16 100644 --- a/dlls/httpapi/tests/httpapi.c +++ b/dlls/httpapi/tests/httpapi.c @@ -1086,6 +1086,56 @@ static void test_v1_unknown_tokens(void) ok(ret, "Failed to close queue handle, error %u.\n", GetLastError()); } +static void test_v1_urls(void) +{ + char DECLSPEC_ALIGN(8) req_buffer[2048]; + HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer; + unsigned short port; + char req_text[200]; + DWORD ret_size; + WCHAR url[50]; + HANDLE queue; + ULONG ret; + SOCKET s; + + ret = HttpCreateHttpHandle(&queue, 0); + ok(!ret, "Got error %u.\n", ret); + + for (port = 50000; port < 51000; ++port) + { + swprintf(url, ARRAY_SIZE(url), L"http://+:%u/", port); + if (!(ret = HttpAddUrl(queue, url, NULL))) + break; + if (ret == ERROR_ACCESS_DENIED) + { + skip("Not enough permissions to bind to all URLs.\n"); + CloseHandle(queue); + return; + } + ok(ret == ERROR_SHARING_VIOLATION, "Failed to add %s, error %u.\n", debugstr_w(url), ret); + } + + ok(!ret, "Got error %u.\n", ret); + + s = create_client_socket(port); + sprintf(req_text, simple_req, port); + ret = send(s, req_text, strlen(req_text), 0); + ok(ret == strlen(req_text), "send() returned %d.\n", ret); + + memset(req_buffer, 0xcc, sizeof(req_buffer)); + ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL); + ok(!ret, "Got error %u.\n", ret); + ok(ret_size > sizeof(*req), "Got size %u.\n", ret_size); + + send_response_v1(queue, req->RequestId, s); + + ret = HttpRemoveUrl(queue, url); + ok(!ret, "Got error %u.\n", ret); + closesocket(s); + ret = CloseHandle(queue); + ok(ret, "Failed to close queue handle, error %u.\n", GetLastError()); +} + static void test_HttpCreateServerSession(void) { HTTP_SERVER_SESSION_ID session; @@ -1478,6 +1528,7 @@ START_TEST(httpapi) test_v1_bad_request(); test_v1_cooked_url(); test_v1_unknown_tokens(); + test_v1_urls(); ret = HttpTerminate(HTTP_INITIALIZE_SERVER, NULL); ok(!ret, "Failed to terminate, ret %u.\n", ret);