PassRefPtrWillBeRawPtr<MHTMLArchive> MHTMLParser::parseArchiveWithHeader(MIMEHeader* header) { if (!header) { WTF_LOG_ERROR("Failed to parse MHTML part: no header."); return nullptr; } RefPtrWillBeRawPtr<MHTMLArchive> archive = MHTMLArchive::create(); if (!header->isMultipart()) { // With IE a page with no resource is not multi-part. bool endOfArchiveReached = false; RefPtrWillBeRawPtr<ArchiveResource> resource = parseNextPart(*header, String(), String(), endOfArchiveReached); if (!resource) return nullptr; archive->setMainResource(resource); return archive; } // Skip the message content (it's a generic browser specific message). skipLinesUntilBoundaryFound(m_lineReader, header->endOfPartBoundary()); bool endOfArchive = false; while (!endOfArchive) { RefPtrWillBeRawPtr<MIMEHeader> resourceHeader = MIMEHeader::parseHeader(&m_lineReader); if (!resourceHeader) { WTF_LOG_ERROR("Failed to parse MHTML, invalid MIME header."); return nullptr; } if (resourceHeader->contentType() == "multipart/alternative") { // Ignore IE nesting which makes little sense (IE seems to nest only some of the frames). RefPtrWillBeRawPtr<MHTMLArchive> subframeArchive = parseArchiveWithHeader(resourceHeader.get()); if (!subframeArchive) { WTF_LOG_ERROR("Failed to parse MHTML subframe."); return nullptr; } bool endOfPartReached = skipLinesUntilBoundaryFound(m_lineReader, header->endOfPartBoundary()); ASSERT_UNUSED(endOfPartReached, endOfPartReached); // The top-frame is the first frame found, regardless of the nesting level. if (subframeArchive->mainResource()) addResourceToArchive(subframeArchive->mainResource(), archive.get()); archive->addSubframeArchive(subframeArchive); continue; } RefPtrWillBeRawPtr<ArchiveResource> resource = parseNextPart(*resourceHeader, header->endOfPartBoundary(), header->endOfDocumentBoundary(), endOfArchive); if (!resource) { WTF_LOG_ERROR("Failed to parse MHTML part."); return nullptr; } addResourceToArchive(resource.get(), archive.get()); } return archive.release(); }
bool MHTMLParser::parseArchiveWithHeader( MIMEHeader* header, HeapVector<Member<ArchiveResource>>& resources) { if (!header) { DVLOG(1) << "Failed to parse MHTML part: no header."; return false; } if (!header->isMultipart()) { // With IE a page with no resource is not multi-part. bool endOfArchiveReached = false; ArchiveResource* resource = parseNextPart(*header, String(), String(), endOfArchiveReached); if (!resource) return false; resources.append(resource); return true; } // Skip the message content (it's a generic browser specific message). skipLinesUntilBoundaryFound(m_lineReader, header->endOfPartBoundary()); bool endOfArchive = false; while (!endOfArchive) { MIMEHeader* resourceHeader = MIMEHeader::parseHeader(&m_lineReader); if (!resourceHeader) { DVLOG(1) << "Failed to parse MHTML, invalid MIME header."; return false; } if (resourceHeader->contentType() == "multipart/alternative") { // Ignore IE nesting which makes little sense (IE seems to nest only some // of the frames). if (!parseArchiveWithHeader(resourceHeader, resources)) { DVLOG(1) << "Failed to parse MHTML subframe."; return false; } skipLinesUntilBoundaryFound(m_lineReader, header->endOfPartBoundary()); continue; } ArchiveResource* resource = parseNextPart(*resourceHeader, header->endOfPartBoundary(), header->endOfDocumentBoundary(), endOfArchive); if (!resource) { DVLOG(1) << "Failed to parse MHTML part."; return false; } resources.append(resource); } return true; }