wininet: Don't assume that end of chunk means end of stream.

Jacek Caban jacek at codeweavers.com
Wed Sep 11 10:53:56 CDT 2013


On 09/11/13 17:32, Hans Leidekker wrote:
> On Wed, 2013-09-11 at 16:38 +0200, Jacek Caban wrote:
>> Hi Hans,
>>
>> On 09/11/13 13:50, Hans Leidekker wrote:
>>>  static DWORD chunked_get_avail_data(data_stream_t *stream, http_request_t *req)
>>>  {
>>> -    /* Allow reading only from read buffer */
>>> +    chunked_stream_t *chunked_stream = (chunked_stream_t*)stream;
>>> +    DWORD res;
>>> +
>>> +    if(!chunked_stream->chunk_size || chunked_stream->chunk_size == ~0u) {
>>> +        res = start_next_chunk(chunked_stream, req);
>>> +        if(res != ERROR_SUCCESS)
>>> +            return 0;
>>> +    }
>> start_next_chunk may block and we don't want chunked_get_avail_data to
>> block.
> We can't avoid that. If this is the first chunk or if the current chunk has
> been consumed we need to read a couple of bytes to find out how much we can
> expect.

The first chunk will be received by HTTP_ReceiveRequestData in both
HTTP_HttpSendRequest and HTTP_HttpEndRequest. Subsequent chunks are also
avoidable, just like they didn't block without your patch. We really
can't block in InternetQueryDataAvailable for async request.

> Network traces tell me that native also performs a read on the first call to
> InternetQueryDataAvailable.

Are you sure it's not an asynchronous read from a separated thread that
is ordered by InternetQueryDataAvailable if no data is available?

Jacek



More information about the wine-devel mailing list