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();
|
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,
|
void HttpRequestHeaders::SetHeader(const base::StringPiece& key,
|
||||||
const base::StringPiece& value) {
|
const base::StringPiece& value) {
|
||||||
HeaderVector::iterator it = FindHeader(key);
|
HeaderVector::iterator it = FindHeader(key);
|
||||||
|
@ -95,6 +95,12 @@ class HttpRequestHeaders {
|
|||||||
// in the vector remains the same. When comparing |key|, case is ignored.
|
// in the vector remains the same. When comparing |key|, case is ignored.
|
||||||
void SetHeader(const base::StringPiece& key, const base::StringPiece& value);
|
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|.
|
// Removes the first header that matches (case insensitive) |key|.
|
||||||
void RemoveHeader(const base::StringPiece& 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());
|
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) {
|
TEST(HttpRequestHeaders, RemoveHeader) {
|
||||||
HttpRequestHeaders headers;
|
HttpRequestHeaders headers;
|
||||||
headers.SetHeader("Foo", "bar");
|
headers.SetHeader("Foo", "bar");
|
||||||
|
@ -303,18 +303,12 @@ void URLRequestHttpJob::AddExtraHeaders() {
|
|||||||
if (context) {
|
if (context) {
|
||||||
// Only add default Accept-Language and Accept-Charset if the request
|
// Only add default Accept-Language and Accept-Charset if the request
|
||||||
// didn't have them specified.
|
// didn't have them specified.
|
||||||
if (!request_info_.extra_headers.HasHeader(
|
request_info_.extra_headers.SetHeaderIfMissing(
|
||||||
HttpRequestHeaders::kAcceptLanguage)) {
|
HttpRequestHeaders::kAcceptLanguage,
|
||||||
request_info_.extra_headers.SetHeader(
|
context->accept_language());
|
||||||
HttpRequestHeaders::kAcceptLanguage,
|
request_info_.extra_headers.SetHeaderIfMissing(
|
||||||
context->accept_language());
|
HttpRequestHeaders::kAcceptCharset,
|
||||||
}
|
context->accept_charset());
|
||||||
if (!request_info_.extra_headers.HasHeader(
|
|
||||||
HttpRequestHeaders::kAcceptCharset)) {
|
|
||||||
request_info_.extra_headers.SetHeader(
|
|
||||||
HttpRequestHeaders::kAcceptCharset,
|
|
||||||
context->accept_charset());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -660,7 +654,7 @@ void URLRequestHttpJob::Start() {
|
|||||||
request_info_.priority = request_->priority();
|
request_info_.priority = request_->priority();
|
||||||
|
|
||||||
if (request_->context()) {
|
if (request_->context()) {
|
||||||
request_info_.extra_headers.SetHeader(
|
request_info_.extra_headers.SetHeaderIfMissing(
|
||||||
HttpRequestHeaders::kUserAgent,
|
HttpRequestHeaders::kUserAgent,
|
||||||
request_->context()->GetUserAgent(request_->url()));
|
request_->context()->GetUserAgent(request_->url()));
|
||||||
}
|
}
|
||||||
|
@ -2642,3 +2642,32 @@ TEST_F(URLRequestTestHTTP, OverrideAcceptCharset) {
|
|||||||
MessageLoop::current()->Run();
|
MessageLoop::current()->Run();
|
||||||
EXPECT_EQ(std::string("koi-8r"), d.data_received());
|
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();
|
const std::string& value_utf8 = value.utf8();
|
||||||
|
|
||||||
// Skip over referrer headers found in the header map because we already
|
// 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
|
// pulled it out as a separate parameter.
|
||||||
// that will be added back by the network layer.
|
if (LowerCaseEqualsASCII(name_utf8, "referer"))
|
||||||
if (LowerCaseEqualsASCII(name_utf8, "referer") ||
|
|
||||||
LowerCaseEqualsASCII(name_utf8, "user-agent"))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Skip over "Cache-Control: max-age=0" header if the corresponding
|
// Skip over "Cache-Control: max-age=0" header if the corresponding
|
||||||
|
Reference in New Issue
Block a user