Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/httpapi/httpapi_main.c | 56 ++++++++++++++++++++++++++++++++---- dlls/httpapi/tests/httpapi.c | 7 ----- include/http.h | 2 +- 3 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/dlls/httpapi/httpapi_main.c b/dlls/httpapi/httpapi_main.c index c970c68ccad..a71dcc5ce83 100644 --- a/dlls/httpapi/httpapi_main.c +++ b/dlls/httpapi/httpapi_main.c @@ -23,6 +23,7 @@ #include "winternl.h" #include "wine/debug.h" #include "wine/heap.h" +#include "wine/list.h"
WINE_DEFAULT_DEBUG_CHANNEL(httpapi);
@@ -470,20 +471,63 @@ ULONG WINAPI HttpSendHttpResponse(HANDLE queue, HTTP_REQUEST_ID id, ULONG flags, return ret; }
+struct server_session +{ + struct list entry; +}; + +static struct list server_sessions = LIST_INIT(server_sessions); + +static struct server_session *get_server_session(HTTP_SERVER_SESSION_ID id) +{ + struct server_session *session; + LIST_FOR_EACH_ENTRY(session, &server_sessions, struct server_session, entry) + { + if ((HTTP_SERVER_SESSION_ID)(ULONG_PTR)session == id) + return session; + } + return NULL; +} + /*********************************************************************** * HttpCreateServerSession (HTTPAPI.@) */ -ULONG WINAPI HttpCreateServerSession( HTTPAPI_VERSION version, HTTP_SERVER_SESSION_ID *id, ULONG reserved ) +ULONG WINAPI HttpCreateServerSession(HTTPAPI_VERSION version, HTTP_SERVER_SESSION_ID *id, ULONG reserved) { - FIXME( "({%d,%d}, %p, %d): stub!\n", version.HttpApiMajorVersion, version.HttpApiMinorVersion, id, reserved ); - return ERROR_ACCESS_DENIED; + struct server_session *session; + + TRACE("version %u.%u, id %p, reserved %u.\n", version.HttpApiMajorVersion, + version.HttpApiMinorVersion, id, reserved); + + if (!id) + return ERROR_INVALID_PARAMETER; + + if ((version.HttpApiMajorVersion != 1 && version.HttpApiMajorVersion != 2) + || version.HttpApiMinorVersion) + return ERROR_REVISION_MISMATCH; + + if (!(session = heap_alloc(sizeof(*session)))) + return ERROR_OUTOFMEMORY; + + list_add_tail(&server_sessions, &session->entry); + + *id = (ULONG_PTR)session; + return ERROR_SUCCESS; }
/*********************************************************************** * HttpCloseServerSession (HTTPAPI.@) */ -ULONG WINAPI HttpCloseServerSession( HTTP_SERVER_SESSION_ID id ) +ULONG WINAPI HttpCloseServerSession(HTTP_SERVER_SESSION_ID id) { - FIXME( "(%s): stub!\n", wine_dbgstr_longlong(id)); - return ERROR_INVALID_PARAMETER; + struct server_session *session; + + TRACE("id %s.\n", wine_dbgstr_longlong(id)); + + if (!(session = get_server_session(id))) + return ERROR_INVALID_PARAMETER; + + list_remove(&session->entry); + heap_free(session); + return ERROR_SUCCESS; } diff --git a/dlls/httpapi/tests/httpapi.c b/dlls/httpapi/tests/httpapi.c index 94804a9904d..2153361c59c 100644 --- a/dlls/httpapi/tests/httpapi.c +++ b/dlls/httpapi/tests/httpapi.c @@ -888,37 +888,30 @@ static void test_HttpCreateServerSession(void) version.HttpApiMajorVersion = 1; version.HttpApiMinorVersion = 0; ret = pHttpCreateServerSession(version, NULL, 0); -todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Unexpected return value %u.\n", ret);
version.HttpApiMajorVersion = 1; version.HttpApiMinorVersion = 1; ret = pHttpCreateServerSession(version, &session, 0); -todo_wine ok(ret == ERROR_REVISION_MISMATCH, "Unexpected return value %u.\n", ret);
version.HttpApiMajorVersion = 3; version.HttpApiMinorVersion = 0; ret = pHttpCreateServerSession(version, &session, 0); -todo_wine ok(ret == ERROR_REVISION_MISMATCH, "Unexpected return value %u.\n", ret);
version.HttpApiMajorVersion = 2; version.HttpApiMinorVersion = 0; ret = pHttpCreateServerSession(version, &session, 0); -todo_wine ok(!ret, "Unexpected return value %u.\n", ret); ret = pHttpCloseServerSession(session); -todo_wine ok(!ret, "Unexpected return value %u.\n", ret);
version.HttpApiMajorVersion = 1; version.HttpApiMinorVersion = 0; ret = pHttpCreateServerSession(version, &session, 0); -todo_wine ok(!ret, "Unexpected return value %u.\n", ret); ret = pHttpCloseServerSession(session); -todo_wine ok(!ret, "Unexpected return value %u.\n", ret);
ret = pHttpCloseServerSession(0xdead); diff --git a/include/http.h b/include/http.h index 84d3445b672..dc4af74a477 100644 --- a/include/http.h +++ b/include/http.h @@ -398,9 +398,9 @@ typedef struct _HTTP_LOG_DATA } HTTP_LOG_DATA, *PHTTP_LOG_DATA;
ULONG WINAPI HttpAddUrl(HANDLE,PCWSTR,PVOID); +ULONG WINAPI HttpCloseServerSession(HTTP_SERVER_SESSION_ID id); ULONG WINAPI HttpCreateHttpHandle(PHANDLE,ULONG); ULONG WINAPI HttpCreateServerSession(HTTPAPI_VERSION,PHTTP_SERVER_SESSION_ID,ULONG); -ULONG WINAPI HttpCloseServerSession(HTTP_SERVER_SESSION_ID); ULONG WINAPI HttpDeleteServiceConfiguration(HANDLE,HTTP_SERVICE_CONFIG_ID,PVOID,ULONG,LPOVERLAPPED); ULONG WINAPI HttpInitialize(HTTPAPI_VERSION version, ULONG flags, void *reserved); ULONG WINAPI HttpTerminate(ULONG flags, void *reserved);