Compare commits

...

1 Commits

Author SHA1 Message Date
fcba2014c2 file server content type headers 2025-01-20 23:45:07 -07:00
4 changed files with 36 additions and 2 deletions

View File

@@ -73,6 +73,11 @@ router.serveDirectory('dirWithIndexHtml', '/indexes', {showIndex: true});
### File-based Routing ### File-based Routing
**Note:** _This is an experimental feature and may change in the future.
Currently, JSR does not support dynamic imports for external modules in Deno. In
order to use this feature, you will need to install as an HTTP module (available
soon)._
```ts ```ts
import { FileRouter } from "@bearmetal/router"; import { FileRouter } from "@bearmetal/router";

View File

@@ -1,7 +1,7 @@
{ {
"name": "@bearmetal/router", "name": "@bearmetal/router",
"description": "A simple router for Deno", "description": "A simple router for Deno",
"version": "0.2.3-b", "version": "0.2.4",
"stable": true, "stable": true,
"files": [ "files": [
"mod.ts", "mod.ts",

View File

@@ -6,6 +6,7 @@ import type {
RouteConfigurator, RouteConfigurator,
RouterContext, RouterContext,
} from "./types.ts"; } from "./types.ts";
import { getContentTypeByExtension } from "./util/contentType.ts";
import { NotFound } from "./util/response.ts"; import { NotFound } from "./util/response.ts";
/** /**
@@ -392,7 +393,9 @@ export class Router {
try { try {
const file = await Deno.readFile(normalizedPath); const file = await Deno.readFile(normalizedPath);
return new Response(file); const filetype = normalizedPath.split(".")[1];
const contentType = getContentTypeByExtension(filetype);
return new Response(file, { headers: { "Content-Type": contentType } });
} catch (e) { } catch (e) {
if (e instanceof Deno.errors.NotFound) { if (e instanceof Deno.errors.NotFound) {
return showIndex ? generateIndex(normalizedPath) : NotFound(); return showIndex ? generateIndex(normalizedPath) : NotFound();

26
util/contentType.ts Executable file
View File

@@ -0,0 +1,26 @@
export function getContentTypeByExtension(extension: string) {
switch (extension) {
case "html":
case "htm":
return "text/html";
case "css":
return "text/css";
case "js":
return "text/javascript";
case "json":
return "application/json";
case "png":
return "image/png";
case "jpg":
case "jpeg":
return "image/jpeg";
case "gif":
return "image/gif";
case "svg":
return "image/svg+xml";
case "txt":
return "text/plain";
default:
return "application/octet-stream";
}
}