Jacek Caban : rpcrt4: Added cancelling support for all HTTP requests.
Alexandre Julliard
julliard at winehq.org
Wed Aug 15 14:08:32 CDT 2012
Module: wine
Branch: master
Commit: cbdb58476a4b966a6303cc35bcc588b9851ecfb4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbdb58476a4b966a6303cc35bcc588b9851ecfb4
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Aug 15 10:22:39 2012 +0200
rpcrt4: Added cancelling support for all HTTP requests.
---
dlls/rpcrt4/rpc_transport.c | 30 ++++++++++++++++--------------
1 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c
index 76a9714..b44198f 100644
--- a/dlls/rpcrt4/rpc_transport.c
+++ b/dlls/rpcrt4/rpc_transport.c
@@ -1877,6 +1877,9 @@ static void prepare_async_request(RpcHttpAsyncData *async_data)
static RPC_STATUS wait_async_request(RpcHttpAsyncData *async_data, BOOL call_ret, HANDLE cancel_event)
{
+ HANDLE handles[2] = { async_data->completion_event, cancel_event };
+ DWORD res;
+
if(call_ret) {
RpcHttpAsyncData_Release(async_data);
return RPC_S_OK;
@@ -1888,16 +1891,12 @@ static RPC_STATUS wait_async_request(RpcHttpAsyncData *async_data, BOOL call_ret
return RPC_S_SERVER_UNAVAILABLE;
}
- if(cancel_event) {
- HANDLE handles[2] = { async_data->completion_event, cancel_event };
- DWORD res;
-
- res = WaitForMultipleObjects(2, handles, FALSE, DEFAULT_NCACN_HTTP_TIMEOUT);
- if(res != WAIT_OBJECT_0)
- return RPC_S_CALL_CANCELLED;
- }else {
- WaitForSingleObject(async_data->completion_event, INFINITE);
+ res = WaitForMultipleObjects(2, handles, FALSE, DEFAULT_NCACN_HTTP_TIMEOUT);
+ if(res != WAIT_OBJECT_0) {
+ TRACE("Cancelled\n");
+ return RPC_S_CALL_CANCELLED;
}
+
if(async_data->async_result) {
ERR("Async request failed with error %d\n", async_data->async_result);
return RPC_S_SERVER_UNAVAILABLE;
@@ -2176,7 +2175,7 @@ static RPC_STATUS rpcrt4_http_internet_connect(RpcConnection_http *httpc)
}
/* prepare the in pipe for use by RPC packets */
-static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsyncData *async_data,
+static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsyncData *async_data, HANDLE cancel_event,
const UUID *connection_uuid,
const UUID *in_pipe_uuid,
const UUID *association_uuid)
@@ -2191,7 +2190,7 @@ static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsync
/* prepare in pipe */
prepare_async_request(async_data);
ret = HttpSendRequestW(in_request, NULL, 0, NULL, 0);
- status = wait_async_request(async_data, ret, NULL);
+ status = wait_async_request(async_data, ret, cancel_event);
if(status != RPC_S_OK) return status;
status = rpcrt4_http_check_response(in_request);
@@ -2206,7 +2205,7 @@ static RPC_STATUS rpcrt4_http_prepare_in_pipe(HINTERNET in_request, RpcHttpAsync
buffers_in.dwBufferTotal = 1024 * 1024 * 1024; /* 1Gb */
prepare_async_request(async_data);
ret = HttpSendRequestExW(in_request, &buffers_in, NULL, 0, 0);
- status = wait_async_request(async_data, ret, NULL);
+ status = wait_async_request(async_data, ret, cancel_event);
if (status != RPC_S_OK) return status;
TRACE("sending HTTP connect header to server\n");
@@ -2271,6 +2270,7 @@ static RPC_STATUS rpcrt4_http_read_http_packet(HINTERNET request, RpcPktHdr *hdr
/* prepare the out pipe for use by RPC packets */
static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request,
RpcHttpAsyncData *async_data,
+ HANDLE cancel_event,
const UUID *connection_uuid,
const UUID *out_pipe_uuid,
ULONG *flow_control_increment)
@@ -2286,7 +2286,7 @@ static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request,
prepare_async_request(async_data);
ret = HttpSendRequestW(out_request, NULL, 0, NULL, 0);
- status = wait_async_request(async_data, ret, NULL);
+ status = wait_async_request(async_data, ret, cancel_event);
if (status != RPC_S_OK) return status;
status = rpcrt4_http_check_response(out_request);
@@ -2300,7 +2300,7 @@ static RPC_STATUS rpcrt4_http_prepare_out_pipe(HINTERNET out_request,
prepare_async_request(async_data);
ret = HttpSendRequestW(out_request, NULL, 0, hdr, hdr->common.frag_len);
- status = wait_async_request(async_data, ret, NULL);
+ status = wait_async_request(async_data, ret, cancel_event);
RPCRT4_FreeHeader(hdr);
if (status != RPC_S_OK) return status;
@@ -2398,6 +2398,7 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
status = rpcrt4_http_prepare_in_pipe(httpc->in_request,
httpc->async_data,
+ httpc->cancel_event,
&httpc->connection_uuid,
&httpc->in_pipe_uuid,
&Connection->assoc->http_uuid);
@@ -2406,6 +2407,7 @@ static RPC_STATUS rpcrt4_ncacn_http_open(RpcConnection* Connection)
status = rpcrt4_http_prepare_out_pipe(httpc->out_request,
httpc->async_data,
+ httpc->cancel_event,
&httpc->connection_uuid,
&httpc->out_pipe_uuid,
&httpc->flow_control_increment);
More information about the wine-cvs
mailing list