http post support

Mike McCormack mike at codeweavers.com
Mon Aug 4 02:07:28 CDT 2003


This patch was merged from WineX's LGPLed wininet code, but I haven't 
tested it.

Mike


ChangeLog:
David Hammerton <david at transgaming.com>
* add support for http-POST.
(well, any kind of http request that sends data in the lpOptional field)
-------------- next part --------------
Index: dlls/wininet/http.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/http.c,v
retrieving revision 1.38
diff -u -r1.38 http.c
--- dlls/wininet/http.c	22 Jul 2003 03:17:52 -0000	1.38
+++ dlls/wininet/http.c	4 Aug 2003 06:42:34 -0000
@@ -940,7 +940,8 @@
     LPWININETHTTPSESSIONA lpwhs = NULL;
     LPWININETAPPINFOA hIC = NULL;
 
-    TRACE("0x%08lx\n", (unsigned long)hHttpRequest);
+    TRACE("(0x%08lx, %p (%s), %li, %p, %li)\n", (unsigned long)hHttpRequest,
+            lpszHeaders, debugstr_a(lpszHeaders), dwHeaderLength, lpOptional, dwOptionalLength);
 
     if (NULL == lpwhr || lpwhr->hdr.htype != WH_HHTTPREQ)
     {
@@ -1192,6 +1193,14 @@
 	    goto lend;
     }
 
+    /* if we are using optional stuff, we must add the fixed header of that option length */
+    if (lpOptional && dwOptionalLength)
+    {
+        char contentLengthStr[strlen("Content-Length: ") + 20 /* int */ + 2 /* \n\r */];
+        sprintf(contentLengthStr, "Content-Length: %li\r\n", dwOptionalLength);
+        HttpAddRequestHeadersA(hHttpRequest, contentLengthStr, -1L, HTTP_ADDREQ_FLAG_ADD);
+    }
+
     do
     {
         TRACE("Going to url %s %s\n", debugstr_a(lpwhr->lpszHostName), debugstr_a(lpwhr->lpszPath));
@@ -1255,6 +1264,11 @@
         if (lpwhr->lpszHostName)
             requestStringLen += (strlen(HTTPHOSTHEADER) + strlen(lpwhr->lpszHostName));
 
+        /* if there is optional data to send, add the length */
+        if (lpOptional)
+        {
+            requestStringLen += dwOptionalLength;
+        }
 
         /* Allocate string to hold entire request */
         requestString = HeapAlloc(GetProcessHeap(), 0, requestStringLen + 1);
@@ -1302,6 +1316,33 @@
             cnt += 2;
             strcpy(requestString + cnt, lpszHeaders);
             cnt += headerLength;
+        }
+
+        /* Set (header) termination string for request */
+        if (memcmp((requestString + cnt) - 4, "\r\n\r\n", 4) != 0)
+        { /* only add it if the request string doesn't already
+             have the thing.. (could happen if the custom header
+             added it */
+                strcpy(requestString + cnt, "\r\n");
+                cnt += 2;
+        }
+        else
+            requestStringLen -= 2;
+ 
+        /* if optional data, append it */
+        if (lpOptional)
+        {
+            memcpy(requestString + cnt, lpOptional, dwOptionalLength);
+            cnt += dwOptionalLength;
+            /* we also have to decrease the expected string length by two,
+             * since we won't be adding on those following \r\n's */
+            requestStringLen -= 2;
+        }
+        else
+        { /* if there is no optional data, add on another \r\n just to be safe */
+                /* termination for request */
+                strcpy(requestString + cnt, "\r\n");
+                cnt += 2;
         }
 
         /* Set termination string for request */


More information about the wine-patches mailing list