BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) { struct pollfd pfd; BOOL ret = FALSE; DWORD recvd = 0; if (!netconn_connected( conn )) return FALSE; if (conn->secure) { #ifdef SONAME_LIBSSL long timeout; timeout = pSSL_CTX_get_timeout( ctx ); pSSL_CTX_set_timeout( ctx, DEFAULT_RECEIVE_TIMEOUT ); while (recvd < *buflen) { int dummy; if (!netconn_recv( conn, &buffer[recvd], 1, 0, &dummy )) { set_last_error( ERROR_CONNECTION_ABORTED ); break; } if (buffer[recvd] == '\n') { ret = TRUE; break; } if (buffer[recvd] != '\r') recvd++; } pSSL_CTX_set_timeout( ctx, timeout ); if (ret) { buffer[recvd++] = 0; *buflen = recvd; TRACE("received line %s\n", debugstr_a(buffer)); } return ret; #else return FALSE; #endif } pfd.fd = conn->socket; pfd.events = POLLIN; while (recvd < *buflen) { if (poll( &pfd, 1, DEFAULT_RECEIVE_TIMEOUT * 1000 ) > 0) { int res; if ((res = recv( conn->socket, &buffer[recvd], 1, 0 )) <= 0) { if (res == -1) set_last_error( sock_get_error( errno ) ); break; } if (buffer[recvd] == '\n') { ret = TRUE; break; } if (buffer[recvd] != '\r') recvd++; } else { set_last_error( ERROR_WINHTTP_TIMEOUT ); break; } } if (ret) { buffer[recvd++] = 0; *buflen = recvd; TRACE("received line %s\n", debugstr_a(buffer)); } return ret; }
/****************************************************************************** * 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; BOOL bSuccess = FALSE; DWORD nRecv = 0; pfd.fd = connection->socketFD; pfd.events = POLLIN; while (nRecv < *dwBuffer) { if (poll(&pfd,1, RESPONSE_TIMEOUT * 1000) > 0) { if (recv(connection->socketFD, &lpszBuffer[nRecv], 1, 0) <= 0) { INTERNET_SetLastError(sock_get_error(errno)); goto lend; } if (lpszBuffer[nRecv] == '\n') { bSuccess = TRUE; break; } if (lpszBuffer[nRecv] != '\r') nRecv++; } else { INTERNET_SetLastError(ERROR_INTERNET_TIMEOUT); goto lend; } } lend: /* FIXME: don't use labels */ if (bSuccess) { lpszBuffer[nRecv++] = '\0'; *dwBuffer = nRecv; TRACE(":%u %s\n", nRecv, lpszBuffer); return TRUE; } else { return FALSE; } } 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; } return FALSE; #else return FALSE; #endif } }