Index: mojo/services/network/url_loader_impl.cc |
diff --git a/mojo/services/network/url_loader_impl.cc b/mojo/services/network/url_loader_impl.cc |
index e2e88a1b43b1cd1ebbd77fa06747ddd5ec6175f0..f9590f148937fabff3989e952c9cfb6b442cf8c4 100644 |
--- a/mojo/services/network/url_loader_impl.cc |
+++ b/mojo/services/network/url_loader_impl.cc |
@@ -13,6 +13,7 @@ |
#include "net/base/elements_upload_data_stream.h" |
#include "net/base/io_buffer.h" |
#include "net/base/load_flags.h" |
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
#include "net/base/upload_bytes_element_reader.h" |
#include "net/http/http_response_headers.h" |
#include "net/url_request/redirect_info.h" |
@@ -21,10 +22,46 @@ |
namespace mojo { |
namespace { |
+GURL GetSiteForURL(const GURL& url) { |
+ // If the url has a host, then determine the site. |
+ if (url.has_host()) { |
+ // Only keep the scheme and registered domain as given by GetOrigin. This |
+ // may also include a port, which we need to drop. |
+ GURL site = url.GetOrigin(); |
+ |
+ // Remove port, if any. |
+ if (site.has_port()) { |
+ GURL::Replacements rep; |
+ rep.ClearPort(); |
+ site = site.ReplaceComponents(rep); |
+ } |
+ |
+ // If this URL has a registered domain, we only want to remember that part. |
+ std::string domain = net::registry_controlled_domains::GetDomainAndRegistry( |
+ url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); |
+ if (!domain.empty()) { |
+ GURL::Replacements rep; |
+ rep.SetHostStr(domain); |
+ site = site.ReplaceComponents(rep); |
+ } |
+ return site; |
+ } |
+ |
+ // If there is no host but there is a scheme, return the scheme. |
+ // This is useful for cases like file URLs. |
+ if (url.has_scheme()) |
+ return GURL(url.scheme() + ":"); |
+ |
+ // Otherwise the URL should be invalid; return an empty site. |
+ DCHECK(!url.is_valid()); |
+ return GURL(); |
+} |
+ |
// Generates an URLResponsePtr from the response state of a net::URLRequest. |
URLResponsePtr MakeURLResponse(const net::URLRequest* url_request) { |
URLResponsePtr response(URLResponse::New()); |
response->url = String::From(url_request->url()); |
+ response->site = GetSiteForURL(url_request->url()).spec(); |
const net::HttpResponseHeaders* headers = url_request->response_headers(); |
if (headers) { |