[Qt-interest] Persistent HTTP connections

Markus Goetz Markus.Goetz at nokia.com
Thu Feb 18 12:34:38 CET 2010


Yes, there will be a leak :)

The deleteLater() refers to the object, e.g. to each individual 
QNetworkReply.

ext Mandeep Sandhu wrote:
> On Thu, Feb 18, 2010 at 4:22 PM, Markus Goetz <Markus.Goetz at nokia.com> wrote:
>   
>> Oh.
>> No, it is not your fault.
>> It's a bug in Qt then. Calling deleteLater() is what you are supposed to do.
>> I'll look into it.
>>     
>
> Oh ok. One more question.
>
> Will there be memory leak if i don't call deleteLater() for _every_
> response, but call it only once when all downloads have finished?
>
> Thanks,
> -mandeep
>
>   
>> Thanks for reporting.
>>
>> Markus
>>
>> ext Mandeep Sandhu wrote:
>>     
>>> Please ignore my previous mail.
>>>
>>> I found out why it was making a new connection each time. The
>>> reason...my code! :P
>>>
>>> I was calling deleteLater() on the repy object which was causing it to
>>> explicitly close the connection with the server.
>>>
>>> When I remove that, I see that the same connection is being reused for
>>> subsequent requests.
>>>
>>> Thanks,
>>> -mandeep
>>>
>>> On Thu, Feb 18, 2010 at 4:20 PM, Mandeep Sandhu
>>> <mandeepsandhu.chd at gmail.com> wrote:
>>>
>>>       
>>>> On Thu, Feb 18, 2010 at 2:56 PM, Mandeep Sandhu
>>>> <mandeepsandhu.chd at gmail.com> wrote:
>>>>
>>>>         
>>>>>> In theory, it should work like that. Have you tried checking with a
>>>>>> network
>>>>>> sniffer? If it's not like that, we have a bug (or let's call it
>>>>>> performance
>>>>>> regression) in Qt.
>>>>>>
>>>>>>             
>>>>> Thats exactly what I'm trying now...using a sniffer.
>>>>>
>>>>>           
>>>> I tried using a singleshot timer to start the next download on
>>>> receiving the "finished" signal (see attached source). I then used
>>>> "NetActViewer" (http://netactview.sourceforge.net/) to view the active
>>>> TCP connections to my box (where the webserver is running).
>>>>
>>>> I see that each time a new download starts, the client TCP port number
>>>> is changing. This means that a new TCP connection is being made each
>>>> time.
>>>>
>>>> I also sniffed one HTTP transaction off the wire...
>>>>
>>>> tshark shows the following for the HTTP request:
>>>> ...
>>>> ...
>>>> Hypertext Transfer Protocol
>>>>   GET /dl.txt HTTP/1.1\r\n
>>>>       [Expert Info (Chat/Sequence): GET /dl.txt HTTP/1.1\r\n]
>>>>           [Message: GET /dl.txt HTTP/1.1\r\n]
>>>>           [Severity level: Chat]
>>>>           [Group: Sequence]
>>>>       Request Method: GET
>>>>       Request URI: /dl.txt
>>>>       Request Version: HTTP/1.1
>>>>   User-Agent: QT 1.0\r\n
>>>>   Connection: Keep-Alive\r\n
>>>>   Accept-Encoding: gzip\r\n
>>>>   Host: 192.168.2.2\r\n
>>>>   \r\n
>>>> ...
>>>> ...
>>>>
>>>> HTTP response from server:
>>>> ...
>>>> ...
>>>> Hypertext Transfer Protocol
>>>>   HTTP/1.1 200 OK\r\n
>>>>       [Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n]
>>>>           [Message: HTTP/1.1 200 OK\r\n]
>>>>           [Severity level: Chat]
>>>>           [Group: Sequence]
>>>>       Request Version: HTTP/1.1
>>>>       Response Code: 200
>>>>   Server: nginx/0.7.62\r\n
>>>>   Date: Thu, 18 Feb 2010 10:01:21 GMT\r\n
>>>>   Content-Type: text/plain\r\n
>>>>   Content-Length: 6\r\n
>>>>       [Content length: 6]
>>>>   Last-Modified: Thu, 18 Feb 2010 08:56:44 GMT\r\n
>>>>   Connection: keep-alive\r\n
>>>>   Accept-Ranges: bytes\r\n
>>>>   \r\n
>>>> ...
>>>> ...
>>>>
>>>> So I guess it is using the correct header...but somehow a new
>>>> connection is being made each time.
>>>>
>>>> -mandeep
>>>>
>>>>
>>>>
>>>>         
>>>>>> To be very sure, I would suggest to not create and send the request
>>>>>> from the
>>>>>> finished() slot but one event loop spin after that. You can achieve
>>>>>> this by
>>>>>> using a single shot timer set to 0 msec and sending the request from
>>>>>> the
>>>>>> timer's slot.
>>>>>>
>>>>>>
>>>>>>             
>>>>> Thanks for this tip.
>>>>>
>>>>> Regards,
>>>>> -mandeep
>>>>>
>>>>>
>>>>>           
>>>>>> Markus
>>>>>>
>>>>>>
>>>>>>             
>>     




More information about the Qt-interest-old mailing list