如何正确重写 Firefox Web Extension 中的 Content-Type 标头?

6
假设来自服务器的HTML文件具有以下标题:
Content-Type: application/octet-stream
Content-Disposition: attachment;

我想修改一个网页扩展程序中的头部信息(这样HTML文件将会像普通网页一样显示):
Content-Type: text/html; charset=utf-8
(Removed Content-Disposition)

在Google Chrome中,该网页扩展成功更改了标题头,HTML文件显示为普通网页。在Firefox(48)中,虽然标题头已更改,但我被提示下载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"]
)

一个微型的Web服务器(以一个例子形式呈现):
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>

1
这里提交了一个错误报告。 - turdus-merula
1
我会很感激您能发布一个回答,提到这个bug - 特别是因为它已经在开发版本中修复,这样它就不会无人问津了。 - Xan
1个回答

4
这是一个漏洞,已经修复。修复计划在Mozilla Firefox 52中实现。
我对实现没有了解,因此无法提供更多细节。

1
似乎在版本51中已经修复,详见https://bugzilla.mozilla.org/show_bug.cgi?id=1304331#c13 - serv-inc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接