| Index: content/browser/webui/url_data_manager_backend.cc
|
| diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc
|
| index 182e9e7f118c7ec87d32e0f8a3c01b47a3795b67..8c21673c24271037aac4248c07569532afa3b694 100644
|
| --- a/content/browser/webui/url_data_manager_backend.cc
|
| +++ b/content/browser/webui/url_data_manager_backend.cc
|
| @@ -90,6 +90,19 @@ void URLToRequestPath(const GURL& url, std::string* path) {
|
| path->assign(spec.substr(offset));
|
| }
|
|
|
| +// Returns a value of 'Origin:' header for the |request| if the header is set.
|
| +// Otherwise returns an empty string.
|
| +std::string GetOriginHeaderValue(const net::URLRequest* request) {
|
| + std::string result;
|
| + if (request->extra_request_headers().GetHeader(
|
| + net::HttpRequestHeaders::kOrigin, &result))
|
| + return result;
|
| + net::HttpRequestHeaders headers;
|
| + if (request->GetFullRequestHeaders(&headers))
|
| + headers.GetHeader(net::HttpRequestHeaders::kOrigin, &result);
|
| + return result;
|
| +}
|
| +
|
| } // namespace
|
|
|
| // URLRequestChromeJob is a net::URLRequestJob that manages running
|
| @@ -152,6 +165,10 @@ class URLRequestChromeJob : public net::URLRequestJob,
|
| send_content_type_header_ = send_content_type_header;
|
| }
|
|
|
| + void set_access_control_allow_origin(const std::string& value) {
|
| + access_control_allow_origin_ = value;
|
| + }
|
| +
|
| // Returns true when job was generated from an incognito profile.
|
| bool is_incognito() const {
|
| return is_incognito_;
|
| @@ -202,6 +219,10 @@ class URLRequestChromeJob : public net::URLRequestJob,
|
| // If true, sets the "Content-Type: <mime-type>" header.
|
| bool send_content_type_header_;
|
|
|
| + // If not empty, "Access-Control-Allow-Origin:" is set to the value of this
|
| + // string.
|
| + std::string access_control_allow_origin_;
|
| +
|
| // True when job is generated from an incognito profile.
|
| const bool is_incognito_;
|
|
|
| @@ -293,6 +314,12 @@ void URLRequestChromeJob::GetResponseInfo(net::HttpResponseInfo* info) {
|
| mime_type_.c_str());
|
| info->headers->AddHeader(content_type);
|
| }
|
| +
|
| + if (!access_control_allow_origin_.empty()) {
|
| + info->headers->AddHeader("Access-Control-Allow-Origin: " +
|
| + access_control_allow_origin_);
|
| + info->headers->AddHeader("Vary: Origin");
|
| + }
|
| }
|
|
|
| void URLRequestChromeJob::MimeTypeAvailable(const std::string& mime_type) {
|
| @@ -578,6 +605,15 @@ bool URLDataManagerBackend::StartRequest(const net::URLRequest* request,
|
| job->set_send_content_type_header(
|
| source->source()->ShouldServeMimeTypeAsContentTypeHeader());
|
|
|
| + std::string origin = GetOriginHeaderValue(request);
|
| + if (!origin.empty()) {
|
| + std::string header =
|
| + source->source()->GetAccessControlAllowOriginForOrigin(origin);
|
| + DCHECK(header.empty() || header == origin || header == "*" ||
|
| + header == "null");
|
| + job->set_access_control_allow_origin(header);
|
| + }
|
| +
|
| // Look up additional request info to pass down.
|
| int render_process_id = -1;
|
| int render_frame_id = -1;
|
|
|