Jacek Caban : winhttp: Added schannel-based netconn_send implementation.

Alexandre Julliard julliard at winehq.org
Thu Jan 24 12:59:48 CST 2013


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jan 23 15:49:46 2013 +0100

winhttp: Added schannel-based netconn_send implementation.

---

 dlls/winhttp/net.c |   49 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/dlls/winhttp/net.c b/dlls/winhttp/net.c
index 664bef7..2e16cc0 100644
--- a/dlls/winhttp/net.c
+++ b/dlls/winhttp/net.c
@@ -909,18 +909,63 @@ fail:
     return TRUE;
 }
 
+#ifndef SONAME_LIBSSL
+static BOOL send_ssl_chunk(netconn_t *conn, const void *msg, size_t size)
+{
+    SecBuffer bufs[4] = {
+        {conn->ssl_sizes.cbHeader, SECBUFFER_STREAM_HEADER, conn->ssl_buf},
+        {size,  SECBUFFER_DATA, conn->ssl_buf+conn->ssl_sizes.cbHeader},
+        {conn->ssl_sizes.cbTrailer, SECBUFFER_STREAM_TRAILER, conn->ssl_buf+conn->ssl_sizes.cbHeader+size},
+        {0, SECBUFFER_EMPTY, NULL}
+    };
+    SecBufferDesc buf_desc = {SECBUFFER_VERSION, sizeof(bufs)/sizeof(*bufs), bufs};
+    SECURITY_STATUS res;
+
+    memcpy(bufs[1].pvBuffer, msg, size);
+    res = EncryptMessage(&conn->ssl_ctx, 0, &buf_desc, 0);
+    if(res != SEC_E_OK) {
+        WARN("EncryptMessage failed\n");
+        return FALSE;
+    }
+
+    if(send(conn->socket, conn->ssl_buf, bufs[0].cbBuffer+bufs[1].cbBuffer+bufs[2].cbBuffer, 0) < 1) {
+        WARN("send failed\n");
+        return FALSE;
+    }
+
+    return TRUE;
+}
+#endif
+
 BOOL netconn_send( netconn_t *conn, const void *msg, size_t len, int flags, int *sent )
 {
     if (!netconn_connected( conn )) return FALSE;
     if (conn->secure)
     {
 #ifdef SONAME_LIBSSL
-        if (flags) FIXME("SSL_write doesn't support any flags (%08x)\n", flags);
+        if (flags) FIXME("flags %08x not supported in SSL\n", flags);
         *sent = pSSL_write( conn->ssl_conn, msg, len );
         if (*sent < 1 && len) return FALSE;
         return TRUE;
 #else
-        return FALSE;
+        const BYTE *ptr = msg;
+        size_t chunk_size;
+
+        if (flags) FIXME("flags %08x not supported in SSL\n", flags);
+
+        *sent = 0;
+
+        while(len) {
+            chunk_size = min(len, conn->ssl_sizes.cbMaximumMessage);
+            if(!send_ssl_chunk(conn, ptr, chunk_size))
+                return FALSE;
+
+            *sent += chunk_size;
+            ptr += chunk_size;
+            len -= chunk_size;
+        }
+
+        return TRUE;
 #endif
     }
     if ((*sent = send( conn->socket, msg, len, flags )) == -1)




More information about the wine-cvs mailing list