[PATCH 2/6] winhttp: Propagate errors from refill_buffer.
Hans Leidekker
hans at codeweavers.com
Fri Nov 23 04:35:27 CST 2018
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=38228
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/winhttp/request.c | 49 +++++++++++++++++++++++++++++++++++--------------
1 file changed, 35 insertions(+), 14 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 9817287fe2..61af6ea977 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -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 )
{
int count, bytes_read = 0;
+ BOOL ret = TRUE;
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 (!refill_buffer( request, async )) goto done;
+ if (!(ret = refill_buffer( request, async ))) goto done;
if (!(count = get_available_data( request ))) goto done;
}
count = min( count, size );
@@ -1968,15 +1969,25 @@ static BOOL read_data( struct request *request, void *buffer, DWORD size, DWORD
request->content_read += count;
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:
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 (read) *read = bytes_read;
+ if (ret && read) *read = bytes_read;
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 */
@@ -2781,7 +2792,7 @@ static BOOL receive_response( struct request *request, BOOL async )
}
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)
{
@@ -2847,25 +2858,35 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved )
static BOOL query_data_available( struct request *request, DWORD *available, BOOL async )
{
DWORD count = 0;
+ BOOL ret = TRUE;
if (end_of_read_data( request )) goto done;
count = get_available_data( request );
- if (!request->read_chunked && request->netconn)
- count += netconn_query_data_available( request->netconn );
+ if (!request->read_chunked && request->netconn) count += netconn_query_data_available( request->netconn );
if (!count)
{
- refill_buffer( request, async );
+ if (!(ret = refill_buffer( request, async ))) goto done;
count = get_available_data( request );
- if (!request->read_chunked && request->netconn)
- count += netconn_query_data_available( request->netconn );
+ if (!request->read_chunked && request->netconn) count += netconn_query_data_available( request->netconn );
}
done:
- if (async) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, &count, sizeof(count) );
TRACE("%u bytes available\n", count);
- if (available) *available = count;
- return TRUE;
+ if (async)
+ {
+ 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 )
--
2.11.0
More information about the wine-devel
mailing list