如何在 Firefox Web Extension 中正确覆盖 Content-Type header?
How to properly override Content-Type header in Firefox Web Extension?
假设来自服务器的 HTML 个文件有这些 headers:
Content-Type: application/octet-stream
Content-Disposition: attachment;
我想更改 Web 扩展中的 headers(以便 HTML 文件显示为常规网页):
Content-Type: text/html; charset=utf-8
(Removed Content-Disposition)
在GoogleChrome中,网页扩展成功更改headers,HTML文件显示为正常网页。在 Firefox (48) 中,虽然 headers 已更改,但系统提示我下载 HTML 文件。我做错了什么还是这是一个已知错误?
请求示例:localhost:8000/test.html
下面的代码。
Web 扩展 - manifest.json:
{
"description": "Change content type",
"manifest_version": 2,
"name": "change-content-type",
"version": "1.0",
"permissions": [
"webRequest", "webRequestBlocking", "http://localhost/*"
],
"background": {
"scripts": ["background.js"]
}
}
Web 扩展 - Background.js 如下所示:
function setHeader(headers, name, value) {
for (var header of headers) {
if (header.name.toLowerCase() == name.toLowerCase()) {
header.value = value;
return;
}
}
headers.push({ name : name, value : value });
}
function removeHeader(headers, name) {
for (var i = 0; i < headers.length; i++) {
if (headers[i].name.toLowerCase() == name.toLowerCase()) {
headers.splice(i, 1);
return;
}
}
}
function changeResponseHeaders(details) {
removeHeader(details.responseHeaders, "Content-Disposition");
setHeader(details.responseHeaders, "Content-Type", "text/html; charset=utf-8");
return {
responseHeaders: details.responseHeaders
};
}
chrome.webRequest.onHeadersReceived.addListener(
changeResponseHeaders, {
urls: ["http://localhost/*"],
types: ["main_frame", "sub_frame"]
}, ["blocking", "responseHeaders"]
)
一个微型 网络服务器(作为示例):
import SimpleHTTPServer
class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def guess_type(self, path):
return 'application/octet-stream';
def end_headers(self):
self.send_my_headers()
SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header("Content-Disposition", "attachment;")
if __name__ == '__main__':
SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)
和示例 HTML 文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<div>Test</div>
</body>
</html>
假设来自服务器的 HTML 个文件有这些 headers:
Content-Type: application/octet-stream
Content-Disposition: attachment;
我想更改 Web 扩展中的 headers(以便 HTML 文件显示为常规网页):
Content-Type: text/html; charset=utf-8
(Removed Content-Disposition)
在GoogleChrome中,网页扩展成功更改headers,HTML文件显示为正常网页。在 Firefox (48) 中,虽然 headers 已更改,但系统提示我下载 HTML 文件。我做错了什么还是这是一个已知错误?
请求示例:localhost:8000/test.html
下面的代码。
Web 扩展 - manifest.json:
{
"description": "Change content type",
"manifest_version": 2,
"name": "change-content-type",
"version": "1.0",
"permissions": [
"webRequest", "webRequestBlocking", "http://localhost/*"
],
"background": {
"scripts": ["background.js"]
}
}
Web 扩展 - Background.js 如下所示:
function setHeader(headers, name, value) {
for (var header of headers) {
if (header.name.toLowerCase() == name.toLowerCase()) {
header.value = value;
return;
}
}
headers.push({ name : name, value : value });
}
function removeHeader(headers, name) {
for (var i = 0; i < headers.length; i++) {
if (headers[i].name.toLowerCase() == name.toLowerCase()) {
headers.splice(i, 1);
return;
}
}
}
function changeResponseHeaders(details) {
removeHeader(details.responseHeaders, "Content-Disposition");
setHeader(details.responseHeaders, "Content-Type", "text/html; charset=utf-8");
return {
responseHeaders: details.responseHeaders
};
}
chrome.webRequest.onHeadersReceived.addListener(
changeResponseHeaders, {
urls: ["http://localhost/*"],
types: ["main_frame", "sub_frame"]
}, ["blocking", "responseHeaders"]
)
一个微型 网络服务器(作为示例):
import SimpleHTTPServer
class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def guess_type(self, path):
return 'application/octet-stream';
def end_headers(self):
self.send_my_headers()
SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header("Content-Disposition", "attachment;")
if __name__ == '__main__':
SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)
和示例 HTML 文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<div>Test</div>
</body>
</html>