Zebediah Figura : http.sys: Handle the "+" URL wildcard.
Alexandre Julliard
julliard at winehq.org
Tue Mar 3 16:24:51 CST 2020
Module: wine
Branch: master
Commit: 131801fc70e004e2b20e61ba7144080c663a9074
URL: https://source.winehq.org/git/wine.git/?a=commit;h=131801fc70e004e2b20e61ba7144080c663a9074
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Mon Mar 2 21:35:01 2020 -0600
http.sys: Handle the "+" URL wildcard.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48530
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 25c8a1955a..f424a4fecc 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 5a9f3c3178..fa39742cb1 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);
More information about the wine-cvs
mailing list