[PATCH 4/5] httpapi: Implement HttpCreateServerSession() and HttpCloseServerSession().

Zebediah Figura z.figura12 at gmail.com
Wed Aug 28 20:45:30 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at 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);
-- 
2.22.0




More information about the wine-devel mailing list