diff options
-rw-r--r-- | modules/libjar/nsJARChannel.cpp | 75 | ||||
-rw-r--r-- | modules/libjar/nsJARChannel.h | 5 |
2 files changed, 36 insertions, 44 deletions
diff --git a/modules/libjar/nsJARChannel.cpp b/modules/libjar/nsJARChannel.cpp index 5249ebed83..ddcbfae2c7 100644 --- a/modules/libjar/nsJARChannel.cpp +++ b/modules/libjar/nsJARChannel.cpp @@ -577,47 +577,48 @@ 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 &aResult) +nsJARChannel::GetContentType(nsACString &result) { // If the Jar file has not been open yet, // We return application/x-unknown-content-type if (!mOpened) { - aResult.Assign(UNKNOWN_CONTENT_TYPE); + result.Assign(UNKNOWN_CONTENT_TYPE); return NS_OK; } - aResult = mContentType; + 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; return NS_OK; } @@ -635,8 +636,8 @@ nsJARChannel::SetContentType(const nsACString &aContentType) NS_IMETHODIMP nsJARChannel::GetContentCharset(nsACString &aContentCharset) { - // We behave like HTTP channels (treat this as a hint if called before open, - // and override the charset if called after open). + // If someone gives us a charset hint we should just use that charset. + // So we don't care when this is being called. aContentCharset = mContentCharset; return NS_OK; } @@ -729,10 +730,6 @@ 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 20afbcb2fc..5328d586ab 100644 --- a/modules/libjar/nsJARChannel.h +++ b/modules/libjar/nsJARChannel.h @@ -59,11 +59,6 @@ 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, |