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