wininet: Get rid of the SSL-specific read-ahead buffer.
This commit is contained in:
parent
bb5d973127
commit
d1de5f37d0
|
@ -53,9 +53,6 @@ typedef struct
|
||||||
BOOL useSSL;
|
BOOL useSSL;
|
||||||
int socketFD;
|
int socketFD;
|
||||||
void *ssl_s;
|
void *ssl_s;
|
||||||
char *peek_msg;
|
|
||||||
char *peek_msg_mem;
|
|
||||||
size_t peek_len;
|
|
||||||
} WININET_NETCONNECTION;
|
} WININET_NETCONNECTION;
|
||||||
|
|
||||||
static inline LPWSTR WININET_strdupW( LPCWSTR str )
|
static inline LPWSTR WININET_strdupW( LPCWSTR str )
|
||||||
|
@ -414,7 +411,6 @@ BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len,
|
||||||
BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
|
BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
|
||||||
int *recvd /* out */);
|
int *recvd /* out */);
|
||||||
BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available);
|
BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available);
|
||||||
BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
|
|
||||||
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
|
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
|
||||||
DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
|
DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
|
||||||
|
|
||||||
|
|
|
@ -209,8 +209,6 @@ BOOL NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL)
|
||||||
pBIO_new_fp(stderr, BIO_NOCLOSE); /* FIXME: should use winedebug stuff */
|
pBIO_new_fp(stderr, BIO_NOCLOSE); /* FIXME: should use winedebug stuff */
|
||||||
|
|
||||||
meth = pSSLv23_method();
|
meth = pSSLv23_method();
|
||||||
connection->peek_msg = NULL;
|
|
||||||
connection->peek_msg_mem = NULL;
|
|
||||||
#else
|
#else
|
||||||
FIXME("can't use SSL, not compiled in.\n");
|
FIXME("can't use SSL, not compiled in.\n");
|
||||||
INTERNET_SetLastError(ERROR_INTERNET_SECURITY_CHANNEL_ERROR);
|
INTERNET_SetLastError(ERROR_INTERNET_SECURITY_CHANNEL_ERROR);
|
||||||
|
@ -329,11 +327,6 @@ BOOL NETCON_close(WININET_NETCONNECTION *connection)
|
||||||
#ifdef SONAME_LIBSSL
|
#ifdef SONAME_LIBSSL
|
||||||
if (connection->useSSL)
|
if (connection->useSSL)
|
||||||
{
|
{
|
||||||
HeapFree(GetProcessHeap(),0,connection->peek_msg_mem);
|
|
||||||
connection->peek_msg = NULL;
|
|
||||||
connection->peek_msg_mem = NULL;
|
|
||||||
connection->peek_len = 0;
|
|
||||||
|
|
||||||
pSSL_shutdown(connection->ssl_s);
|
pSSL_shutdown(connection->ssl_s);
|
||||||
pSSL_free(connection->ssl_s);
|
pSSL_free(connection->ssl_s);
|
||||||
connection->ssl_s = NULL;
|
connection->ssl_s = NULL;
|
||||||
|
@ -541,54 +534,7 @@ BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int f
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef SONAME_LIBSSL
|
#ifdef SONAME_LIBSSL
|
||||||
size_t peek_read = 0, read;
|
*recvd = pSSL_read(connection->ssl_s, buf, len);
|
||||||
|
|
||||||
if (flags & ~(MSG_PEEK|MSG_WAITALL))
|
|
||||||
FIXME("SSL_read does not support the following flag: %08x\n", flags);
|
|
||||||
|
|
||||||
/* this ugly hack is all for MSG_PEEK. eww gross */
|
|
||||||
if(connection->peek_msg) {
|
|
||||||
if(connection->peek_len >= len) {
|
|
||||||
memcpy(buf, connection->peek_msg, len);
|
|
||||||
if(!(flags & MSG_PEEK)) {
|
|
||||||
if(connection->peek_len == len) {
|
|
||||||
HeapFree(GetProcessHeap(), 0, connection->peek_msg);
|
|
||||||
connection->peek_msg = NULL;
|
|
||||||
connection->peek_len = 0;
|
|
||||||
}else {
|
|
||||||
memmove(connection->peek_msg, connection->peek_msg+len, connection->peek_len-len);
|
|
||||||
connection->peek_len -= len;
|
|
||||||
connection->peek_msg = HeapReAlloc(GetProcessHeap(), 0, connection->peek_msg, connection->peek_len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*recvd = len;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(buf, connection->peek_msg, connection->peek_len);
|
|
||||||
peek_read = connection->peek_len;
|
|
||||||
|
|
||||||
if(!(flags & MSG_PEEK)) {
|
|
||||||
HeapFree(GetProcessHeap(), 0, connection->peek_msg);
|
|
||||||
connection->peek_msg = NULL;
|
|
||||||
connection->peek_len = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
read = pSSL_read(connection->ssl_s, (BYTE*)buf+peek_read, len-peek_read);
|
|
||||||
|
|
||||||
if(flags & MSG_PEEK) {
|
|
||||||
if(connection->peek_msg)
|
|
||||||
connection->peek_msg = HeapReAlloc(GetProcessHeap(), 0, connection->peek_msg,
|
|
||||||
connection->peek_len+read);
|
|
||||||
else
|
|
||||||
connection->peek_msg = HeapAlloc(GetProcessHeap(), 0, read);
|
|
||||||
memcpy(connection->peek_msg+connection->peek_len, (BYTE*)buf+peek_read, read);
|
|
||||||
connection->peek_len += read;
|
|
||||||
}
|
|
||||||
|
|
||||||
*recvd = read + peek_read;
|
|
||||||
return *recvd > 0 || !len;
|
return *recvd > 0 || !len;
|
||||||
#else
|
#else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -607,13 +553,9 @@ BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *avail
|
||||||
if (!NETCON_connected(connection))
|
if (!NETCON_connected(connection))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
#ifdef SONAME_LIBSSL
|
|
||||||
if (connection->peek_msg) *available = connection->peek_len + pSSL_pending(connection->ssl_s);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FIONREAD
|
|
||||||
if (!connection->useSSL)
|
if (!connection->useSSL)
|
||||||
{
|
{
|
||||||
|
#ifdef FIONREAD
|
||||||
int unread;
|
int unread;
|
||||||
int retval = ioctlsocket(connection->socketFD, FIONREAD, &unread);
|
int retval = ioctlsocket(connection->socketFD, FIONREAD, &unread);
|
||||||
if (!retval)
|
if (!retval)
|
||||||
|
@ -621,99 +563,17 @@ BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *avail
|
||||||
TRACE("%d bytes of queued, but unread data\n", unread);
|
TRACE("%d bytes of queued, but unread data\n", unread);
|
||||||
*available += unread;
|
*available += unread;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* NETCON_getNextLine
|
|
||||||
*/
|
|
||||||
BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer)
|
|
||||||
{
|
|
||||||
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
if (!NETCON_connected(connection)) return FALSE;
|
|
||||||
|
|
||||||
if (!connection->useSSL)
|
|
||||||
{
|
|
||||||
struct pollfd pfd;
|
|
||||||
DWORD nRecv = 0;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
pfd.fd = connection->socketFD;
|
|
||||||
pfd.events = POLLIN;
|
|
||||||
|
|
||||||
while (nRecv < *dwBuffer)
|
|
||||||
{
|
|
||||||
if (poll(&pfd,1, RESPONSE_TIMEOUT * 1000) > 0)
|
|
||||||
{
|
|
||||||
if ((ret = recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0)) <= 0)
|
|
||||||
{
|
|
||||||
if (ret == -1) INTERNET_SetLastError(sock_get_error(errno));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lpszBuffer[nRecv] == '\n')
|
|
||||||
{
|
|
||||||
lpszBuffer[nRecv++] = '\0';
|
|
||||||
*dwBuffer = nRecv;
|
|
||||||
TRACE(":%u %s\n", nRecv, debugstr_a(lpszBuffer));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
if (lpszBuffer[nRecv] != '\r')
|
|
||||||
nRecv++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
INTERNET_SetLastError(ERROR_INTERNET_TIMEOUT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef SONAME_LIBSSL
|
#ifdef SONAME_LIBSSL
|
||||||
long prev_timeout;
|
*available = pSSL_pending(connection->ssl_s);
|
||||||
DWORD nRecv = 0;
|
|
||||||
BOOL success = TRUE;
|
|
||||||
|
|
||||||
prev_timeout = pSSL_CTX_get_timeout(ctx);
|
|
||||||
pSSL_CTX_set_timeout(ctx, RESPONSE_TIMEOUT);
|
|
||||||
|
|
||||||
while (nRecv < *dwBuffer)
|
|
||||||
{
|
|
||||||
int recv = 1;
|
|
||||||
if (!NETCON_recv(connection, &lpszBuffer[nRecv], 1, 0, &recv))
|
|
||||||
{
|
|
||||||
INTERNET_SetLastError(ERROR_CONNECTION_ABORTED);
|
|
||||||
success = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lpszBuffer[nRecv] == '\n')
|
|
||||||
{
|
|
||||||
success = TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (lpszBuffer[nRecv] != '\r')
|
|
||||||
nRecv++;
|
|
||||||
}
|
|
||||||
|
|
||||||
pSSL_CTX_set_timeout(ctx, prev_timeout);
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
lpszBuffer[nRecv++] = '\0';
|
|
||||||
*dwBuffer = nRecv;
|
|
||||||
TRACE("_SSL:%u %s\n", nRecv, lpszBuffer);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return FALSE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection)
|
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection)
|
||||||
{
|
{
|
||||||
#ifdef SONAME_LIBSSL
|
#ifdef SONAME_LIBSSL
|
||||||
|
|
Loading…
Reference in New Issue