diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-17 00:09:25 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-17 00:09:25 +0000 |
commit | 50106bf5210c384f90a45cad94992ed22f931cac (patch) | |
tree | 4f93ecdd0081caafa6db085705fac32db645d0ec /webkit | |
parent | de9c2085ba61d079f9266c70fb11837a3f54416d (diff) | |
download | chromium_src-50106bf5210c384f90a45cad94992ed22f931cac.zip chromium_src-50106bf5210c384f90a45cad94992ed22f931cac.tar.gz chromium_src-50106bf5210c384f90a45cad94992ed22f931cac.tar.bz2 |
Support byte range requests when routing resource requests directly through the browser process.
This also fixes a number of issues I saw when testing Netflix:
-fix http status header not reaching plugin
-send a Content-Type header if one isn't specified by the plugin for POSTs
-null check info->headers, needed for data: URLs
This doesn't support responding to 200s after a byte-range request. I'm gathering stats now to see how often this happens.
BUG=286074
R=ananta@chromium.org, jschuh@chromium.org
Review URL: https://codereview.chromium.org/23830007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223483 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/child/weburlloader_impl.cc | 217 | ||||
-rw-r--r-- | webkit/child/weburlloader_impl.h | 6 |
2 files changed, 114 insertions, 109 deletions
diff --git a/webkit/child/weburlloader_impl.cc b/webkit/child/weburlloader_impl.cc index c88f06e..8de8752 100644 --- a/webkit/child/weburlloader_impl.cc +++ b/webkit/child/weburlloader_impl.cc @@ -180,115 +180,6 @@ void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing, (load_timing.receive_headers_end - kNullTicks).InSecondsF()); } -void PopulateURLResponse( - const GURL& url, - const ResourceResponseInfo& info, - WebURLResponse* response) { - response->setURL(url); - response->setResponseTime(info.response_time.ToDoubleT()); - response->setMIMEType(WebString::fromUTF8(info.mime_type)); - response->setTextEncodingName(WebString::fromUTF8(info.charset)); - response->setExpectedContentLength(info.content_length); - response->setSecurityInfo(info.security_info); - response->setAppCacheID(info.appcache_id); - response->setAppCacheManifestURL(info.appcache_manifest_url); - response->setWasCached(!info.load_timing.request_start_time.is_null() && - info.response_time < info.load_timing.request_start_time); - response->setRemoteIPAddress( - WebString::fromUTF8(info.socket_address.host())); - response->setRemotePort(info.socket_address.port()); - response->setConnectionID(info.load_timing.socket_log_id); - response->setConnectionReused(info.load_timing.socket_reused); - response->setDownloadFilePath(info.download_file_path.AsUTF16Unsafe()); - WebURLResponseExtraDataImpl* extra_data = - new WebURLResponseExtraDataImpl(info.npn_negotiated_protocol); - response->setExtraData(extra_data); - extra_data->set_was_fetched_via_spdy(info.was_fetched_via_spdy); - extra_data->set_was_npn_negotiated(info.was_npn_negotiated); - extra_data->set_was_alternate_protocol_available( - info.was_alternate_protocol_available); - extra_data->set_connection_info(info.connection_info); - extra_data->set_was_fetched_via_proxy(info.was_fetched_via_proxy); - - // If there's no received headers end time, don't set load timing. This is - // the case for non-HTTP requests, requests that don't go over the wire, and - // certain error cases. - if (!info.load_timing.receive_headers_end.is_null()) { - WebURLLoadTiming timing; - PopulateURLLoadTiming(info.load_timing, &timing); - response->setLoadTiming(timing); - } - - if (info.devtools_info.get()) { - WebHTTPLoadInfo load_info; - - load_info.setHTTPStatusCode(info.devtools_info->http_status_code); - load_info.setHTTPStatusText(WebString::fromLatin1( - info.devtools_info->http_status_text)); - load_info.setEncodedDataLength(info.encoded_data_length); - - load_info.setRequestHeadersText(WebString::fromLatin1( - info.devtools_info->request_headers_text)); - load_info.setResponseHeadersText(WebString::fromLatin1( - info.devtools_info->response_headers_text)); - const HeadersVector& request_headers = info.devtools_info->request_headers; - for (HeadersVector::const_iterator it = request_headers.begin(); - it != request_headers.end(); ++it) { - load_info.addRequestHeader(WebString::fromLatin1(it->first), - WebString::fromLatin1(it->second)); - } - const HeadersVector& response_headers = - info.devtools_info->response_headers; - for (HeadersVector::const_iterator it = response_headers.begin(); - it != response_headers.end(); ++it) { - load_info.addResponseHeader(WebString::fromLatin1(it->first), - WebString::fromLatin1(it->second)); - } - response->setHTTPLoadInfo(load_info); - } - - const net::HttpResponseHeaders* headers = info.headers.get(); - if (!headers) - return; - - WebURLResponse::HTTPVersion version = WebURLResponse::Unknown; - if (headers->GetHttpVersion() == net::HttpVersion(0, 9)) - version = WebURLResponse::HTTP_0_9; - else if (headers->GetHttpVersion() == net::HttpVersion(1, 0)) - version = WebURLResponse::HTTP_1_0; - else if (headers->GetHttpVersion() == net::HttpVersion(1, 1)) - version = WebURLResponse::HTTP_1_1; - response->setHTTPVersion(version); - response->setHTTPStatusCode(headers->response_code()); - response->setHTTPStatusText(WebString::fromLatin1(headers->GetStatusText())); - - // TODO(darin): We should leverage HttpResponseHeaders for this, and this - // should be using the same code as ResourceDispatcherHost. - // TODO(jungshik): Figure out the actual value of the referrer charset and - // pass it to GetSuggestedFilename. - std::string value; - headers->EnumerateHeader(NULL, "content-disposition", &value); - response->setSuggestedFileName( - net::GetSuggestedFilename(url, - value, - std::string(), // referrer_charset - std::string(), // suggested_name - std::string(), // mime_type - std::string())); // default_name - - Time time_val; - if (headers->GetLastModifiedValue(&time_val)) - response->setLastModifiedDate(time_val.ToDoubleT()); - - // Build up the header map. - void* iter = NULL; - std::string name; - while (headers->EnumerateHeaderLines(&iter, &name, &value)) { - response->addHTTPHeaderField(WebString::fromLatin1(name), - WebString::fromLatin1(value)); - } -} - net::RequestPriority ConvertWebKitPriorityToNetPriority( const WebURLRequest::Priority& priority) { switch (priority) { @@ -804,6 +695,114 @@ WebURLError WebURLLoaderImpl::CreateError(const WebURL& unreachable_url, return error; } +void WebURLLoaderImpl::PopulateURLResponse(const GURL& url, + const ResourceResponseInfo& info, + WebURLResponse* response) { + response->setURL(url); + response->setResponseTime(info.response_time.ToDoubleT()); + response->setMIMEType(WebString::fromUTF8(info.mime_type)); + response->setTextEncodingName(WebString::fromUTF8(info.charset)); + response->setExpectedContentLength(info.content_length); + response->setSecurityInfo(info.security_info); + response->setAppCacheID(info.appcache_id); + response->setAppCacheManifestURL(info.appcache_manifest_url); + response->setWasCached(!info.load_timing.request_start_time.is_null() && + info.response_time < info.load_timing.request_start_time); + response->setRemoteIPAddress( + WebString::fromUTF8(info.socket_address.host())); + response->setRemotePort(info.socket_address.port()); + response->setConnectionID(info.load_timing.socket_log_id); + response->setConnectionReused(info.load_timing.socket_reused); + response->setDownloadFilePath(info.download_file_path.AsUTF16Unsafe()); + WebURLResponseExtraDataImpl* extra_data = + new WebURLResponseExtraDataImpl(info.npn_negotiated_protocol); + response->setExtraData(extra_data); + extra_data->set_was_fetched_via_spdy(info.was_fetched_via_spdy); + extra_data->set_was_npn_negotiated(info.was_npn_negotiated); + extra_data->set_was_alternate_protocol_available( + info.was_alternate_protocol_available); + extra_data->set_connection_info(info.connection_info); + extra_data->set_was_fetched_via_proxy(info.was_fetched_via_proxy); + + // If there's no received headers end time, don't set load timing. This is + // the case for non-HTTP requests, requests that don't go over the wire, and + // certain error cases. + if (!info.load_timing.receive_headers_end.is_null()) { + WebURLLoadTiming timing; + PopulateURLLoadTiming(info.load_timing, &timing); + response->setLoadTiming(timing); + } + + if (info.devtools_info.get()) { + WebHTTPLoadInfo load_info; + + load_info.setHTTPStatusCode(info.devtools_info->http_status_code); + load_info.setHTTPStatusText(WebString::fromLatin1( + info.devtools_info->http_status_text)); + load_info.setEncodedDataLength(info.encoded_data_length); + + load_info.setRequestHeadersText(WebString::fromLatin1( + info.devtools_info->request_headers_text)); + load_info.setResponseHeadersText(WebString::fromLatin1( + info.devtools_info->response_headers_text)); + const HeadersVector& request_headers = info.devtools_info->request_headers; + for (HeadersVector::const_iterator it = request_headers.begin(); + it != request_headers.end(); ++it) { + load_info.addRequestHeader(WebString::fromLatin1(it->first), + WebString::fromLatin1(it->second)); + } + const HeadersVector& response_headers = + info.devtools_info->response_headers; + for (HeadersVector::const_iterator it = response_headers.begin(); + it != response_headers.end(); ++it) { + load_info.addResponseHeader(WebString::fromLatin1(it->first), + WebString::fromLatin1(it->second)); + } + response->setHTTPLoadInfo(load_info); + } + + const net::HttpResponseHeaders* headers = info.headers.get(); + if (!headers) + return; + + WebURLResponse::HTTPVersion version = WebURLResponse::Unknown; + if (headers->GetHttpVersion() == net::HttpVersion(0, 9)) + version = WebURLResponse::HTTP_0_9; + else if (headers->GetHttpVersion() == net::HttpVersion(1, 0)) + version = WebURLResponse::HTTP_1_0; + else if (headers->GetHttpVersion() == net::HttpVersion(1, 1)) + version = WebURLResponse::HTTP_1_1; + response->setHTTPVersion(version); + response->setHTTPStatusCode(headers->response_code()); + response->setHTTPStatusText(WebString::fromLatin1(headers->GetStatusText())); + + // TODO(darin): We should leverage HttpResponseHeaders for this, and this + // should be using the same code as ResourceDispatcherHost. + // TODO(jungshik): Figure out the actual value of the referrer charset and + // pass it to GetSuggestedFilename. + std::string value; + headers->EnumerateHeader(NULL, "content-disposition", &value); + response->setSuggestedFileName( + net::GetSuggestedFilename(url, + value, + std::string(), // referrer_charset + std::string(), // suggested_name + std::string(), // mime_type + std::string())); // default_name + + Time time_val; + if (headers->GetLastModifiedValue(&time_val)) + response->setLastModifiedDate(time_val.ToDoubleT()); + + // Build up the header map. + void* iter = NULL; + std::string name; + while (headers->EnumerateHeaderLines(&iter, &name, &value)) { + response->addHTTPHeaderField(WebString::fromLatin1(name), + WebString::fromLatin1(value)); + } +} + void WebURLLoaderImpl::loadSynchronously(const WebURLRequest& request, WebURLResponse& response, WebURLError& error, diff --git a/webkit/child/weburlloader_impl.h b/webkit/child/weburlloader_impl.h index 1412b32..833d83a 100644 --- a/webkit/child/weburlloader_impl.h +++ b/webkit/child/weburlloader_impl.h @@ -7,10 +7,12 @@ #include "base/memory/ref_counted.h" #include "third_party/WebKit/public/platform/WebURLLoader.h" +#include "webkit/child/webkit_child_export.h" namespace webkit_glue { class WebKitPlatformSupportImpl; +struct ResourceResponseInfo; class WebURLLoaderImpl : public WebKit::WebURLLoader { public: @@ -19,6 +21,10 @@ class WebURLLoaderImpl : public WebKit::WebURLLoader { static WebKit::WebURLError CreateError(const WebKit::WebURL& unreachable_url, int reason); + WEBKIT_CHILD_EXPORT static void PopulateURLResponse( + const GURL& url, + const ResourceResponseInfo& info, + WebKit::WebURLResponse* response); // WebURLLoader methods: virtual void loadSynchronously( |