Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: content/child/web_url_loader_impl.cc

Issue 294193002: Set response headers for data URL. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 // An implementation of WebURLLoader in terms of ResourceLoaderBridge. 5 // An implementation of WebURLLoader in terms of ResourceLoaderBridge.
6 6
7 #include "content/child/web_url_loader_impl.h" 7 #include "content/child/web_url_loader_impl.h"
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 using webkit_glue::MultipartResponseDelegate; 60 using webkit_glue::MultipartResponseDelegate;
61 using webkit_glue::ResourceDevToolsInfo; 61 using webkit_glue::ResourceDevToolsInfo;
62 using webkit_glue::ResourceLoaderBridge; 62 using webkit_glue::ResourceLoaderBridge;
63 using webkit_glue::ResourceResponseInfo; 63 using webkit_glue::ResourceResponseInfo;
64 using webkit_glue::WebURLResponseExtraDataImpl; 64 using webkit_glue::WebURLResponseExtraDataImpl;
65 65
66 namespace content { 66 namespace content {
67 67
68 // Utilities ------------------------------------------------------------------ 68 // Utilities ------------------------------------------------------------------
69 69
70 bool GetInfoFromDataURL(const GURL& url,
71 ResourceResponseInfo* info,
72 std::string* data,
73 int* error_code) {
74 std::string mime_type;
75 std::string charset;
76 if (!net::DataURL::Parse(url, &mime_type, &charset, data)) {
77 *error_code = net::ERR_INVALID_URL;
78 return false;
79 }
80
81 DCHECK(!mime_type.empty());
82 DCHECK(!charset.empty());
83
84 // mime_type set by net::DataURL::Parse() is guaranteed to be in
85 // token "/" token
86 // form. Now just ensure charset is token. The grammar for charset is not
87 // specially defined in RFC2045 and RFC2397. It just need to be token or
88 // quoted-string since it's an attibute value of media type. But charset in
eroman 2014/05/29 01:23:26 attitbute --> attribute
tyoshino (SeeGerritForStatus) 2014/05/29 07:21:24 Done.
89 // Content-Type header is specified explicitly to follow token ABNF in
90 // httpbis spec.
91 if (!net::HttpUtil::IsToken(charset)) {
92 *error_code = net::ERR_INVALID_URL;
93 return false;
94 }
95
96 *error_code = net::OK;
eroman 2014/05/29 01:23:26 [optional] Seems like GetInfoFromDataURL() could b
tyoshino (SeeGerritForStatus) 2014/05/29 07:21:24 Done.
97 // Assure same time for all time fields of data: URLs.
98 Time now = Time::Now();
99 info->load_timing.request_start = TimeTicks::Now();
100 info->load_timing.request_start_time = now;
101 info->request_time = now;
102 info->response_time = now;
103
104 scoped_refptr<net::HttpResponseHeaders> headers(
105 new net::HttpResponseHeaders(std::string()));
106 headers->ReplaceStatusLine("HTTP/1.1 200 OK");
107 std::string content_type_header =
108 "Content-Type: " + mime_type + ";charset=" + charset;
109 headers->AddHeader(content_type_header);
110 headers->AddHeader("Access-Control-Allow-Origin: *");
111 info->headers = headers;
112
113 info->mime_type.swap(mime_type);
114 info->charset.swap(charset);
115 info->security_info.clear();
116 info->content_length = data->length();
117 info->encoded_data_length = 0;
118
119 return true;
120 }
121
70 namespace { 122 namespace {
71 123
72 const char kThrottledErrorDescription[] = 124 const char kThrottledErrorDescription[] =
73 "Request throttled. Visit http://dev.chromium.org/throttling for more " 125 "Request throttled. Visit http://dev.chromium.org/throttling for more "
74 "information."; 126 "information.";
75 127
76 class HeaderFlattener : public WebHTTPHeaderVisitor { 128 class HeaderFlattener : public WebHTTPHeaderVisitor {
77 public: 129 public:
78 explicit HeaderFlattener(int load_flags) 130 explicit HeaderFlattener(int load_flags)
79 : load_flags_(load_flags), 131 : load_flags_(load_flags),
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 } 171 }
120 return buffer_; 172 return buffer_;
121 } 173 }
122 174
123 private: 175 private:
124 int load_flags_; 176 int load_flags_;
125 std::string buffer_; 177 std::string buffer_;
126 bool has_accept_header_; 178 bool has_accept_header_;
127 }; 179 };
128 180
129 // Extracts the information from a data: url.
130 bool GetInfoFromDataURL(const GURL& url,
131 ResourceResponseInfo* info,
132 std::string* data,
133 int* error_code) {
134 std::string mime_type;
135 std::string charset;
136 if (net::DataURL::Parse(url, &mime_type, &charset, data)) {
137 *error_code = net::OK;
138 // Assure same time for all time fields of data: URLs.
139 Time now = Time::Now();
140 info->load_timing.request_start = TimeTicks::Now();
141 info->load_timing.request_start_time = now;
142 info->request_time = now;
143 info->response_time = now;
144 info->headers = NULL;
145 info->mime_type.swap(mime_type);
146 info->charset.swap(charset);
147 info->security_info.clear();
148 info->content_length = data->length();
149 info->encoded_data_length = 0;
150
151 return true;
152 }
153
154 *error_code = net::ERR_INVALID_URL;
155 return false;
156 }
157
158 typedef ResourceDevToolsInfo::HeadersVector HeadersVector; 181 typedef ResourceDevToolsInfo::HeadersVector HeadersVector;
159 182
160 // Converts timing data from |load_timing| to the format used by WebKit. 183 // Converts timing data from |load_timing| to the format used by WebKit.
161 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing, 184 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing,
162 WebURLLoadTiming* url_timing) { 185 WebURLLoadTiming* url_timing) {
163 DCHECK(!load_timing.request_start.is_null()); 186 DCHECK(!load_timing.request_start.is_null());
164 187
165 const TimeTicks kNullTicks; 188 const TimeTicks kNullTicks;
166 url_timing->initialize(); 189 url_timing->initialize();
167 url_timing->setRequestTime( 190 url_timing->setRequestTime(
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after
870 void WebURLLoaderImpl::setDefersLoading(bool value) { 893 void WebURLLoaderImpl::setDefersLoading(bool value) {
871 context_->SetDefersLoading(value); 894 context_->SetDefersLoading(value);
872 } 895 }
873 896
874 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority, 897 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority,
875 int intra_priority_value) { 898 int intra_priority_value) {
876 context_->DidChangePriority(new_priority, intra_priority_value); 899 context_->DidChangePriority(new_priority, intra_priority_value);
877 } 900 }
878 901
879 } // namespace content 902 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698