4

Пусть HTML-файлы, поступающие с сервера эти заголовки:Как правильно переопределить заголовок Content-Type в веб-расширении Firefox?

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. Я что-то делаю неправильно или это известная ошибка?

Пример запроса: локальный: 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> 
+1

Подано сообщение об ошибке [здесь] (https://bugzilla.mozilla.org/show_bug.cgi?id=1304331). –

+1

Буду признателен, если вы опубликуете ответ на этот вопрос, отметив ошибку - особенно, поскольку она уже исправлена ​​в dev-версии, так что она не остается без ответа. – Xan

ответ

2

Это был bug, и это было fixed. Исправление кажется запланированным для Mozilla Firefox 52.

У меня нет знаний об осуществлении, поэтому я не могу предоставить более подробную информацию.

+1

Это, похоже, исправлено в 51, см. Https://bugzilla.mozilla.org/show_bug.cgi?id=1304331#c13 –