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:
@ -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
|
||||
|
Reference in New Issue
Block a user