diff options
| author | RblSb <msrblsb@gmail.com> | 2021-02-10 05:02:36 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2021-02-10 05:02:36 +0300 |
| commit | 71d2415a7992c7142200656857ecee3512b238a4 (patch) | |
| tree | 86ad20e7ecfe2e260da3df29e217de9ea5b06b00 /build | |
| parent | 2bb127e1cd582d9151ef1b70c3496bc79776a95a (diff) | |
Support partial content streams
Diffstat (limited to 'build')
| -rw-r--r-- | build/server.js | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/build/server.js b/build/server.js index 63ed3f4..5555428 100644 --- a/build/server.js +++ b/build/server.js @@ -3482,9 +3482,15 @@ server_HttpServer.serveFiles = function(req,res) { url = "/index.html"; } var filePath = server_HttpServer.dir + url; + var ext = haxe_io_Path.extension(filePath).toLowerCase(); + res.setHeader("Accept-Ranges","bytes"); + res.setHeader("Content-Type",server_HttpServer.getMimeType(ext)); if(server_HttpServer.allowLocalRequests && req.connection.remoteAddress == req.connection.localAddress || server_HttpServer.allowedLocalFiles.h[url]) { - if(server_HttpServer.serveLocalFile(res,url)) { - return; + if(server_HttpServer.isMediaExtension(ext)) { + server_HttpServer.allowedLocalFiles.h[url] = true; + if(server_HttpServer.serveMedia(req,res,url)) { + return; + } } } if(!server_HttpServer.isChildOf(server_HttpServer.dir,filePath)) { @@ -3508,13 +3514,16 @@ server_HttpServer.serveFiles = function(req,res) { } } } + if(server_HttpServer.isMediaExtension(ext)) { + if(server_HttpServer.serveMedia(req,res,filePath)) { + return; + } + } js_node_Fs.readFile(filePath,function(err,data) { if(err != null) { server_HttpServer.readFileError(err,res,filePath); return; } - var ext = haxe_io_Path.extension(filePath).toLowerCase(); - res.setHeader("Content-Type",server_HttpServer.getMimeType(ext)); if(ext == "html") { data = server_HttpServer.localizeHtml(data.toString(),req.headers["accept-language"]); } @@ -3530,25 +3539,31 @@ server_HttpServer.readFileError = function(err,res,filePath) { res.end("Error getting the file: " + Std.string(err) + "."); } }; -server_HttpServer.serveLocalFile = function(res,filePath) { - var ext = haxe_io_Path.extension(filePath).toLowerCase(); - if(ext != "mp4" && ext != "mp3" && ext != "wav") { +server_HttpServer.serveMedia = function(req,res,filePath) { + var range = req.headers["range"]; + if(range == null) { return false; } if(!js_node_Fs.existsSync(filePath)) { return false; } - server_HttpServer.allowedLocalFiles.h[filePath] = true; - js_node_Fs.readFile(filePath,function(err,data) { - if(err != null) { - server_HttpServer.readFileError(err,res,filePath); - return; - } - res.setHeader("Content-Type",server_HttpServer.getMimeType(ext)); - res.end(data); - }); + var videoSize = js_node_Fs.statSync(filePath).size; + var _this_r = new RegExp("[^0-9]","g".split("u").join("")); + var start = Std.parseInt(range.replace(_this_r,"")); + var end = Math.min(start + 5242880,videoSize - 1) | 0; + res.setHeader("Content-Range","bytes " + start + "-" + end + "/" + videoSize); + res.setHeader("Content-Length","" + (end - start + 1)); + res.statusCode = 206; + js_node_Fs.createReadStream(filePath,{ start : start, end : end}).pipe(res); return true; }; +server_HttpServer.isMediaExtension = function(ext) { + if(!(ext == "mp4" || ext == "mp3")) { + return ext == "wav"; + } else { + return true; + } +}; server_HttpServer.localizeHtml = function(data,lang) { if(lang != null && server_HttpServer.matchLang.match(lang)) { lang = server_HttpServer.matchLang.matched(0); |
