0

Honor User-Agent header added by WebCore

- do not strip User-Agent while flattening headers in renderer
- do not override User-Agent header in the network stack if one is already supplied by higher level;
- added RequestHeaders::SetHeaderIfMissing

TEST=URLRequestTestHTTP.OverrideUserAgent
BUG=http://crbug.com/67063
Review URL=http://codereview.chromium.org/6065008


git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72131 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
caseq@google.com
2011-01-21 13:38:45 +00:00
parent fad4724ea2
commit 50ba404bc0
6 changed files with 59 additions and 17 deletions

@ -76,6 +76,13 @@ void HttpRequestHeaders::Clear() {
headers_.clear();
}
void HttpRequestHeaders::SetHeaderIfMissing(const base::StringPiece& key,
const base::StringPiece& value) {
HeaderVector::iterator it = FindHeader(key);
if (it == headers_.end())
headers_.push_back(HeaderKeyValuePair(key.as_string(), value.as_string()));
}
void HttpRequestHeaders::SetHeader(const base::StringPiece& key,
const base::StringPiece& value) {
HeaderVector::iterator it = FindHeader(key);

@ -95,6 +95,12 @@ class HttpRequestHeaders {
// in the vector remains the same. When comparing |key|, case is ignored.
void SetHeader(const base::StringPiece& key, const base::StringPiece& value);
// Sets the header value pair for |key| and |value|, if |key| does not exist.
// If |key| already exists, the call is a no-op.
// When comparing |key|, case is ignored.
void SetHeaderIfMissing(const base::StringPiece& key,
const base::StringPiece& value);
// Removes the first header that matches (case insensitive) |key|.
void RemoveHeader(const base::StringPiece& key);

@ -67,6 +67,14 @@ TEST(HttpRequestHeaders, SetEmptyHeader) {
EXPECT_EQ("Foo: Bar\r\nBar:\r\n\r\n", headers.ToString());
}
TEST(HttpRequestHeaders, SetHeaderIfMissing) {
HttpRequestHeaders headers;
headers.SetHeaderIfMissing("Foo", "Bar");
EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString());
headers.SetHeaderIfMissing("Foo", "Baz");
EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString());
}
TEST(HttpRequestHeaders, RemoveHeader) {
HttpRequestHeaders headers;
headers.SetHeader("Foo", "bar");

@ -303,18 +303,12 @@ void URLRequestHttpJob::AddExtraHeaders() {
if (context) {
// Only add default Accept-Language and Accept-Charset if the request
// didn't have them specified.
if (!request_info_.extra_headers.HasHeader(
HttpRequestHeaders::kAcceptLanguage)) {
request_info_.extra_headers.SetHeader(
HttpRequestHeaders::kAcceptLanguage,
context->accept_language());
}
if (!request_info_.extra_headers.HasHeader(
HttpRequestHeaders::kAcceptCharset)) {
request_info_.extra_headers.SetHeader(
HttpRequestHeaders::kAcceptCharset,
context->accept_charset());
}
request_info_.extra_headers.SetHeaderIfMissing(
HttpRequestHeaders::kAcceptLanguage,
context->accept_language());
request_info_.extra_headers.SetHeaderIfMissing(
HttpRequestHeaders::kAcceptCharset,
context->accept_charset());
}
}
@ -660,7 +654,7 @@ void URLRequestHttpJob::Start() {
request_info_.priority = request_->priority();
if (request_->context()) {
request_info_.extra_headers.SetHeader(
request_info_.extra_headers.SetHeaderIfMissing(
HttpRequestHeaders::kUserAgent,
request_->context()->GetUserAgent(request_->url()));
}

@ -2642,3 +2642,32 @@ TEST_F(URLRequestTestHTTP, OverrideAcceptCharset) {
MessageLoop::current()->Run();
EXPECT_EQ(std::string("koi-8r"), d.data_received());
}
// Check that default User-Agent header is sent.
TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
ASSERT_TRUE(test_server_.Start());
TestDelegate d;
TestURLRequest req(test_server_.GetURL("echoheader?User-Agent"), &d);
req.set_context(new TestURLRequestContext());
req.Start();
MessageLoop::current()->Run();
EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received());
}
// Check that if request overrides the User-Agent header,
// the default is not appended.
TEST_F(URLRequestTestHTTP, OverrideUserAgent) {
ASSERT_TRUE(test_server_.Start());
TestDelegate d;
TestURLRequest
req(test_server_.GetURL("echoheaderoverride?User-Agent"), &d);
req.set_context(new TestURLRequestContext());
net::HttpRequestHeaders headers;
headers.SetHeader(net::HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
req.SetExtraRequestHeaders(headers);
req.Start();
MessageLoop::current()->Run();
EXPECT_EQ(std::string("Lynx (textmode)"), d.data_received());
}

@ -69,10 +69,8 @@ class HeaderFlattener : public WebHTTPHeaderVisitor {
const std::string& value_utf8 = value.utf8();
// Skip over referrer headers found in the header map because we already
// pulled it out as a separate parameter. We likewise prune the UA since
// that will be added back by the network layer.
if (LowerCaseEqualsASCII(name_utf8, "referer") ||
LowerCaseEqualsASCII(name_utf8, "user-agent"))
// pulled it out as a separate parameter.
if (LowerCaseEqualsASCII(name_utf8, "referer"))
return;
// Skip over "Cache-Control: max-age=0" header if the corresponding