[Qt-interest] QHttp upload won't stream?
Info
info at misafe.com
Tue Oct 6 16:48:25 CEST 2009
Getting closer to tracking this down I hope. It seems that during the
"buffering", the calls to QSslSocket::flush() are not behaving. I've
tracked it down to the call to WSASend() in
QNativeSocketEnginePrivate::nativeWrite() returning -1 for almost
every call right up until the buffer is full and then every call to
WSASend() starts returning the correct value.
I have no idea what a return of -1 from WSASend() means but it is
either a symptom or the cause.
On 6 Oct 2009, at 14:27, Jason H wrote:
> In my experience, the content-length header gets sent.
>
> What do you mean by "streaming" then? Streaming to me is you don't
> know the final length and you'll be using chunked encoding.
>
> Https is interesting because its block encryption. You can't send 10
> bytes and expect 10 bytes to come out without closing the transfer.
> It'll be buffered until it gets a whole block to encrypt, or it is
> closed.
>
>
>
> From: Info <info at misafe.com>
> To: Jason H <scorp1us at yahoo.com>
> Cc: qt-interest at trolltech.com
> Sent: Tuesday, October 6, 2009 9:23:37 AM
> Subject: Re: [Qt-interest] QHttp upload won't stream?
>
> But the same method works fine when not using HTTPS, surely that
> would also require the same informations?
>
> The QIODevice (output) does implement bytesAvailable() and return
> the correct number. Is that what you mean? I also explicitly set the
> content-length header before the put/post request but it makes no
> difference.
>
>
> On 6 Oct 2009, at 14:19, Jason H wrote:
>
>> The problem (as I see it) is that Qt wants to know content-length
>> for the header (by doing bytesAvailible() on the device). If you
>> don't, you can only use chunked encoding, which is not supported
>> from a send perspective. I rolled my own using QHttpHeader and a
>> socket. I do have streamed transfers, however I used signals and
>> slots.
>>
>> One signal is the start message (taking care of headers) then a
>> signal for each data chunk, then ending with a done message which
>> closes the socket.
>>
>>
>>
>> From: Info <info at misafe.com>
>> To: qt-interest at trolltech.com
>> Sent: Tuesday, October 6, 2009 9:00:52 AM
>> Subject: Re: [Qt-interest] QHttp upload won't stream?
>>
>> Hi,
>>
>> Did you get anywhere with this? I'm having exactly the same problem
>> with QNetworkAccessManager and have tracked it back to the same
>> place you have QSslSocket::writeData, so it seems that you will
>> still have the issue if you switch from QHttp to
>> QNetworkAccessManager as they both use the same underlying socket.
>>
>>
>> On 30 Sep 2009, at 18:02, qt-interest-request at trolltech.com wrote:
>>
>>> Hi All,
>>>
>>> (Note: also posted on Qt Centre. Just trying to widen the net.)
>>>
>>> Using QT 4.5.2 on Windows XP.
>>>
>>> I have a file upload API which uses QHttp to send a PUT request to
>>> a WebDav server. It works fine except for one major problem: it
>>> loads the entire file into memory before it uploads the file.
>>> This is a problem with large files, a show stopper if the client
>>> runs out of memory. See code example below (of course, you need a
>>> dav server for it to work).
>>>
>>> int QHttp::request ( const QHttpRequestHeader & header, QIODevice
>>> * data = 0, QIODevice * to = 0 )
>>>
>>> I'm using QHttp::request to start the request. I can't seem to
>>> come up with a device or combination of devices which will stream
>>> or otherwise buffer the file from the disk.
>>>
>>> My working code (which doesn't stream) just passes in the QFile:
>>>
>>> _httpId = _qHttp->request(header, sourceFile);
>>>
>>> I tried passing a QDataStream (or TextStream), which is not a
>>> QIODevice. Tried to come up with a combination of QBuffer, QFile,
>>> just to see if something would work. No luck.
>>>
>>> I took a look at the QT source. Interestingly, it _is_ buffering
>>> the file read in qhttp.cpp, QHttpPrivate::_q_slotBytesWritten().
>>> The memory load looks to me like it's happening in qsslsocket.cpp,
>>> QSslSocket::writeData() when the method memcpy's the buffer.
>>>
>>> - Can I use QHttp to do what I want? It doesn't seem like it, but
>>> maybe I'm missing something. Is this a bug (I don't think so, yet)?
>>> - Is it worth trying QNetworkAccessManager, or am I going to run
>>> into the same problem? (I'm working on trying this now. Looks to
>>> me like QNetworkAccessManager is an entirely new impl.)
>>> - If I need to write custom code to support this, could someone
>>> outline a basic approach? Will I need to create multiple requests
>>> for this kind of "chunked" transfer?
>>>
>>> Code snippet (builds, haven't tried to run. my actual code has a
>>> bunch of classes abstracting/wrapping a lot of this.)
>>>
>>>
>>> QUrl destUrl(QString("http://www.someDAVserver.com/someFolder/someBigFile.dat
>>> "));
>>> QFile* sourceFile = new QFile("D:\\someLocalDir\
>>> \someBigFile.dat");
>>>
>>> if (!sourceFile->open(QIODevice::ReadOnly)) {
>>> //throw
>>> }
>>>
>>> QHttp::ConnectionMode mode = destUrl.scheme().toLower() ==
>>> "https" ? QHttp::ConnectionModeHttps : QHttp::ConnectionModeHttp;
>>>
>>> QHttp http;
>>> http.setHost(destUrl.host(), mode, destUrl.port() == -1 ? 0 :
>>> destUrl.port());
>>>
>>> QHttpRequestHeader header("PUT", destUrl.toEncoded
>>> (QUrl::RemoveScheme|QUrl::RemoveAuthority));
>>> header.setValue("Host", destUrl.host());
>>> header.setValue("Accept-Language", QLocale::system().name());
>>> header.setValue("Content-Length", QString::number(sourceFile-
>>> >size()));
>>>
>>>
>>> http.request(header, sourceFile);
>>>
>>>
>>>
>>> Thanks in advance,
>>>
>>> Hawkeye Parker
>>
>>
>> __________________________________________________
>> Do You Yahoo!?
>> Tired of spam? Yahoo! Mail has the best spam protection around
>> http://mail.yahoo.com
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20091006/71d8df99/attachment.html
More information about the Qt-interest-old
mailing list