317qint64 QHttpPartPrivate::bytesAvailable()
const
319 checkHeaderCreated();
320 qint64 bytesAvailable = header.size();
322 bytesAvailable += bodyDevice->bytesAvailable() - readPointer;
324 bytesAvailable += body.size() - readPointer;
327 return qMax(bytesAvailable, (qint64) 0);
330qint64 QHttpPartPrivate::readData(
char *data, qint64 maxSize)
332 checkHeaderCreated();
333 qint64 bytesRead = 0;
334 qint64 headerDataCount = header.size();
337 if (readPointer < headerDataCount) {
338 bytesRead = qMin(headerDataCount - readPointer, maxSize);
339 const char *headerData = header.constData();
340 memcpy(data, headerData + readPointer, bytesRead);
341 readPointer += bytesRead;
344 if (bytesRead < maxSize) {
346 qint64 dataBytesRead = bodyDevice->read(data + bytesRead, maxSize - bytesRead);
347 if (dataBytesRead == -1)
349 bytesRead += dataBytesRead;
350 readPointer += dataBytesRead;
352 qint64 contentBytesRead = qMin(body.size() - readPointer + headerDataCount, maxSize - bytesRead);
353 const char *contentData = body.constData();
356 memcpy(data + bytesRead, contentData + readPointer - headerDataCount, contentBytesRead);
357 bytesRead += contentBytesRead;
358 readPointer += contentBytesRead;
400QHttpMultiPartPrivate::QHttpMultiPartPrivate() : contentType(QHttpMultiPart::MixedType), device(
new QHttpMultiPartIODevice(
this))
404 QRandomGenerator::global()->fillRange(random);
405 boundary =
"boundary_.oOo._"
406 + QByteArray::fromRawData(
reinterpret_cast<
char *>(random),
sizeof(random)).toBase64();
409 Q_ASSERT(boundary.size() <= 70);
420qint64 QHttpMultiPartIODevice::size()
const
424 if (deviceSize == -1) {
425 qint64 currentSize = 0;
426 qint64 boundaryCount = multiPart->boundary.size();
427 for (
int a = 0; a < multiPart->parts.size(); a++) {
428 partOffsets.append(currentSize);
431 currentSize += boundaryCount + 4 + multiPart->parts.at(a).d->size() + 2;
433 currentSize += boundaryCount + 6;
434 deviceSize = currentSize;
461qint64 QHttpMultiPartIODevice::readData(
char *data, qint64 maxSize)
463 qint64 bytesRead = 0, index = 0;
466 while (index < multiPart->parts.size() &&
467 readPointer >= partOffsets.at(index) + multiPart->parts.at(index).d->size()
468 + multiPart->boundary.size() + 6)
472 while (bytesRead < maxSize && index < multiPart->parts.size()) {
475 QByteArray boundaryData =
"--" + multiPart->boundary +
"\r\n";
476 qint64 boundaryCount = boundaryData.size();
477 qint64 partIndex = readPointer - partOffsets.at(index);
478 if (partIndex < boundaryCount) {
479 qint64 boundaryBytesRead = qMin(boundaryCount - partIndex, maxSize - bytesRead);
480 memcpy(data + bytesRead, boundaryData.constData() + partIndex, boundaryBytesRead);
481 bytesRead += boundaryBytesRead;
482 readPointer += boundaryBytesRead;
483 partIndex += boundaryBytesRead;
487 if (bytesRead < maxSize && partIndex >= boundaryCount && partIndex < boundaryCount + multiPart->parts.at(index).d->size()) {
488 qint64 dataBytesRead = multiPart->parts[index].d->readData(data + bytesRead, maxSize - bytesRead);
489 if (dataBytesRead == -1)
491 bytesRead += dataBytesRead;
492 readPointer += dataBytesRead;
493 partIndex += dataBytesRead;
497 if (bytesRead < maxSize && partIndex >= boundaryCount + multiPart->parts.at(index).d->size()) {
498 if (bytesRead == maxSize - 1)
500 memcpy(data + bytesRead,
"\r\n", 2);
507 if (bytesRead < maxSize && index == multiPart->parts.size()) {
508 QByteArray finalBoundary =
"--" + multiPart->boundary +
"--\r\n";
509 qint64 boundaryIndex = readPointer + finalBoundary.size() - size();
510 qint64 lastBoundaryBytesRead = qMin(finalBoundary.size() - boundaryIndex, maxSize - bytesRead);
511 memcpy(data + bytesRead, finalBoundary.constData() + boundaryIndex, lastBoundaryBytesRead);
512 bytesRead += lastBoundaryBytesRead;
513 readPointer += lastBoundaryBytesRead;
537QDebug operator<<(QDebug debug,
const QHttpPart &part)
539 const QDebugStateSaver saver(debug);
540 debug.resetFormat().nospace().noquote();
542 debug <<
"QHttpPart(headers = ["
543 << part.d->cookedHeaders
544 <<
"], http headers = ["
545 << part.d->httpHeaders
548 if (part.d->bodyDevice) {
549 debug <<
" bodydevice = ["
550 << part.d->bodyDevice
552 << part.d->bodyDevice->isOpen()
555 debug <<
" size of body = "
556 << part.d->body.size()