OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/child/web_url_request_util.h" | 5 #include "content/child/web_url_request_util.h" |
6 | 6 |
7 #include "base/logging.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" |
8 #include "third_party/WebKit/public/platform/WebURLRequest.h" | 12 #include "third_party/WebKit/public/platform/WebURLRequest.h" |
9 | 13 |
10 using blink::WebURLRequest; | 14 using blink::WebURLRequest; |
| 15 using blink::WebString; |
11 | 16 |
12 namespace content { | 17 namespace content { |
13 | 18 |
| 19 namespace { |
| 20 |
| 21 class HeaderFlattener : public blink::WebHTTPHeaderVisitor { |
| 22 public: |
| 23 HeaderFlattener() : has_accept_header_(false) {} |
| 24 |
| 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(); |
| 29 |
| 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")) |
| 33 return; |
| 34 |
| 35 if (LowerCaseEqualsASCII(name_latin1, "accept")) |
| 36 has_accept_header_ = true; |
| 37 |
| 38 if (!buffer_.empty()) |
| 39 buffer_.append("\r\n"); |
| 40 buffer_.append(name_latin1 + ": " + value_latin1); |
| 41 } |
| 42 |
| 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_) { |
| 47 if (!buffer_.empty()) |
| 48 buffer_.append("\r\n"); |
| 49 buffer_.append("Accept: */*"); |
| 50 has_accept_header_ = true; |
| 51 } |
| 52 return buffer_; |
| 53 } |
| 54 |
| 55 private: |
| 56 std::string buffer_; |
| 57 bool has_accept_header_; |
| 58 }; |
| 59 |
| 60 } // namespace |
| 61 |
14 ResourceType WebURLRequestToResourceType(const WebURLRequest& request) { | 62 ResourceType WebURLRequestToResourceType(const WebURLRequest& request) { |
15 WebURLRequest::RequestContext requestContext = request.requestContext(); | 63 WebURLRequest::RequestContext requestContext = request.requestContext(); |
16 if (request.frameType() != WebURLRequest::FrameTypeNone) { | 64 if (request.frameType() != WebURLRequest::FrameTypeNone) { |
17 DCHECK(requestContext == WebURLRequest::RequestContextForm || | 65 DCHECK(requestContext == WebURLRequest::RequestContextForm || |
18 requestContext == WebURLRequest::RequestContextFrame || | 66 requestContext == WebURLRequest::RequestContextFrame || |
19 requestContext == WebURLRequest::RequestContextHyperlink || | 67 requestContext == WebURLRequest::RequestContextHyperlink || |
20 requestContext == WebURLRequest::RequestContextIframe || | 68 requestContext == WebURLRequest::RequestContextIframe || |
21 requestContext == WebURLRequest::RequestContextInternal || | 69 requestContext == WebURLRequest::RequestContextInternal || |
22 requestContext == WebURLRequest::RequestContextLocation); | 70 requestContext == WebURLRequest::RequestContextLocation); |
23 if (request.frameType() == WebURLRequest::FrameTypeTopLevel || | 71 if (request.frameType() == WebURLRequest::FrameTypeTopLevel || |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 case WebURLRequest::RequestContextIframe: | 161 case WebURLRequest::RequestContextIframe: |
114 NOTREACHED(); | 162 NOTREACHED(); |
115 return RESOURCE_TYPE_SUB_RESOURCE; | 163 return RESOURCE_TYPE_SUB_RESOURCE; |
116 | 164 |
117 default: | 165 default: |
118 NOTREACHED(); | 166 NOTREACHED(); |
119 return RESOURCE_TYPE_SUB_RESOURCE; | 167 return RESOURCE_TYPE_SUB_RESOURCE; |
120 } | 168 } |
121 } | 169 } |
122 | 170 |
| 171 std::string GetWebURLRequestHeaders(const blink::WebURLRequest& request) { |
| 172 HeaderFlattener flattener; |
| 173 request.visitHTTPHeaderFields(&flattener); |
| 174 return flattener.GetBuffer(); |
| 175 } |
| 176 |
| 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; |
| 184 break; |
| 185 case WebURLRequest::ReloadBypassingCache: |
| 186 load_flags |= net::LOAD_BYPASS_CACHE; |
| 187 break; |
| 188 case WebURLRequest::ReturnCacheDataElseLoad: |
| 189 load_flags |= net::LOAD_PREFERRING_CACHE; |
| 190 break; |
| 191 case WebURLRequest::ReturnCacheDataDontLoad: |
| 192 load_flags |= net::LOAD_ONLY_FROM_CACHE; |
| 193 break; |
| 194 case WebURLRequest::UseProtocolCachePolicy: |
| 195 break; |
| 196 default: |
| 197 NOTREACHED(); |
| 198 } |
| 199 |
| 200 if (request.reportUploadProgress()) |
| 201 load_flags |= net::LOAD_ENABLE_UPLOAD_PROGRESS; |
| 202 if (request.reportRawHeaders()) |
| 203 load_flags |= net::LOAD_REPORT_RAW_HEADERS; |
| 204 |
| 205 if (!request.allowStoredCredentials()) { |
| 206 load_flags |= net::LOAD_DO_NOT_SAVE_COOKIES; |
| 207 load_flags |= net::LOAD_DO_NOT_SEND_COOKIES; |
| 208 } |
| 209 |
| 210 if (!request.allowStoredCredentials()) |
| 211 load_flags |= net::LOAD_DO_NOT_SEND_AUTH_DATA; |
| 212 |
| 213 if (request.requestContext() == WebURLRequest::RequestContextXMLHttpRequest && |
| 214 (url.has_username() || url.has_password())) { |
| 215 load_flags |= net::LOAD_DO_NOT_PROMPT_FOR_LOGIN; |
| 216 } |
| 217 return load_flags; |
| 218 } |
| 219 |
123 } // namespace content | 220 } // namespace content |
OLD | NEW |