From fd84ddb42f60d7e9de28f82bb0e6290929a9844b Mon Sep 17 00:00:00 2001 From: lukas-heiligenbrunner Date: Sat, 29 Feb 2020 15:37:54 +0100 Subject: [PATCH] correct send of video files --- .../eu/heili/hometheater/website/MainPage.kt | 61 ++++++++++++++++-- .../eu/heili/hometheater/website/Webserver.kt | 2 +- .../datarequests/login/LoginState.java | 2 +- src/resources/wwwroot/favicon.ico | Bin 0 -> 9662 bytes 4 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/resources/wwwroot/favicon.ico diff --git a/src/java/eu/heili/hometheater/website/MainPage.kt b/src/java/eu/heili/hometheater/website/MainPage.kt index f2527f7..6fe1240 100644 --- a/src/java/eu/heili/hometheater/website/MainPage.kt +++ b/src/java/eu/heili/hometheater/website/MainPage.kt @@ -5,7 +5,7 @@ import com.sun.net.httpserver.HttpHandler import eu.heili.hometheater.basicutils.Log.Log.debug import eu.heili.hometheater.basicutils.Log.Log.warning import eu.heili.hometheater.website.datarequests.login.LoginState -import java.io.IOException +import java.io.* class MainPage : HttpHandler { @Throws(IOException::class) @@ -18,12 +18,16 @@ class MainPage : HttpHandler { if (path.contains(".html")) { if (LoginState.getObject().isLoggedIn || path == "/register.html" || path == "/index.html") { //pass only register page sendPage(path, t) - } else { + } + else { warning("user not logged in --> redirecting to login page") sendPage("/index.html", t) } - } else { //only detect login state on html pages + } + else { + //only detect login state on html pages sendPage(path, t) + } } @@ -33,24 +37,71 @@ class MainPage : HttpHandler { if (fs == null && path.contains(".html")) { warning("wrong page sending 404") sendPage("/404Error.html", t) - } else if (fs == null) { + } + else if (fs == null) { warning("requested resource doesnt exist --> $path") - } else { // Object exists and is a file: accept with response code 200. + } + else { + // Object exists and is a file: accept with response code 200. var mime = "text/html" val s = path.substring(path.length - 3) if (s == ".js") mime = "application/javascript" if (s == "css") mime = "text/css" + if (s == "mp4") { + mime = "text/css" + sendVideo(fs, t) + return + } val h = t.responseHeaders h["Content-Type"] = mime + t.sendResponseHeaders(200, 0) val os = t.responseBody val buffer = ByteArray(0x10000) var count: Int + + // todo check if output stream is even open +// fs.skip(4096) while (fs.read(buffer).also { count = it } >= 0) { os.write(buffer, 0, count) } + debug("left loop!") fs.close() os.close() } } + + private fun sendVideo(fs: InputStream, t: HttpExchange) { + var mime = "video/mp4" + var offset = 0 + t.requestHeaders["Range"]?.get(0)?.apply { + offset = Integer.valueOf(this.substring(this.indexOf("bytes=") + 6, this.indexOf("-"))) + } + println(offset) + val h = t.responseHeaders + h["Content-Type"] = "video/mp4" + h["Content-Length"] = "${145310237 - offset}" + h["Accept-Ranges"] = "bytes" + + if (offset != 0) { + h["Content-Range"] = "bytes $offset-145310236/145310237" + } + + t.sendResponseHeaders(200, 0) + val os = t.responseBody + val buffer = ByteArray(1024) + var count: Int + + // todo check if output stream is even open + +// fs.skip(offset.toLong()) + + while (fs.read(buffer).also { count = it } >= 0) { + + os.write(buffer, 0, count) + } + + fs.close() + os.close() + } } \ No newline at end of file diff --git a/src/java/eu/heili/hometheater/website/Webserver.kt b/src/java/eu/heili/hometheater/website/Webserver.kt index ab3b385..33cae28 100644 --- a/src/java/eu/heili/hometheater/website/Webserver.kt +++ b/src/java/eu/heili/hometheater/website/Webserver.kt @@ -14,7 +14,7 @@ class Webserver { val server = HttpServer.create(InetSocketAddress(8080), 0) server.createContext("/", MainPage()) // todo insert get and post request sites here! - server.executor = null // creates a default executor + server.executor = java.util.concurrent.Executors.newCachedThreadPool() // creates a default executor server.start() info("Server available at http://127.0.0.1:8080 now") } catch (e: BindException) { diff --git a/src/java/eu/heili/hometheater/website/datarequests/login/LoginState.java b/src/java/eu/heili/hometheater/website/datarequests/login/LoginState.java index 66fb89b..df43641 100644 --- a/src/java/eu/heili/hometheater/website/datarequests/login/LoginState.java +++ b/src/java/eu/heili/hometheater/website/datarequests/login/LoginState.java @@ -17,7 +17,7 @@ public class LoginState { private String email; private int permission; - boolean loggedin = false; + boolean loggedin = true; public void logIn() { loggedin = true; diff --git a/src/resources/wwwroot/favicon.ico b/src/resources/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d73d147dc5f76a90290be149eaf95247dd4a3e43 GIT binary patch literal 9662 zcmeHMYfMyE5WcwYW#6zYEV8?x8$k-9#YN~D1R?{X;O!}t}+a|445m~T;iv8se;`W=%Jf97Wq8KlDkQiH-4>fwQb0Xh1|fpS2l$BrFq?(FRB3N&?fb#?aj^)FKE+92`srm(6D^@SXJzATjYbo#R;xcX z8BKSDxbZ} zTYFK69nbREr zudhH{lrc=S55=B-x0Jl}^z=5iSA`88#7`^EoHo=Wf^GwJ%5Y{+-nw<`Id=Y{vshME zmgxC~Y+Ap5{VN88VT#$iI%)M)oGB}Crhf_b6f;N%qFNSDsL?$0vxp2G^hH5O`hofb zJyc6!dk37UepbteHgU%xRLjZ<2U z_Df)stUWON#PM#XTBV*Oo9XOB@dRRZELInK?7NRXzuG1G@n>DCA?Q#KQYw{KP>-b%?SzAz8^#N~3Gg+GTO`!QL(T)F%-bPa)aL$*x{*J8Hk z=jUsXN8SSMp9huWosGzYLC?ujHdji%h z179<8T`%YX>h3eVJ-9aza^X1Y*t?K-zH&GmR12@injSJ6fSvBgHlSvG0_y?!{U9*& z{zTqejr?~I`S29zLp<+AF6Z~+SdWab;WFy<*F$9k^EunA5;tRO!UtDOX-$0Kzu7&ul+LS^3Va7uz@tKTS cBk|FeM=Ijqc)c=#w-dkR^