summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2022-05-01 12:15:08 +0000
committerMoonchild <moonchild@palemoon.org>2022-05-01 12:15:08 +0000
commit425677ada7380f7c592dd01ddfbc9631ab2038a0 (patch)
tree14ddb57226c41d5448e924bc5c59ed10a2b5e3d9
parentbc2841f9f916b2a6aade0cd6dae4a2e4407352b6 (diff)
downloaduxp-425677ada7380f7c592dd01ddfbc9631ab2038a0.tar.gz
No Issue - 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.
-rw-r--r--modules/libjar/nsJARChannel.cpp75
-rw-r--r--modules/libjar/nsJARChannel.h5
2 files changed, 44 insertions, 36 deletions
diff --git a/modules/libjar/nsJARChannel.cpp b/modules/libjar/nsJARChannel.cpp
index ddcbfae2c7..5249ebed83 100644
--- a/modules/libjar/nsJARChannel.cpp
+++ b/modules/libjar/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/modules/libjar/nsJARChannel.h b/modules/libjar/nsJARChannel.h
index 5328d586ab..20afbcb2fc 100644
--- a/modules/libjar/nsJARChannel.h
+++ b/modules/libjar/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,