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;
|
||||
int socketFD;
|
||||
void *ssl_s;
|
||||
char *peek_msg;
|
||||
char *peek_msg_mem;
|
||||
size_t peek_len;
|
||||
} WININET_NETCONNECTION;
|
||||
|
||||
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,
|
||||
int *recvd /* out */);
|
||||
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);
|
||||
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 */
|
||||
|
||||
meth = pSSLv23_method();
|
||||
connection->peek_msg = NULL;
|
||||
connection->peek_msg_mem = NULL;
|
||||
#else
|
||||
FIXME("can't use SSL, not compiled in.\n");
|
||||
INTERNET_SetLastError(ERROR_INTERNET_SECURITY_CHANNEL_ERROR);
|
||||
|
@ -329,11 +327,6 @@ BOOL NETCON_close(WININET_NETCONNECTION *connection)
|
|||
#ifdef SONAME_LIBSSL
|
||||
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_free(connection->ssl_s);
|
||||
connection->ssl_s = NULL;
|
||||
|
@ -541,54 +534,7 @@ BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int f
|
|||
else
|
||||
{
|
||||
#ifdef SONAME_LIBSSL
|
||||
size_t peek_read = 0, read;
|
||||
|
||||
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;
|
||||
*recvd = pSSL_read(connection->ssl_s, buf, len);
|
||||
return *recvd > 0 || !len;
|
||||
#else
|
||||
return FALSE;
|
||||
|
@ -607,13 +553,9 @@ BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *avail
|
|||
if (!NETCON_connected(connection))
|
||||
return FALSE;
|
||||
|
||||
#ifdef SONAME_LIBSSL
|
||||
if (connection->peek_msg) *available = connection->peek_len + pSSL_pending(connection->ssl_s);
|
||||
#endif
|
||||
|
||||
#ifdef FIONREAD
|
||||
if (!connection->useSSL)
|
||||
{
|
||||
#ifdef FIONREAD
|
||||
int unread;
|
||||
int retval = ioctlsocket(connection->socketFD, FIONREAD, &unread);
|
||||
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);
|
||||
*available += unread;
|
||||
}
|
||||
}
|
||||
#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
|
||||
{
|
||||
#ifdef SONAME_LIBSSL
|
||||
long prev_timeout;
|
||||
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;
|
||||
}
|
||||
*available = pSSL_pending(connection->ssl_s);
|
||||
#endif
|
||||
}
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection)
|
||||
{
|
||||
#ifdef SONAME_LIBSSL
|
||||
|
|
Loading…
Reference in New Issue