in shell/browser/net/electron_url_loader_factory.cc [95:151]
network::mojom::URLResponseHeadPtr ToResponseHead(
const gin_helper::Dictionary& dict) {
auto head = network::mojom::URLResponseHead::New();
head->mime_type = "text/html";
head->charset = "utf-8";
if (dict.IsEmpty()) {
head->headers =
base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK");
return head;
}
int status_code = net::HTTP_OK;
dict.Get("statusCode", &status_code);
head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(
base::StringPrintf("HTTP/1.1 %d %s", status_code,
net::GetHttpReasonPhrase(
static_cast<net::HttpStatusCode>(status_code))));
dict.Get("charset", &head->charset);
bool has_mime_type = dict.Get("mimeType", &head->mime_type);
bool has_content_type = false;
base::DictionaryValue headers;
if (dict.Get("headers", &headers)) {
for (const auto iter : headers.DictItems()) {
if (iter.second.is_string()) {
// key, value
head->headers->AddHeader(iter.first, iter.second.GetString());
} else if (iter.second.is_list()) {
// key: [values...]
for (const auto& item : iter.second.GetList()) {
if (item.is_string())
head->headers->AddHeader(iter.first, item.GetString());
}
} else {
continue;
}
auto header_name_lowercase = base::ToLowerASCII(iter.first);
if (header_name_lowercase == "content-type") {
// Some apps are passing content-type via headers, which is not accepted
// in NetworkService.
head->headers->GetMimeTypeAndCharset(&head->mime_type, &head->charset);
has_content_type = true;
} else if (header_name_lowercase == "content-length" &&
iter.second.is_string()) {
base::StringToInt64(iter.second.GetString(), &head->content_length);
}
}
}
// Setting |head->mime_type| does not automatically set the "content-type"
// header in NetworkService.
if (has_mime_type && !has_content_type)
head->headers->AddHeader("content-type", head->mime_type);
return head;
}