Closed
Bug 170722
Opened 22 years ago
Closed 22 years ago
referrer & headers not sent by persistence object.
Categories
(Core Graveyard :: File Handling, defect)
Tracking
(Not tracked)
RESOLVED
FIXED
People
(Reporter: mgabriel, Assigned: adamlock)
References
Details
Attachments
(1 file, 4 obsolete files)
19.75 KB,
patch
|
darin.moz
:
superreview+
|
Details | Diff | Splinter Review |
http://pub101.ezboard.com/fhbsgrafix38611frm1.showMessage?topicID=2606.topic try downloading the images with save linktarget as or shift-click instead of html its saving as .html.gif
Reporter | ||
Comment 1•22 years ago
|
||
similar thing happening on http://pub101.ezboard.com/fhbsgrafix38611frm1.showMessage?topicID=2599.topic .jpg gets saved as .jpg.gif
Comment 2•22 years ago
|
||
Not a bug. Those documents are being served as image/gif.
Reporter | ||
Comment 3•22 years ago
|
||
humm, seems like its some kind of protection of those images. with netscape it works tho mozilla submitting a wrong referrer ?
Comment 4•22 years ago
|
||
Mozilla does not send a referrer for "save link as". We should. The persistence object needs to support this.
Assignee: law → adamlock
Summary: file.html saved as file.html.gif → referrer not sent by persistence object.
Updated•22 years ago
|
QA Contact: sairuh → mdunn
nsIWebBrowserPersist::saveURI api needs referrer and headers parameters.
Summary: referrer not sent by persistence object. → referrer & headers not sent by persistence object.
Can I have feedback on this proposed patch to add headers and referrer arguments to saveURI? I'll submit a new patch including fixes to all calls to saveURI() if this meets with general approval. Note that the nsIWebNavigation::loadURI specifies the headers argument as an input stream but the docshell impl has a horrible time turning it into a string. Therefore I thought it would save a lot of effort for nsIWebBrowserPersist to just specify the headers as a string argument. Due to its optional nature, I have not used AString since I want callers to pass nsnull if they don't care the argument.
Updated•22 years ago
|
QA Contact: mdunn → depstein
Updated•22 years ago
|
QA Contact: depstein → dsirnapalli
Comment 7•22 years ago
|
||
Hey, as long as we're changing this interface could we make it take a page descriptor too? That would sorta help with the whole "repostning postdata documents" problem....
What the persist object needs is the cache key. The docshell's impl of the IWebPageDescriptor::currentDescriptor attribute returns an ISHEntry object with a cacheKey property. So whoever calls the the persist object could grab the cache key from that assuming the persist object had a cache key parameter. It may straightfoward to implement one for the saveURI method. The saveDocument method could also have a key parameter but the issue is more complicated since the document is fixed up and saved from the DOM and not refetched from the network. I don't know if the document cache key affects how URIs contained in a page are fetched but if so then it's possible it would have some use in saveDocument too. I'll have to investigate further.
Comment 9•22 years ago
|
||
> So whoever calls the the persist object could grab the cache key
This is what rpotts was trying so hard to avoid when he put the
nsIWebPageDescriptor stuff in place... Hence me ccing him on this bug. Note
that an nsISupports is returned, not an nsISHEntry... this is not an accident.
You're correct that this would be primarily useful for saveURI. Even that is a
good start... This is why I'd rather webbrowserpersist took an
nsIWebPageDescriptor -- that way we can maybe create a descriptor at some point
that would actually do what we want for saveDocument too and callers of
nsIWebBrowserPersist would not need to be updated... (or the interface, for that
matter). We know for a fact that the cacheKey will not become useful for
fetching sub-parts of a page...
Comment 10•22 years ago
|
||
*** Bug 177340 has been marked as a duplicate of this bug. ***
Assignee | ||
Comment 11•22 years ago
|
||
The problem is that if the persist object takes nsIWebPageDescriptor, it relies on implementation specific details to work. In this case, persist has to know that docshell's nsIWebPageDescriptor::currentDescriptor is actually an nsISHEntry and from that grab the cache key. I'd much rather the persist object were given the cache key straight and leave it up to the caller to pull it out from wherever it is stored.
Comment 12•22 years ago
|
||
*** Bug 186030 has been marked as a duplicate of this bug. ***
Assignee | ||
Comment 13•22 years ago
|
||
Patch adds cache key, referrer and headers args to the saveURI method. I'll have to plug in some test combinations before requesting reviews on this. The issue of how the caller gets a cache key to give to the persist object in the first place is their problem.
Attachment #102027 -
Attachment is obsolete: true
Comment 14•22 years ago
|
||
Could you please coordinate this with darin and rpotts? It would be a shame if Rick spends his time making sure cache keys are not exposed anywhere outside of Necko and nsIWebBrowserPersist requires them to function...
Assignee | ||
Comment 15•22 years ago
|
||
Cache keys are exposed as opaque nsISupports objects, available from nsICachingChannel. Anyone who is interested in saving the cache key need only grab it from their web progress listener as the data arrives in the first place. Docshell does this and anyone calling the persist object could too. In other words, it is not hard for the caller to get a cache key and supply it to saveURI. The persist object then opens the channel, QIs for nsICachingChannel and sets the provided key on it, thus allowing data to be refetched from the cache if its there. The key is just some opaque object and neither persist nor the caller needs to care what it is beyond that. This is all the docshell is doing, except it buries the key in the session history entry and ties session history entries to the nsIWebPageDescriptor. The nsIWebPageDescriptor hides the current session history entry behind an opaque currentDescriptor member that would need the persist object to use internal implementation details of the docshell in order to fetch the cache key. The caller might not even be using docshell so this is no good, and if they were it is straightforward enough to supply their own web progress listener and obtain the key that way. Please look at the docshell and see what this interface is doing.
Comment 16•22 years ago
|
||
Adam, I know what that interface is doing -- I reviewed the patch that added it. Here is the problem as I see it: 1) The callers of nsIWebBrowserPersist (99% of the time this is the browser "save as" code in Mozilla and is presumably the "save as" UI in most embedding apps) are typically not web progress listeners 2) The callers of nsIWebBrowserPersist thus have to get the cache key from the docshell directly. 3) There is no API for this short of getting the webnavigation, getting the session history, getting the entry at "0", QIing to nsISHEntry, and getting the cache key from that. Now I could certainly make Mozilla's "save as" code jump through all those hoops to get the cache key, and I will do just that if needed. But the fact that saving a web page requires knowledge of webnavigation and session history for the imbedder seems really wrong... All of this is of course tangential to this bug, which is about the much simpler referrer/headers problems...
Assignee | ||
Comment 17•22 years ago
|
||
1. The nsIWebBrowserPersist interface has an "progressListener" attribute itself, so most embedders will be familiar with it and many will implement one anyway. This is true even for nsProgressDlg.js in Mozilla. 2. The docshell's cache key is only relevant if the caller wants to save a document, otherwise it is no good. It is irrelevant for saving links, images, js, etc. Neither is the page descriptor any good if you want to save a document which is not currently visible, since only the current session history entry is accessible via nsIWebPageDescriptor. 3. There is a frozen embedding api for adding a web progress listener from nsIWebBrowser as well as via docshell, and from these it is just a matter of QI'ing the request for the nsICachingChannel to store the cache key. I really do not believe the nsIWebPageDescriptor is useful substitute at all for just handing the bona fide and easily available cache key. However, I could add some convenience code to the persist object to make life easier for the 'save as' code, i.e. nsIWebBrowserPersist would still document and expect a cache key in the nsISupports value, however the implementation would first QI for nsIWebPageDescriptor and use the cache key obtained from that instead if it does. This will introduce a new build dependency to docshell, but barring any issues with that should be reasonably straightforward.
Comment 18•22 years ago
|
||
I believe the idea of nsIWebPageDescriptor was that at a later point it could transparently be made to be useful for things other than just the HTML of the page, unlike cache keys which can't be, pretty much by definition... But yes, the real problem here is the lack of a good api for getting the "cached page" with all the things hanging off it... As for web progress listeners, the progress listener on the persistence object is the one that listens to the saving process. This can't be the listener that stashes away the cache key, because the cache key is needed before that. So we come back to the fact that the only place to get the cache key is from the docshell (and there is no way to get even that for linked resources such as images...)
Comment 19•22 years ago
|
||
does patch send only http:// referrers sending refferer for file:, mailbox, data: is useless and for https: - a security risk
Comment 20•22 years ago
|
||
All that stuff is already handled by necko. Read nsHttpChannel::SetReferrer please....
Assignee | ||
Comment 21•22 years ago
|
||
Patch accepts a cache key or a page descriptor. I've also updated contentAreaUtils.js to supply a web page descriptor when calling saveURI. The cache key / descriptor thing only kicks in when the page in question is a post request so test with something like the mozilla.org search page.
Attachment #109842 -
Attachment is obsolete: true
Comment 22•22 years ago
|
||
> + * @return NS_ERROR_INVALID_ARG One or more arguments was invalid, including if
> + * referrer, extraheaders or postdata are supplied
> + * when the uri scheme is not http or https.
Why impose the burden of checking scheme for referrer on the caller? Can't you
just ignore the referrer if the channel you create from the uri is not an HTTP
channel? (It may make sense to throw if postdata or extraheaders are set, as
you do now).
The code in contentAreaUtils is wrong for things like "save link as", "save
frame as", and probably a few other callers... That really needs to be dealt
with at a much higher level in the save as code (feel free to just file a
separate bug on doing that).
This looks pretty good, though!
Assignee | ||
Comment 23•22 years ago
|
||
Patch is more lenient about the postdata, referrer, headers args. I've also removed the code in contentAreaUtils.js with the intent that this will be covered by another bug. Boris, do you want to r= this?
Attachment #110869 -
Attachment is obsolete: true
Comment 24•22 years ago
|
||
Comment on attachment 110885 [details] [diff] [review] Updated patch 2 r=bzbarsky; please file separate bugs on having a necko utility function to do that header parsing stuff and on the contentAreaUtils changes that are needed...
Attachment #110885 -
Flags: review+
Assignee | ||
Comment 25•22 years ago
|
||
Comment on attachment 110885 [details] [diff] [review] Updated patch 2 Darin can you sr this as it deals mainly with cache / necko issues?
Attachment #110885 -
Flags: superreview?(darin)
Comment 26•22 years ago
|
||
Comment on attachment 110885 [details] [diff] [review] Updated patch 2 >Index: mozilla/embedding/components/webbrowserpersist/src/nsWebBrowserPersist.cpp >+ oneHeader.StripWhitespace(); hmm... consider this header: Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT if you stripped all whitespace, then you'd have: Last-Modified:Tue,15Nov199412:45:26GMT which looks invalid to me. perhaps you should just trim whitespace after the colon? otherwise, this patch seems fine to me.
Attachment #110885 -
Flags: superreview?(darin) → superreview-
Assignee | ||
Comment 27•22 years ago
|
||
Hmm, I copied that header parsing code from nsDocshell.cpp, so I have produced an updated patch that corrects docshell too. Calls to StripWhitespace are replaced with Trim on the header name and its value.
Attachment #110885 -
Attachment is obsolete: true
Assignee | ||
Comment 28•22 years ago
|
||
Comment on attachment 110947 [details] [diff] [review] Updated patch 3 sr? New patch uses Trim instead and fixes code in docshell that the headers parser was based off
Attachment #110947 -
Flags: superreview?(darin)
Comment 29•22 years ago
|
||
Comment on attachment 110947 [details] [diff] [review] Updated patch 3 sr=darin
Attachment #110947 -
Flags: superreview?(darin) → superreview+
Assignee | ||
Comment 30•22 years ago
|
||
Thanks all, fix is checked in, bug 188253 opened to deal with callers supplying a cache key or descriptor
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
Comment 31•22 years ago
|
||
*** Bug 188726 has been marked as a duplicate of this bug. ***
Updated•8 years ago
|
Product: Core → Core Graveyard
You need to log in
before you can comment on or make changes to this bug.
Description
•