winhttp: Propagate errors from refill_buffer.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=38228 Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
bdfa9d8221
commit
c6251cbb12
|
@ -1949,6 +1949,7 @@ static BOOL end_of_read_data( struct request *request )
|
||||||
static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD *read, BOOL async )
|
static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD *read, BOOL async )
|
||||||
{
|
{
|
||||||
int count, bytes_read = 0;
|
int count, bytes_read = 0;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
if (end_of_read_data( request )) goto done;
|
if (end_of_read_data( request )) goto done;
|
||||||
|
|
||||||
|
@ -1956,7 +1957,7 @@ static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD
|
||||||
{
|
{
|
||||||
if (!(count = get_available_data( request )))
|
if (!(count = get_available_data( request )))
|
||||||
{
|
{
|
||||||
if (!refill_buffer( request, async )) goto done;
|
if (!(ret = refill_buffer( request, async ))) goto done;
|
||||||
if (!(count = get_available_data( request ))) goto done;
|
if (!(count = get_available_data( request ))) goto done;
|
||||||
}
|
}
|
||||||
count = min( count, size );
|
count = min( count, size );
|
||||||
|
@ -1968,15 +1969,25 @@ static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD
|
||||||
request->content_read += count;
|
request->content_read += count;
|
||||||
if (end_of_read_data( request )) goto done;
|
if (end_of_read_data( request )) goto done;
|
||||||
}
|
}
|
||||||
if (request->read_chunked && !request->read_chunked_size) refill_buffer( request, async );
|
if (request->read_chunked && !request->read_chunked_size) ret = refill_buffer( request, async );
|
||||||
|
|
||||||
done:
|
done:
|
||||||
TRACE( "retrieved %u bytes (%u/%u)\n", bytes_read, request->content_read, request->content_length );
|
TRACE( "retrieved %u bytes (%u/%u)\n", bytes_read, request->content_read, request->content_length );
|
||||||
|
if (async)
|
||||||
|
{
|
||||||
|
if (ret) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, buffer, bytes_read );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WINHTTP_ASYNC_RESULT result;
|
||||||
|
result.dwResult = API_READ_DATA;
|
||||||
|
result.dwError = GetLastError();
|
||||||
|
send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, &result, sizeof(result) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (async) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, buffer, bytes_read );
|
if (ret && read) *read = bytes_read;
|
||||||
if (read) *read = bytes_read;
|
|
||||||
if (end_of_read_data( request )) finished_reading( request );
|
if (end_of_read_data( request )) finished_reading( request );
|
||||||
return TRUE;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read any content returned by the server so that the connection can be reused */
|
/* read any content returned by the server so that the connection can be reused */
|
||||||
|
@ -2781,7 +2792,7 @@ static BOOL receive_response( struct request *request, BOOL async )
|
||||||
}
|
}
|
||||||
|
|
||||||
netconn_set_timeout( request->netconn, FALSE, request->receive_timeout );
|
netconn_set_timeout( request->netconn, FALSE, request->receive_timeout );
|
||||||
if (request->content_length) refill_buffer( request, FALSE );
|
if (request->content_length) ret = refill_buffer( request, FALSE );
|
||||||
|
|
||||||
if (async)
|
if (async)
|
||||||
{
|
{
|
||||||
|
@ -2847,25 +2858,35 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved )
|
||||||
static BOOL query_data_available( struct request *request, DWORD *available, BOOL async )
|
static BOOL query_data_available( struct request *request, DWORD *available, BOOL async )
|
||||||
{
|
{
|
||||||
DWORD count = 0;
|
DWORD count = 0;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
if (end_of_read_data( request )) goto done;
|
if (end_of_read_data( request )) goto done;
|
||||||
|
|
||||||
count = get_available_data( request );
|
count = get_available_data( request );
|
||||||
if (!request->read_chunked && request->netconn)
|
if (!request->read_chunked && request->netconn) count += netconn_query_data_available( request->netconn );
|
||||||
count += netconn_query_data_available( request->netconn );
|
|
||||||
if (!count)
|
if (!count)
|
||||||
{
|
{
|
||||||
refill_buffer( request, async );
|
if (!(ret = refill_buffer( request, async ))) goto done;
|
||||||
count = get_available_data( request );
|
count = get_available_data( request );
|
||||||
if (!request->read_chunked && request->netconn)
|
if (!request->read_chunked && request->netconn) count += netconn_query_data_available( request->netconn );
|
||||||
count += netconn_query_data_available( request->netconn );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (async) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, &count, sizeof(count) );
|
|
||||||
TRACE("%u bytes available\n", count);
|
TRACE("%u bytes available\n", count);
|
||||||
if (available) *available = count;
|
if (async)
|
||||||
return TRUE;
|
{
|
||||||
|
if (ret) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, &count, sizeof(count) );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WINHTTP_ASYNC_RESULT result;
|
||||||
|
result.dwResult = API_QUERY_DATA_AVAILABLE;
|
||||||
|
result.dwError = GetLastError();
|
||||||
|
send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, &result, sizeof(result) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret && available) *available = count;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void task_query_data_available( struct task_header *task )
|
static void task_query_data_available( struct task_header *task )
|
||||||
|
|
Loading…
Reference in New Issue