#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) {
}
}
+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.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