wininet: InternetQueryDataAvailable does not return ERROR_NO_MORE_FILES when no more HTTP data is available.

This commit is contained in:
Misha Koshelev 2007-08-12 15:40:46 -05:00 committed by Alexandre Julliard
parent 662f44a619
commit 6ea2441ff9
2 changed files with 26 additions and 36 deletions

View File

@ -3314,49 +3314,39 @@ BOOL WINAPI InternetQueryDataAvailable( HINTERNET hFile,
switch (lpwhr->hdr.htype)
{
case WH_HHTTPREQ:
retval = TRUE;
if (NETCON_query_data_available(&lpwhr->netConnection,
lpdwNumberOfBytesAvailble))
lpdwNumberOfBytesAvailble) &&
!*lpdwNumberOfBytesAvailble)
{
retval = TRUE;
if (!*lpdwNumberOfBytesAvailble)
/* Even if we are in async mode, we need to determine whether
* there is actually more data available. We do this by trying
* to peek only a single byte in async mode. */
BOOL async = (lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC);
if (NETCON_recv(&lpwhr->netConnection, buffer,
min(async ? 1 : sizeof(buffer),
lpwhr->dwContentLength - lpwhr->dwContentRead),
MSG_PEEK, (int *)lpdwNumberOfBytesAvailble) &&
async && *lpdwNumberOfBytesAvailble)
{
/* Even if we are in async mode, we need to determine whether
* there is actually more data available. We do this by trying
* to peek only a single byte in async mode. */
BOOL async = (lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC);
if (!NETCON_recv(&lpwhr->netConnection, buffer,
min(async ? 1 : sizeof(buffer),
lpwhr->dwContentLength - lpwhr->dwContentRead),
MSG_PEEK, (int *)lpdwNumberOfBytesAvailble))
WORKREQUEST workRequest;
*lpdwNumberOfBytesAvailble = 0;
workRequest.asyncproc = AsyncInternetQueryDataAvailableProc;
workRequest.hdr = WININET_AddRef( &lpwhr->hdr );
retval = INTERNET_AsyncCall(&workRequest);
if (!retval)
{
INTERNET_SetLastError(ERROR_NO_MORE_FILES);
WININET_Release( &lpwhr->hdr );
}
else
{
INTERNET_SetLastError(ERROR_IO_PENDING);
retval = FALSE;
}
else if (async && *lpdwNumberOfBytesAvailble)
{
WORKREQUEST workRequest;
*lpdwNumberOfBytesAvailble = 0;
workRequest.asyncproc = AsyncInternetQueryDataAvailableProc;
workRequest.hdr = WININET_AddRef( &lpwhr->hdr );
retval = INTERNET_AsyncCall(&workRequest);
if (!retval)
{
WININET_Release( &lpwhr->hdr );
}
else
{
INTERNET_SetLastError(ERROR_IO_PENDING);
retval = FALSE;
}
}
}
}
else
{
INTERNET_SetLastError(ERROR_NO_MORE_FILES);
}
break;
default:

View File

@ -572,10 +572,10 @@ BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int f
*/
BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available)
{
*available = 0;
if (!NETCON_connected(connection))
return FALSE;
*available = 0;
#ifdef SONAME_LIBSSL
if (connection->peek_msg) *available = connection->peek_len;
#endif