summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorMatt A. Tobin <email@mattatobin.com>2022-05-02 12:42:47 -0500
committerMatt A. Tobin <email@mattatobin.com>2022-05-02 12:42:47 -0500
commitb17c689b521e44fcf6cbc0ffaa5b635466c95671 (patch)
treec971ab8fea4bd266b8c2afff4c9df39943792dc3 /components
parentf3bc4c7809d24ea88ee8bbefa9b7a390c552eda1 (diff)
downloadaura-central-b17c689b521e44fcf6cbc0ffaa5b635466c95671.tar.gz
[Components:Jar] [MozSec] Make content-type on JAR channels behave the same as HTTP channels.
That is, treat it as a hint if called before open, and as an override if called after. Override the hint on open.
Diffstat (limited to 'components')
-rw-r--r--components/jar/src/nsJARChannel.cpp75
-rw-r--r--components/jar/src/nsJARChannel.h5
2 files changed, 44 insertions, 36 deletions
diff --git a/components/jar/src/nsJARChannel.cpp b/components/jar/src/nsJARChannel.cpp
index 65c034779..0bbfa31eb 100644
--- a/components/jar/src/nsJARChannel.cpp
+++ b/components/jar/src/nsJARChannel.cpp
@@ -577,48 +577,47 @@ nsJARChannel::GetSecurityInfo(nsISupports **aSecurityInfo)
return NS_OK;
}
+bool nsJARChannel::GetContentTypeGuess(nsACString& aResult) const {
+ const char *ext = nullptr, *fileName = mJarEntry.get();
+ int32_t len = mJarEntry.Length();
+
+ // check if we're displaying a directory
+ // mJarEntry will be empty if we're trying to display
+ // the topmost directory in a zip, e.g. jar:foo.zip!/
+ if (ENTRY_IS_DIRECTORY(mJarEntry)) {
+ aResult.AssignLiteral(APPLICATION_HTTP_INDEX_FORMAT);
+ return true;
+ }
+
+ // Not a directory, take a guess by its extension
+ for (int32_t i = len - 1; i >= 0; i--) {
+ if (fileName[i] == '.') {
+ ext = &fileName[i + 1];
+ break;
+ }
+ }
+ if (!ext) {
+ return false;
+ }
+ nsIMIMEService* mimeServ = gJarHandler->MimeService();
+ if (!mimeServ) {
+ return false;
+ }
+ mimeServ->GetTypeFromExtension(nsDependentCString(ext), aResult);
+ return !aResult.IsEmpty();
+}
+
NS_IMETHODIMP
-nsJARChannel::GetContentType(nsACString &result)
+nsJARChannel::GetContentType(nsACString &aResult)
{
// If the Jar file has not been open yet,
// We return application/x-unknown-content-type
if (!mOpened) {
- result.Assign(UNKNOWN_CONTENT_TYPE);
+ aResult.Assign(UNKNOWN_CONTENT_TYPE);
return NS_OK;
}
- if (mContentType.IsEmpty()) {
-
- //
- // generate content type and set it
- //
- const char *ext = nullptr, *fileName = mJarEntry.get();
- int32_t len = mJarEntry.Length();
-
- // check if we're displaying a directory
- // mJarEntry will be empty if we're trying to display
- // the topmost directory in a zip, e.g. jar:foo.zip!/
- if (ENTRY_IS_DIRECTORY(mJarEntry)) {
- mContentType.AssignLiteral(APPLICATION_HTTP_INDEX_FORMAT);
- }
- else {
- // not a directory, take a guess by its extension
- for (int32_t i = len-1; i >= 0; i--) {
- if (fileName[i] == '.') {
- ext = &fileName[i + 1];
- break;
- }
- }
- if (ext) {
- nsIMIMEService *mimeServ = gJarHandler->MimeService();
- if (mimeServ)
- mimeServ->GetTypeFromExtension(nsDependentCString(ext), mContentType);
- }
- if (mContentType.IsEmpty())
- mContentType.AssignLiteral(UNKNOWN_CONTENT_TYPE);
- }
- }
- result = mContentType;
+ aResult = mContentType;
return NS_OK;
}
@@ -636,8 +635,8 @@ nsJARChannel::SetContentType(const nsACString &aContentType)
NS_IMETHODIMP
nsJARChannel::GetContentCharset(nsACString &aContentCharset)
{
- // If someone gives us a charset hint we should just use that charset.
- // So we don't care when this is being called.
+ // We behave like HTTP channels (treat this as a hint if called before open,
+ // and override the charset if called after open).
aContentCharset = mContentCharset;
return NS_OK;
}
@@ -730,6 +729,10 @@ nsJARChannel::Open(nsIInputStream **stream)
input.forget(stream);
mOpened = true;
+ // Compute the content type now.
+ if (!GetContentTypeGuess(mContentType)) {
+ mContentType.Assign(UNKNOWN_CONTENT_TYPE);
+ }
// local files are always considered safe
mIsUnsafe = false;
return NS_OK;
diff --git a/components/jar/src/nsJARChannel.h b/components/jar/src/nsJARChannel.h
index 5328d586a..20afbcb2f 100644
--- a/components/jar/src/nsJARChannel.h
+++ b/components/jar/src/nsJARChannel.h
@@ -59,6 +59,11 @@ private:
nsresult OpenLocalFile();
void NotifyError(nsresult aError);
void FireOnProgress(uint64_t aProgress);
+
+ // Returns false if we don't know the content type of this channel, in which
+ // case we should use the content-type hint.
+ bool GetContentTypeGuess(nsACString&) const;
+
virtual void OnDownloadComplete(mozilla::net::MemoryDownloader* aDownloader,
nsIRequest* aRequest,
nsISupports* aCtxt,