Hans Leidekker : winhttp: Implement WinHttpOpenRequest.

Alexandre Julliard julliard at winehq.org
Tue Aug 19 08:46:58 CDT 2008


Module: wine
Branch: master
Commit: ce00aa019f344403a41eb56f9ed8799a97304b26
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ce00aa019f344403a41eb56f9ed8799a97304b26

Author: Hans Leidekker <hans at meelstraat.net>
Date:   Fri Aug 15 14:42:41 2008 +0200

winhttp: Implement WinHttpOpenRequest.

---

 dlls/winhttp/main.c            |   14 ------
 dlls/winhttp/session.c         |   87 ++++++++++++++++++++++++++++++++++++++++
 dlls/winhttp/tests/winhttp.c   |   13 +++---
 dlls/winhttp/winhttp_private.h |   32 +++++++++++++++
 4 files changed, 125 insertions(+), 21 deletions(-)

diff --git a/dlls/winhttp/main.c b/dlls/winhttp/main.c
index 6133590..44a1e42 100644
--- a/dlls/winhttp/main.c
+++ b/dlls/winhttp/main.c
@@ -117,20 +117,6 @@ BOOL WINAPI WinHttpGetIEProxyConfigForCurrentUser(WINHTTP_CURRENT_USER_IE_PROXY_
 }
 
 /***********************************************************************
- *          WinHttpOpenRequest (winhttp.@)
- */
-HINTERNET WINAPI WinHttpOpenRequest (HINTERNET hConnect, LPCWSTR pwszVerb, LPCWSTR pwszObjectName,
-                                     LPCWSTR pwszVersion, LPCWSTR pwszReferrer, LPCWSTR* ppwszAcceptTypes,
-                                     DWORD dwFlags)
-{
-    FIXME("(%s, %s, %s, %s, 0x%x): stub\n", debugstr_w(pwszVerb), debugstr_w(pwszObjectName),
-          debugstr_w(pwszVersion), debugstr_w(pwszReferrer), dwFlags);
-
-    SetLastError(ERROR_NOT_SUPPORTED);
-    return NULL;
-}
-
-/***********************************************************************
  *          WinHttpSendRequest (winhttp.@)
  */
 BOOL WINAPI WinHttpSendRequest (HINTERNET hRequest, LPCWSTR pwszHeaders, DWORD dwHeadersLength,
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 8f8ac2f..9a668b3 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -183,6 +183,93 @@ end:
 }
 
 /***********************************************************************
+ *          request_destroy (internal)
+ */
+static void request_destroy( object_header_t *hdr )
+{
+    request_t *request = (request_t *)hdr;
+    int i;
+
+    TRACE("%p\n", request);
+
+    release_object( &request->connect->hdr );
+
+    heap_free( request->verb );
+    heap_free( request->path );
+    heap_free( request->version );
+    heap_free( request->raw_headers );
+    heap_free( request->status_text );
+    for (i = 0; i < request->num_headers; i++)
+    {
+        heap_free( request->headers[i].field );
+        heap_free( request->headers[i].value );
+    }
+    heap_free( request->headers );
+    heap_free( request );
+}
+
+static const object_vtbl_t request_vtbl =
+{
+    request_destroy,
+    NULL,
+    NULL
+};
+
+/***********************************************************************
+ *          WinHttpOpenRequest (winhttp.@)
+ */
+HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR object, LPCWSTR version,
+                                     LPCWSTR referrer, LPCWSTR *types, DWORD flags )
+{
+    request_t *request;
+    connect_t *connect;
+    HINTERNET hrequest = NULL;
+
+    TRACE("%p, %s, %s, %s, %s, %p, 0x%08x\n", hconnect, debugstr_w(verb), debugstr_w(object),
+          debugstr_w(version), debugstr_w(referrer), types, flags);
+
+    if (!(connect = (connect_t *)grab_object( hconnect )))
+    {
+        set_last_error( ERROR_INVALID_HANDLE );
+        return NULL;
+    }
+    if (connect->hdr.type != WINHTTP_HANDLE_TYPE_CONNECT)
+    {
+        release_object( &connect->hdr );
+        set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE );
+        return NULL;
+    }
+    if (!(request = heap_alloc_zero( sizeof(request_t) )))
+    {
+        release_object( &connect->hdr );
+        return NULL;
+    }
+    request->hdr.type = WINHTTP_HANDLE_TYPE_REQUEST;
+    request->hdr.vtbl = &request_vtbl;
+    request->hdr.refs = 1;
+    request->hdr.flags = flags;
+    request->hdr.callback = connect->hdr.callback;
+    request->hdr.notify_mask = connect->hdr.notify_mask;
+
+    addref_object( &connect->hdr );
+    request->connect = connect;
+    list_add_head( &connect->hdr.children, &request->hdr.entry );
+
+    if (verb && !(request->verb = strdupW( verb ))) goto end;
+    if (object && !(request->path = strdupW( object ))) goto end;
+    if (version && !(request->version = strdupW( version ))) goto end;
+
+    if (!(hrequest = alloc_handle( &request->hdr ))) goto end;
+    request->hdr.handle = hrequest;
+
+end:
+    release_object( &request->hdr );
+
+    TRACE("returning %p\n", hrequest);
+    return hrequest;
+}
+
+/***********************************************************************
  *          WinHttpCloseHandle (winhttp.@)
  */
 BOOL WINAPI WinHttpCloseHandle( HINTERNET handle )
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 5f6ce7c..abfa713 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -55,13 +55,12 @@ static void test_OpenRequest (void)
         skip("Network unreachable, skipping.\n");
         goto done;
     }
-    todo_wine ok(request != NULL,
-        "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
+    ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
 
     ret = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, 0, 0);
     todo_wine ok(ret == TRUE, "WinHttpSendRequest failed: %u\n", GetLastError());
     ret = WinHttpCloseHandle(request);
-    todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
+    ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
 
  done:
     ret = WinHttpCloseHandle(connection);
@@ -108,7 +107,7 @@ static void test_SendRequest (void)
         skip("Network unreachable, skipping.\n");
         goto done;
     }
-    todo_wine ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
+    ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
 
     ret = WinHttpSendRequest(request, content_type, header_len, post_data, optional_len, total_len, 0);
     todo_wine ok(ret == TRUE, "WinHttpSendRequest failed: %u\n", GetLastError());
@@ -134,7 +133,7 @@ static void test_SendRequest (void)
         "Data read did not match, got '%s'.\n", buffer);
 
     ret = WinHttpCloseHandle(request);
-    todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
+    ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
  done:
     ret = WinHttpCloseHandle(connection);
     ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
@@ -236,7 +235,7 @@ static void test_WinHttpAddHeaders(void)
         skip("Network unreachable, skipping.\n");
         goto done;
     }
-    todo_wine ok(request != NULL, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
+    ok(request != NULL, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
 
     index = 0;
     len = sizeof(buffer);
@@ -540,7 +539,7 @@ static void test_WinHttpAddHeaders(void)
     ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
 
     ret = WinHttpCloseHandle(request);
-    todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
+    ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
  done:
     ret = WinHttpCloseHandle(connection);
     ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index 74398a6..0f87466 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -78,6 +78,38 @@ typedef struct
     struct sockaddr_in sockaddr;
 } connect_t;
 
+typedef struct
+{
+    int socket;
+    char *peek_msg;
+    char *peek_msg_mem;
+    size_t peek_len;
+} netconn_t;
+
+typedef struct
+{
+    LPWSTR field;
+    LPWSTR value;
+    WORD flags;
+    WORD count;
+} header_t;
+
+typedef struct
+{
+    object_header_t hdr;
+    connect_t *connect;
+    LPWSTR verb;
+    LPWSTR path;
+    LPWSTR version;
+    LPWSTR raw_headers;
+    netconn_t netconn;
+    LPWSTR status_text;
+    DWORD content_length; /* total number of bytes to be read (per chunk) */
+    DWORD content_read;   /* bytes read so far */
+    header_t *headers;
+    DWORD num_headers;
+} request_t;
+
 object_header_t *addref_object( object_header_t * );
 object_header_t *grab_object( HINTERNET );
 void release_object( object_header_t * );




More information about the wine-cvs mailing list