From cedff4e1969988edbf447732ba6234dfb9683cf2 Mon Sep 17 00:00:00 2001 From: Valentin Gosu Date: Tue, 1 Oct 2024 11:09:09 +0000 Subject: [PATCH] Bug 1914521 - Make nsPartChannel inherit the content disposition of the multipart response r=necko-reviewers,jesup Differential Revision: https://phabricator.services.mozilla.com/D223728 --- netwerk/streamconv/converters/nsMultiMixedConv.cpp | 12 +++++++++++- netwerk/streamconv/converters/nsMultiMixedConv.h | 10 ++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/netwerk/streamconv/converters/nsMultiMixedConv.cpp b/netwerk/streamconv/converters/nsMultiMixedConv.cpp index e1ccfda303cc..5c4ea72a86eb 100644 --- a/netwerk/streamconv/converters/nsMultiMixedConv.cpp +++ b/netwerk/streamconv/converters/nsMultiMixedConv.cpp @@ -474,6 +474,12 @@ nsMultiMixedConv::OnStartRequest(nsIRequest* request) { if (NS_SUCCEEDED(rv)) { mRootContentSecurityPolicy = csp; } + nsCString contentDisposition; + rv = httpChannel->GetResponseHeader("content-disposition"_ns, + contentDisposition); + if (NS_SUCCEEDED(rv)) { + mRootContentDisposition = contentDisposition; + } } else { // try asking the channel directly rv = mChannel->GetContentType(contentType); @@ -850,7 +856,11 @@ nsresult nsMultiMixedConv::SendStart() { rv = mPartChannel->SetContentLength(mContentLength); if (NS_FAILED(rv)) return rv; - mPartChannel->SetContentDisposition(mContentDisposition); + if (!mRootContentDisposition.IsEmpty()) { + mPartChannel->SetContentDisposition(mRootContentDisposition); + } else { + mPartChannel->SetContentDisposition(mContentDisposition); + } // Each part of a multipart/replace response can be used // for the top level document. We must inform upper layers diff --git a/netwerk/streamconv/converters/nsMultiMixedConv.h b/netwerk/streamconv/converters/nsMultiMixedConv.h index 4f773a69eb67..694150d69c22 100644 --- a/netwerk/streamconv/converters/nsMultiMixedConv.h +++ b/netwerk/streamconv/converters/nsMultiMixedConv.h @@ -151,15 +151,17 @@ class nsMultiMixedConv : public nsIStreamConverter { nsCOMPtr mFinalListener; // this guy gets the converted // data via his OnDataAvailable() - nsCOMPtr - mChannel; // The channel as we get in in OnStartRequest call - RefPtr mPartChannel; // the channel for the given part we're - // processing. one channel per part. + // The channel as we get it in OnStartRequest call + nsCOMPtr mChannel; + // the channel for the given part we're + // processing. one channel per part. + RefPtr mPartChannel; nsCOMPtr mContext; nsCString mContentType; nsCString mContentDisposition; nsCString mContentSecurityPolicy; nsCString mRootContentSecurityPolicy; + nsCString mRootContentDisposition; uint64_t mContentLength{UINT64_MAX}; uint64_t mTotalSent{0};