316qint64 QHttpPartPrivate::bytesAvailable()
const
318 checkHeaderCreated();
319 qint64 bytesAvailable = header.size();
321 bytesAvailable += bodyDevice->bytesAvailable() - readPointer;
323 bytesAvailable += body.size() - readPointer;
326 return qMax(bytesAvailable, (qint64) 0);
329qint64 QHttpPartPrivate::readData(
char *data, qint64 maxSize)
331 checkHeaderCreated();
332 qint64 bytesRead = 0;
333 qint64 headerDataCount = header.size();
336 if (readPointer < headerDataCount) {
337 bytesRead = qMin(headerDataCount - readPointer, maxSize);
338 const char *headerData = header.constData();
339 memcpy(data, headerData + readPointer, bytesRead);
340 readPointer += bytesRead;
343 if (bytesRead < maxSize) {
345 qint64 dataBytesRead = bodyDevice->read(data + bytesRead, maxSize - bytesRead);
346 if (dataBytesRead == -1)
348 bytesRead += dataBytesRead;
349 readPointer += dataBytesRead;
351 qint64 contentBytesRead = qMin(body.size() - readPointer + headerDataCount, maxSize - bytesRead);
352 const char *contentData = body.constData();
355 memcpy(data + bytesRead, contentData + readPointer - headerDataCount, contentBytesRead);
356 bytesRead += contentBytesRead;
357 readPointer += contentBytesRead;
399QHttpMultiPartPrivate::QHttpMultiPartPrivate() : contentType(QHttpMultiPart::MixedType), device(
new QHttpMultiPartIODevice(
this))
403 QRandomGenerator::global()->fillRange(random);
404 boundary =
"boundary_.oOo._"
405 + QByteArray::fromRawData(
reinterpret_cast<
char *>(random),
sizeof(random)).toBase64();
408 Q_ASSERT(boundary.size() <= 70);
419qint64 QHttpMultiPartIODevice::size()
const
423 if (deviceSize == -1) {
424 qint64 currentSize = 0;
425 qint64 boundaryCount = multiPart->boundary.size();
426 for (
int a = 0; a < multiPart->parts.size(); a++) {
427 partOffsets.append(currentSize);
430 currentSize += boundaryCount + 4 + multiPart->parts.at(a).d->size() + 2;
432 currentSize += boundaryCount + 6;
433 deviceSize = currentSize;
460qint64 QHttpMultiPartIODevice::readData(
char *data, qint64 maxSize)
462 qint64 bytesRead = 0, index = 0;
465 while (index < multiPart->parts.size() &&
466 readPointer >= partOffsets.at(index) + multiPart->parts.at(index).d->size()
467 + multiPart->boundary.size() + 6)
471 while (bytesRead < maxSize && index < multiPart->parts.size()) {
474 QByteArray boundaryData =
"--" + multiPart->boundary +
"\r\n";
475 qint64 boundaryCount = boundaryData.size();
476 qint64 partIndex = readPointer - partOffsets.at(index);
477 if (partIndex < boundaryCount) {
478 qint64 boundaryBytesRead = qMin(boundaryCount - partIndex, maxSize - bytesRead);
479 memcpy(data + bytesRead, boundaryData.constData() + partIndex, boundaryBytesRead);
480 bytesRead += boundaryBytesRead;
481 readPointer += boundaryBytesRead;
482 partIndex += boundaryBytesRead;
486 if (bytesRead < maxSize && partIndex >= boundaryCount && partIndex < boundaryCount + multiPart->parts.at(index).d->size()) {
487 qint64 dataBytesRead = multiPart->parts[index].d->readData(data + bytesRead, maxSize - bytesRead);
488 if (dataBytesRead == -1)
490 bytesRead += dataBytesRead;
491 readPointer += dataBytesRead;
492 partIndex += dataBytesRead;
496 if (bytesRead < maxSize && partIndex >= boundaryCount + multiPart->parts.at(index).d->size()) {
497 if (bytesRead == maxSize - 1)
499 memcpy(data + bytesRead,
"\r\n", 2);
506 if (bytesRead < maxSize && index == multiPart->parts.size()) {
507 QByteArray finalBoundary =
"--" + multiPart->boundary +
"--\r\n";
508 qint64 boundaryIndex = readPointer + finalBoundary.size() - size();
509 qint64 lastBoundaryBytesRead = qMin(finalBoundary.size() - boundaryIndex, maxSize - bytesRead);
510 memcpy(data + bytesRead, finalBoundary.constData() + boundaryIndex, lastBoundaryBytesRead);
511 bytesRead += lastBoundaryBytesRead;
512 readPointer += lastBoundaryBytesRead;
536QDebug operator<<(QDebug debug,
const QHttpPart &part)
538 const QDebugStateSaver saver(debug);
539 debug.resetFormat().nospace().noquote();
541 debug <<
"QHttpPart(headers = ["
542 << part.d->cookedHeaders
543 <<
"], http headers = ["
544 << part.d->httpHeaders
547 if (part.d->bodyDevice) {
548 debug <<
" bodydevice = ["
549 << part.d->bodyDevice
551 << part.d->bodyDevice->isOpen()
554 debug <<
" size of body = "
555 << part.d->body.size()