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 |