| Index: content/child/web_url_request_util.cc
|
| diff --git a/content/child/web_url_request_util.cc b/content/child/web_url_request_util.cc
|
| index 64ea18d65c2d013336e392efa8bd13f1615a2b7a..11c1b01bc6321c5fb107c834b52aebd1aedbc83d 100644
|
| --- a/content/child/web_url_request_util.cc
|
| +++ b/content/child/web_url_request_util.cc
|
| @@ -5,12 +5,60 @@
|
| #include "content/child/web_url_request_util.h"
|
|
|
| #include "base/logging.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "net/base/load_flags.h"
|
| +#include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h"
|
| +#include "third_party/WebKit/public/platform/WebString.h"
|
| #include "third_party/WebKit/public/platform/WebURLRequest.h"
|
|
|
| using blink::WebURLRequest;
|
| +using blink::WebString;
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| +class HeaderFlattener : public blink::WebHTTPHeaderVisitor {
|
| + public:
|
| + HeaderFlattener() : has_accept_header_(false) {}
|
| +
|
| + virtual void visitHeader(const WebString& name, const WebString& value) {
|
| + // Headers are latin1.
|
| + const std::string& name_latin1 = name.latin1();
|
| + const std::string& value_latin1 = value.latin1();
|
| +
|
| + // Skip over referrer headers found in the header map because we already
|
| + // pulled it out as a separate parameter.
|
| + if (LowerCaseEqualsASCII(name_latin1, "referer"))
|
| + return;
|
| +
|
| + if (LowerCaseEqualsASCII(name_latin1, "accept"))
|
| + has_accept_header_ = true;
|
| +
|
| + if (!buffer_.empty())
|
| + buffer_.append("\r\n");
|
| + buffer_.append(name_latin1 + ": " + value_latin1);
|
| + }
|
| +
|
| + const std::string& GetBuffer() {
|
| + // In some cases, WebKit doesn't add an Accept header, but not having the
|
| + // header confuses some web servers. See bug 808613.
|
| + if (!has_accept_header_) {
|
| + if (!buffer_.empty())
|
| + buffer_.append("\r\n");
|
| + buffer_.append("Accept: */*");
|
| + has_accept_header_ = true;
|
| + }
|
| + return buffer_;
|
| + }
|
| +
|
| + private:
|
| + std::string buffer_;
|
| + bool has_accept_header_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| ResourceType WebURLRequestToResourceType(const WebURLRequest& request) {
|
| WebURLRequest::RequestContext requestContext = request.requestContext();
|
| if (request.frameType() != WebURLRequest::FrameTypeNone) {
|
| @@ -120,4 +168,53 @@ ResourceType WebURLRequestToResourceType(const WebURLRequest& request) {
|
| }
|
| }
|
|
|
| +std::string GetWebURLRequestHeaders(const blink::WebURLRequest& request) {
|
| + HeaderFlattener flattener;
|
| + request.visitHTTPHeaderFields(&flattener);
|
| + return flattener.GetBuffer();
|
| +}
|
| +
|
| +int GetLoadFlagsForWebURLRequest(const blink::WebURLRequest& request) {
|
| + int load_flags = net::LOAD_NORMAL;
|
| + GURL url = request.url();
|
| + switch (request.cachePolicy()) {
|
| + case WebURLRequest::ReloadIgnoringCacheData:
|
| + // Required by LayoutTests/http/tests/misc/refresh-headers.php
|
| + load_flags |= net::LOAD_VALIDATE_CACHE;
|
| + break;
|
| + case WebURLRequest::ReloadBypassingCache:
|
| + load_flags |= net::LOAD_BYPASS_CACHE;
|
| + break;
|
| + case WebURLRequest::ReturnCacheDataElseLoad:
|
| + load_flags |= net::LOAD_PREFERRING_CACHE;
|
| + break;
|
| + case WebURLRequest::ReturnCacheDataDontLoad:
|
| + load_flags |= net::LOAD_ONLY_FROM_CACHE;
|
| + break;
|
| + case WebURLRequest::UseProtocolCachePolicy:
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +
|
| + if (request.reportUploadProgress())
|
| + load_flags |= net::LOAD_ENABLE_UPLOAD_PROGRESS;
|
| + if (request.reportRawHeaders())
|
| + load_flags |= net::LOAD_REPORT_RAW_HEADERS;
|
| +
|
| + if (!request.allowStoredCredentials()) {
|
| + load_flags |= net::LOAD_DO_NOT_SAVE_COOKIES;
|
| + load_flags |= net::LOAD_DO_NOT_SEND_COOKIES;
|
| + }
|
| +
|
| + if (!request.allowStoredCredentials())
|
| + load_flags |= net::LOAD_DO_NOT_SEND_AUTH_DATA;
|
| +
|
| + if (request.requestContext() == WebURLRequest::RequestContextXMLHttpRequest &&
|
| + (url.has_username() || url.has_password())) {
|
| + load_flags |= net::LOAD_DO_NOT_PROMPT_FOR_LOGIN;
|
| + }
|
| + return load_flags;
|
| +}
|
| +
|
| } // namespace content
|
|
|