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:
Scott West 2014-02-26 09:03:14 -05:00
parent b4c21f0962
commit 5c2e99cf97
3 changed files with 61 additions and 0 deletions

View File

@ -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

View 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();
}

View File

@ -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]