Установить тип MIME для извлеченного файла - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть статический файловый сервер (созданный с помощью vibe.d), обслуживающий веб-сайт, который использует модули ES6, но с расширением .mjs.

Мой браузер (Chromium в Arch Linux) выдает ошибку при получениифайлы модуля server responded with a non-JavaScript MIME type of "application/octet-stream".

Похоже, мне нужно установить файлы типа MIME с помощью .mjs из "application / octet-stream" в "application / javascript".Как мне это сделать?Я мог бы изменить все сценарии на .js, но это было бы, но я бы лучше выяснил, как исправить это правильно.

Как бы я изменил тип MIME для извлекаемого файла?Или, возможно, лучше, я могу изменить тип MIME по умолчанию для всех файлов .mjs?

Вот мой код d с vibe.d:

auto router = new URLRouter;
auto fileServerSettings = new HTTPFileServerSettings;
fileServerSettings.encodingFileExtension = ["gzip" : ".gz"];
router.get("/gzip/*", serveStaticFiles("./public/", fileServerSettings));
router.get("/ws", handleWebSockets(&handleWebSocketConnection));
router.get("*", serveStaticFiles("./public/",));

listenHTTP(settings, router);

1 Ответ

0 голосов
/ 28 сентября 2018

Необходимо изменить заголовок типа содержимого в ответе.

Vibe.d может иметь способ настройки значений по умолчанию, но вы всегда можете перехватить его, прежде чем отправит ответ для редактирования заголовка файлов.оканчивающийся на .mjs.

Вы можете сделать это в vibe.d примерно так:

auto router = new URLRouter;
auto fileServerSettings = new HTTPFileServerSettings;
fileServerSettings.encodingFileExtension = ["gzip" : ".gz"];
fileServerSettings.preWriteCallback = &handleMIME; // Add preWriteCallback to fileServerSettings
router.get("/gzip/*", serveStaticFiles("./public/", fileServerSettings));
router.get("/ws", handleWebSockets(&handleWebSocketConnection));
router.get("*", serveStaticFiles("./public/", fileServerSettings)); // Use fileServerSettings in this get too.

// preWriteCallback, will edit the header before vibe.d sends it.
void handleMIME(scope HTTPServerRequest req, scope HTTPServerResponse res, ref string physicalPath) {
    if (physicalPath.endsWith(".mjs")) {
        res.contentType = "application/javascript"; // vibe.d has an easy `.contentType` attribute so you do not have to deal with the header itself.
    }
}
...