mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 10:44:56 +00:00
Bug 401564 - Test and fix for redirection losing Accept header. r=mcmanus
The test has a redirect where the initial GET request had Accept: application/json, and ensures that this is also the type of the redirected request. The fix is done in the setup of the replicated HttpBaseChannel, where the previous channel's Accept header is copied to the new one, if it exists.
This commit is contained in:
parent
6f5e715f2f
commit
195da932bf
@ -1810,6 +1810,17 @@ HttpBaseChannel::SetupReplacementChannel(nsIURI *newURI,
|
||||
// convey the new redirection limit
|
||||
httpChannel->SetRedirectionLimit(mRedirectionLimit - 1);
|
||||
|
||||
// convey the Accept header value
|
||||
{
|
||||
nsAutoCString oldAcceptValue;
|
||||
nsresult hasHeader = mRequestHead.GetHeader(nsHttp::Accept, oldAcceptValue);
|
||||
if (NS_SUCCEEDED(hasHeader)) {
|
||||
httpChannel->SetRequestHeader(NS_LITERAL_CSTRING("Accept"),
|
||||
oldAcceptValue,
|
||||
false);
|
||||
}
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIHttpChannelInternal> httpInternal = do_QueryInterface(newChannel);
|
||||
if (httpInternal) {
|
||||
// convey the mForceAllowThirdPartyCookie flag
|
||||
|
49
netwerk/test/unit/test_bug401564.js
Normal file
49
netwerk/test/unit/test_bug401564.js
Normal file
@ -0,0 +1,49 @@
|
||||
/* -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
"use strict";
|
||||
Cu.import("resource://testing-common/httpd.js");
|
||||
|
||||
var httpserver = null;
|
||||
const noRedirectURI = "/content";
|
||||
const pageValue = "Final page";
|
||||
const acceptType = "application/json";
|
||||
|
||||
function redirectHandler(metadata, response)
|
||||
{
|
||||
response.setStatusLine(metadata.httpVersion, 302, "Moved Temporarily");
|
||||
response.setHeader("Location", noRedirectURI, false);
|
||||
}
|
||||
|
||||
function contentHandler(metadata, response)
|
||||
{
|
||||
do_check_eq(metadata.getHeader("Accept"), acceptType);
|
||||
httpserver.stop(do_test_finished);
|
||||
}
|
||||
|
||||
function dummyHandler(request, buffer)
|
||||
{
|
||||
}
|
||||
|
||||
function run_test()
|
||||
{
|
||||
httpserver = new HttpServer();
|
||||
httpserver.registerPathHandler("/redirect", redirectHandler);
|
||||
httpserver.registerPathHandler("/content", contentHandler);
|
||||
httpserver.start(-1);
|
||||
|
||||
var prefs = Cc["@mozilla.org/preferences-service;1"]
|
||||
.getService(Components.interfaces.nsIPrefBranch);
|
||||
prefs.setBoolPref("network.http.prompt-temp-redirect", false);
|
||||
|
||||
var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
|
||||
var chan = ios.newChannel("http://localhost:" +
|
||||
httpserver.identity.primaryPort + "/redirect",
|
||||
"",
|
||||
null);
|
||||
|
||||
chan.QueryInterface(Ci.nsIHttpChannel);
|
||||
chan.setRequestHeader("Accept", acceptType, false);
|
||||
|
||||
chan.asyncOpen(new ChannelListener(dummyHandler, null), null);
|
||||
|
||||
do_test_pending();
|
||||
}
|
@ -96,6 +96,7 @@ skip-if = "FTP channel implementation needs to migrate to the new cache backend
|
||||
[test_bug380994.js]
|
||||
[test_bug388281.js]
|
||||
[test_bug396389.js]
|
||||
[test_bug401564.js]
|
||||
[test_bug411952.js]
|
||||
[test_bug412945.js]
|
||||
[test_bug414122.js]
|
||||
|
Loading…
Reference in New Issue
Block a user