diff options
| author | Pinapelz <yukais@pinapelz.com> | 2026-10-19 15:32:53 -0700 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2026-10-19 15:32:53 -0700 |
| commit | 304bd1e77a5442f614aacd2b35f330777118b2cd (patch) | |
| tree | 970e7da13bb1bd8edf1f9b453af4d0994c665e94 /src/server/HttpServer.hx | |
| parent | a4f3064542ddad6939598e7e60ca0090be07df60 (diff) | |
Diffstat (limited to 'src/server/HttpServer.hx')
| -rw-r--r-- | src/server/HttpServer.hx | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/server/HttpServer.hx b/src/server/HttpServer.hx index bcbf9aa..7bd42f4 100644 --- a/src/server/HttpServer.hx +++ b/src/server/HttpServer.hx @@ -22,6 +22,7 @@ private class HttpServerConfig { public final dir:String; public final customDir:String = null; public final allowLocalRequests = false; + public final enableCORS = false; public final cache:Cache = null; } @@ -68,6 +69,7 @@ class HttpServer { final hasCustomRes = false; final allowedLocalFiles:Map<String, Bool> = []; final allowLocalRequests = false; + final enableCORS = false; final cache:Cache = null; final CHUNK_SIZE = 1024 * 1024 * 5; // 5 MB // temp media data while file is uploading to allow instant streaming @@ -79,6 +81,7 @@ class HttpServer { dir = config.dir; customDir = config.customDir; allowLocalRequests = config.allowLocalRequests; + enableCORS = config.enableCORS; cache = config.cache; if (customDir != null) hasCustomRes = FileSystem.exists(customDir); @@ -93,6 +96,18 @@ class HttpServer { var filePath = getPath(dir, url); final ext = Path.extension(filePath).toLowerCase(); + if (enableCORS) { + res.setHeader("access-control-allow-origin", "*"); + res.setHeader("access-control-allow-headers", "content-type, range, content-name, x-client-uuid"); + res.setHeader("access-control-expose-headers", "accept-ranges, content-encoding, content-length, content-range"); + if (req.method == "OPTIONS") { + res.setHeader("access-control-allow-methods", "GET, HEAD, POST, OPTIONS"); + res.statusCode = 204; + res.end(); + return; + } + } + res.setHeader("accept-ranges", "bytes"); res.setHeader("content-type", getMimeType(ext)); @@ -255,7 +270,6 @@ class HttpServer { info: cache.notEnoughSpaceErrorText, errorId: "freeSpace", }); - cache.remove(name); req.destroy(); final client = main.clients.getByName(name) ?? return; main.serverMessage(client, cache.notEnoughSpaceErrorText); @@ -453,10 +467,16 @@ class HttpServer { } function parseRangeHeader(rangeHeader:String, videoSize:Int):{start:Int, end:Int} { - final ranges = ~/[-=]/g.split(rangeHeader); + final ranges = ~/[=-]/g.split(rangeHeader); var start = Std.parseInt(ranges[1]); - if (Utils.isOutOfRange(start, 0, videoSize - 1)) start = 0; var end = Std.parseInt(ranges[2]); + // handle file end requests like `bytes=-500`: ["bytes","","500"] + if (start == null) { + final suffix = end ?? 0; + start = (videoSize - suffix).limitMin(0); + end = videoSize - 1; + } + if (Utils.isOutOfRange(start, 0, videoSize - 1)) start = 0; if (end == null) end = start + CHUNK_SIZE; if (Utils.isOutOfRange(end, start, videoSize - 1)) end = (videoSize - 1).limitMin(0); return { |
