1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/child/web_url_request_util.h"
7 #include "base/logging.h"
8 #include "base/strings/string_util.h"
9 #include "net/base/load_flags.h"
10 #include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h"
11 #include "third_party/WebKit/public/platform/WebString.h"
12 #include "third_party/WebKit/public/platform/WebURLRequest.h"
14 using blink::WebURLRequest;
15 using blink::WebString;
21 class HeaderFlattener : public blink::WebHTTPHeaderVisitor {
23 HeaderFlattener() : has_accept_header_(false) {}
25 virtual void visitHeader(const WebString& name, const WebString& value) {
26 // Headers are latin1.
27 const std::string& name_latin1 = name.latin1();
28 const std::string& value_latin1 = value.latin1();
30 // Skip over referrer headers found in the header map because we already
31 // pulled it out as a separate parameter.
32 if (LowerCaseEqualsASCII(name_latin1, "referer"))
35 if (LowerCaseEqualsASCII(name_latin1, "accept"))
36 has_accept_header_ = true;
39 buffer_.append("\r\n");
40 buffer_.append(name_latin1 + ": " + value_latin1);
43 const std::string& GetBuffer() {
44 // In some cases, WebKit doesn't add an Accept header, but not having the
45 // header confuses some web servers. See bug 808613.
46 if (!has_accept_header_) {
48 buffer_.append("\r\n");
49 buffer_.append("Accept: */*");
50 has_accept_header_ = true;
57 bool has_accept_header_;
62 ResourceType WebURLRequestToResourceType(const WebURLRequest& request) {
63 WebURLRequest::RequestContext requestContext = request.requestContext();
64 if (request.frameType() != WebURLRequest::FrameTypeNone) {
65 DCHECK(requestContext == WebURLRequest::RequestContextForm ||
66 requestContext == WebURLRequest::RequestContextFrame ||
67 requestContext == WebURLRequest::RequestContextHyperlink ||
68 requestContext == WebURLRequest::RequestContextIframe ||
69 requestContext == WebURLRequest::RequestContextInternal ||
70 requestContext == WebURLRequest::RequestContextLocation);
71 if (request.frameType() == WebURLRequest::FrameTypeTopLevel ||
72 request.frameType() == WebURLRequest::FrameTypeAuxiliary) {
73 return RESOURCE_TYPE_MAIN_FRAME;
75 if (request.frameType() == WebURLRequest::FrameTypeNested)
76 return RESOURCE_TYPE_SUB_FRAME;
78 return RESOURCE_TYPE_SUB_RESOURCE;
81 switch (requestContext) {
83 case WebURLRequest::RequestContextFavicon:
84 return RESOURCE_TYPE_FAVICON;
87 case WebURLRequest::RequestContextFont:
88 return RESOURCE_TYPE_FONT_RESOURCE;
91 case WebURLRequest::RequestContextImage:
92 case WebURLRequest::RequestContextImageSet:
93 return RESOURCE_TYPE_IMAGE;
96 case WebURLRequest::RequestContextAudio:
97 case WebURLRequest::RequestContextVideo:
98 return RESOURCE_TYPE_MEDIA;
101 case WebURLRequest::RequestContextEmbed:
102 case WebURLRequest::RequestContextObject:
103 return RESOURCE_TYPE_OBJECT;
106 case WebURLRequest::RequestContextBeacon:
107 case WebURLRequest::RequestContextCSPReport:
108 case WebURLRequest::RequestContextPing:
109 return RESOURCE_TYPE_PING;
112 case WebURLRequest::RequestContextPrefetch:
113 return RESOURCE_TYPE_PREFETCH;
116 case WebURLRequest::RequestContextImport:
117 case WebURLRequest::RequestContextScript:
118 return RESOURCE_TYPE_SCRIPT;
121 case WebURLRequest::RequestContextXSLT:
122 case WebURLRequest::RequestContextStyle:
123 return RESOURCE_TYPE_STYLESHEET;
126 case WebURLRequest::RequestContextDownload:
127 case WebURLRequest::RequestContextManifest:
128 case WebURLRequest::RequestContextSubresource:
129 case WebURLRequest::RequestContextPlugin:
130 return RESOURCE_TYPE_SUB_RESOURCE;
133 case WebURLRequest::RequestContextTrack:
134 return RESOURCE_TYPE_MEDIA;
137 case WebURLRequest::RequestContextServiceWorker:
138 return RESOURCE_TYPE_SERVICE_WORKER;
139 case WebURLRequest::RequestContextSharedWorker:
140 return RESOURCE_TYPE_SHARED_WORKER;
141 case WebURLRequest::RequestContextWorker:
142 return RESOURCE_TYPE_WORKER;
145 case WebURLRequest::RequestContextInternal:
146 case WebURLRequest::RequestContextUnspecified:
147 return RESOURCE_TYPE_SUB_RESOURCE;
150 case WebURLRequest::RequestContextEventSource:
151 case WebURLRequest::RequestContextFetch:
152 case WebURLRequest::RequestContextXMLHttpRequest:
153 return RESOURCE_TYPE_XHR;
155 // These should be handled by the FrameType checks at the top of the
157 case WebURLRequest::RequestContextForm:
158 case WebURLRequest::RequestContextHyperlink:
159 case WebURLRequest::RequestContextLocation:
160 case WebURLRequest::RequestContextFrame:
161 case WebURLRequest::RequestContextIframe:
163 return RESOURCE_TYPE_SUB_RESOURCE;
167 return RESOURCE_TYPE_SUB_RESOURCE;
171 std::string GetWebURLRequestHeaders(const blink::WebURLRequest& request) {
172 HeaderFlattener flattener;
173 request.visitHTTPHeaderFields(&flattener);
174 return flattener.GetBuffer();
177 int GetLoadFlagsForWebURLRequest(const blink::WebURLRequest& request) {
178 int load_flags = net::LOAD_NORMAL;
179 GURL url = request.url();
180 switch (request.cachePolicy()) {
181 case WebURLRequest::ReloadIgnoringCacheData:
182 // Required by LayoutTests/http/tests/misc/refresh-headers.php
183 load_flags |= net::LOAD_VALIDATE_CACHE;
185 case WebURLRequest::ReloadBypassingCache:
186 load_flags |= net::LOAD_BYPASS_CACHE;
188 case WebURLRequest::ReturnCacheDataElseLoad:
189 load_flags |= net::LOAD_PREFERRING_CACHE;
191 case WebURLRequest::ReturnCacheDataDontLoad:
192 load_flags |= net::LOAD_ONLY_FROM_CACHE;
194 case WebURLRequest::UseProtocolCachePolicy:
200 if (request.reportRawHeaders())
201 load_flags |= net::LOAD_REPORT_RAW_HEADERS;
203 if (!request.allowStoredCredentials()) {
204 load_flags |= net::LOAD_DO_NOT_SAVE_COOKIES;
205 load_flags |= net::LOAD_DO_NOT_SEND_COOKIES;
208 if (!request.allowStoredCredentials())
209 load_flags |= net::LOAD_DO_NOT_SEND_AUTH_DATA;
211 if (request.requestContext() == WebURLRequest::RequestContextXMLHttpRequest &&
212 (url.has_username() || url.has_password())) {
213 load_flags |= net::LOAD_DO_NOT_PROMPT_FOR_LOGIN;
218 } // namespace content