curl-library
Re: Use read/write with same curl handle.
From: Nilesh <nilesh_at_kenati.com>
Date: Tue, 28 Feb 2006 20:01:31 +0530
Date: Tue, 28 Feb 2006 20:01:31 +0530
In fact while DEBEG trace function given in example code in file
multi-debugcallback.c, curl_infotype is not set to CURLINFO_DATA_IN.
Shall I assum that mean no data has come ?
--
Nilesh
Nilesh wrote:
> Thanks for taking it ahead
> see my comments inline,
>
> Daniel Stenberg wrote:
>
>> On Tue, 28 Feb 2006, Nilesh wrote:
>>
>>> Can I use same curl handle to send and receive data ?
>>
>>
>> Yes.
>>
>>> -- Using multi_perform and select to check if data is available to
>>> send/recieve.
>>>
>>> Problem is that flow is coming to default case of switch, which
>>> tells some data has come.
>>
>>
>> What flow is coming to what "default case" ?
>
> The flow is basically as follows where the default case indicate
> there is data available to send/receive
> curl_multi_perform(multi_handle, &still_running);
> // while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle,
> &still_running));
>
> /* Now need to wait for SendInform response */
> while(still_running)
> {
> struct timeval timeout;
>
> fd_set fdread;
> fd_set fdwrite;
> fd_set fdexcep;
> int maxfd;
> int timed_out = 0;
>
> FD_ZERO(&fdread);
> FD_ZERO(&fdwrite);
> FD_ZERO(&fdexcep);
>
> /* set a suitable timeout to play around with */
> timeout.tv_sec = waitTime;
> timeout.tv_usec = 0;
>
> while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle,
> &still_running))
> {
> printf("Insite while, calling curl_multi_perform
> [still_running-%d]\n", still_running);
> }
>
> /** get file descriptors from the transfers */
> curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
>
> printf("Wait here for [%d] seconds\n", waitTime);
>
> rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
>
> switch(rc)
> {
> case -1:
> /* select error */
> break;
> case 0:
> /* timeout, do something else */
> printf("Select Timeout happened\n");
> timed_out = 1;
> break;
> default:
> /* one or more of curl's file descriptors say there's data to read
> or write */
> printf("Have some data to process\n");
> while(CURLM_CALL_MULTI_PERFORM ==
> curl_multi_perform(multi_handle, &still_running));
> break;
> }*
>
> Timeout in my case is 120 Seconds.
>
>
>>
>>> While DEBUGIng I am getting HTTP header details which I have
>>> received with vaid content length, but it doesn't display data.
>>
>>
>> Are you saying libcurl says the transfer is complete after only the
>> headers have been transferred? I find that hard to believe.
>
>
> This what I see when I enable debug support for curl. ( i am using
> same function callback given in example directory )
> I have additionaly using header_callback function also which prints
> custome message give below ( "Incoming header has come" )
>
> * Have some data to process
> <= Recv header, 17 bytes (0x11)
> 0000: HTTP/1.1 200 OK
> Incoming header has come [HTTP/1.1 200 OK
> ]
> <= Recv header, 27 bytes (0x1b)
> 0000: Server: Apache-Coyote/1.1
> Incoming header has come [Server: Apache-Coyote/1.1
> ]
> <= Recv header, 72 bytes (0x48)
> 0000: Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*
> 0040: ; q=.2
> Incoming header has come [Accept: text/xml, text/html, image/gif,
> image/jpeg, *; q=.2, */*; q=.2
> ]
> <= Recv header, 16 bytes (0x10)
> 0000: SOAPAction: ""
> Incoming header has come [SOAPAction: ""
> ]
> <= Recv header, 38 bytes (0x26)
> 0000: Content-Type: text/xml;charset=utf-8
> Incoming header has come [Content-Type: text/xml;charset=utf-8
> ]
> <= Recv header, 21 bytes (0x15)
> 0000: Content-Length: 484
> Incoming header has come [Content-Length: 484
> ]
> <= Recv header, 37 bytes (0x25)
> 0000: Date: Tue, 28 Feb 2006 14:14:27 GMT
> Incoming header has come [Date: Tue, 28 Feb 2006 14:14:27 GMT
> ]
> Incoming header has come [
> ]*
>
> PS : I am using write_callback similar to what has been given in
> getinmemory.c ( example code)
>
> Even I tried using default write callback which will write to FILE*
> stream, which writting nothing in specified file .
>
>>
>>> I have also put debug printf in write_callback function to printf
>>> received data, which doesn't really get printed.
>>
>>
>> And you are sure you keep looping and calling the *perform() function
>> as long as the transfer is still alive?
>
> Yes I do that. I have posted the loop above.
>
>
Received on 2006-02-28