From cc92d0e3166e7aab668919582a8ad639789e13d8 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Sun, 14 May 2023 18:47:19 +0000 Subject: [PATCH] Simplify magic bytes lookup slightly. git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4296 ed5197a5-7fde-0310-b194-c3ffbd925b24 --- core/core.js | 69 ++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/core/core.js b/core/core.js index a776298e..08d6ee54 100644 --- a/core/core.js +++ b/core/core.js @@ -7,6 +7,29 @@ let gProcessIndex = 0; let gProcesses = {}; let gStatsTimer = false; +const k_mime_types = { + 'json': 'text/json', + 'js': 'text/javascript', + 'html': 'text/html', + 'css': 'text/css', + 'map': 'application/json', +}; + +const k_magic_bytes = [ + {bytes: [0xff, 0xd8, 0xff, 0xdb], type: 'image/jpeg'}, + {bytes: [0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01], type: 'image/jpeg'}, + {bytes: [0xff, 0xd8, 0xff, 0xee], type: 'image/jpeg'}, + {bytes: [0xff, 0xd8, 0xff, 0xe1, null, null, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00], type: 'image/jpeg'}, + {bytes: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], type: 'image/png'}, + {bytes: [0x47, 0x49, 0x46, 0x38, 0x37, 0x61], type: 'image/gif'}, + {bytes: [0x47, 0x49, 0x46, 0x38, 0x39, 0x61], type: 'image/gif'}, + {bytes: [0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x57, 0x45, 0x42, 0x50], type: 'image/webp'}, + {bytes: [0x3c, 0x73, 0x76, 0x67], type: 'image/svg+xml'}, + {bytes: [null, null, null, null, 0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34, 0x32], type: 'audio/mpeg'}, + {bytes: [null, null, null, null, 0x66, 0x74, 0x79, 0x70, 0x69, 0x73, 0x6f, 0x6d], type: 'video/mp4'}, + {bytes: [null, null, null, null, 0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34, 0x32], type: 'video/mp4'}, +]; + const k_global_settings = { index: { type: 'string', @@ -488,14 +511,6 @@ async function staticFileHandler(request, response, blobId, uri) { response.end("File not found"); } -const k_mime_types = { - 'json': 'text/json', - 'js': 'text/javascript', - 'html': 'text/html', - 'css': 'text/css', - 'map': 'application/json', -}; - async function staticDirectoryHandler(request, response, directory, uri) { let filename = uri || 'index.html'; if (filename.indexOf('..') != -1) { @@ -539,36 +554,16 @@ async function wellKnownHandler(request, response, path) { function sendData(response, data, type, headers) { if (data) { - if (startsWithBytes(data, [0xff, 0xd8, 0xff, 0xdb]) || - startsWithBytes(data, [0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01]) || - startsWithBytes(data, [0xff, 0xd8, 0xff, 0xee]) || - startsWithBytes(data, [0xff, 0xd8, 0xff, 0xe1, null, null, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00])) { - response.writeHead(200, Object.assign({"Content-Type": "image/jpeg", "Content-Length": data.byteLength}, headers || {})); - response.end(data); - } else if (startsWithBytes(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) { - response.writeHead(200, Object.assign({"Content-Type": "image/png", "Content-Length": data.byteLength}, headers || {})); - response.end(data); - } else if (startsWithBytes(data, [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]) || - startsWithBytes(data, [0x47, 0x49, 0x46, 0x38, 0x39, 0x61])) { - response.writeHead(200, Object.assign({"Content-Type": "image/gif", "Content-Length": data.byteLength}, headers || {})); - response.end(data); - } else if (startsWithBytes(data, [0x52, 0x49, 0x46, 0x46, null, null, null, null, 0x57, 0x45, 0x42, 0x50])) { - response.writeHead(200, Object.assign({"Content-Type": "image/webp", "Content-Length": data.byteLength}, headers || {})); - response.end(data); - } else if (startsWithBytes(data, [0x3c, 0x73, 0x76, 0x67])) { - response.writeHead(200, Object.assign({"Content-Type": "image/svg+xml", "Content-Length": data.byteLength}, headers || {})); - response.end(data); - } else if (startsWithBytes(data, [null, null, null, null, 0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34, 0x32])) { - response.writeHead(200, Object.assign({"Content-Type": "audio/mpeg", "Content-Length": data.byteLength}, headers || {})); - response.end(data); - } else if (startsWithBytes(data, [null, null, null, null, 0x66, 0x74, 0x79, 0x70, 0x69, 0x73, 0x6f, 0x6d]) || - startsWithBytes(data, [null, null, null, null, 0x66, 0x74, 0x79, 0x70, 0x6d, 0x70, 0x34, 0x32])) { - response.writeHead(200, Object.assign({"Content-Type": "video/mp4", "Content-Length": data.byteLength}, headers || {})); - response.end(data); - } else { - response.writeHead(200, Object.assign({"Content-Type": type || "application/binary", "Content-Length": data.byteLength}, headers || {})); - response.end(data); + for (let magic of k_magic_bytes) { + if (startsWithBytes(data, magic.bytes)) { + response.writeHead(200, Object.assign({"Content-Type": magic.content_type, "Content-Length": data.byteLength}, headers || {})); + response.end(data); + return; + } } + + response.writeHead(200, Object.assign({"Content-Type": type || "application/binary", "Content-Length": data.byteLength}, headers || {})); + response.end(data); } else { response.writeHead(404, Object.assign({"Content-Type": "text/plain; charset=utf-8", "Content-Length": "File not found".length}, headers || {})); response.end("File not found");