Actual behavior (the bug)
I have a simple image handler:
fun getImage(ctx: Context) {
val id = ctx.pathParam("id")
val imageSize = ImageSize.valueOf(ctx.queryParam("size") ?: throw BadRequestResponse("`size` is required"))
val stream = imageService.openImageAsStream(id, imageSize)
ctx
.status(200)
.contentType("image/jpeg")
.result(stream)
}
On every request, Javalin tries to log the result and the following exception occurs:
java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(InputStream.java:348)
at io.javalin.core.util.LogUtil.requestDevLogger(LogUtil.kt:28)
at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:103)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:542)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1700)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
at io.javalin.core.JavalinServer$start$httpHandler$1.doHandle(JavalinServer.kt:47)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:61)
at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:174)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:505)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:132)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:786)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:743)
at java.lang.Thread.run(Thread.java:748)
Expected behavior
If the output cannot displayed as text, it could be replaced by a placeholder. For Example:
Request: GET [/image]
...
Response: [200], execution took 0.51 ms
Headers: {Connection=close, Server=Javalin, Date=Sat, 15 Jun 2019 08:13:29 GMT, Content-Type=image/jpeg}
Body: <binary>
To Reproduce
import io.javalin.Javalin
import java.io.File
fun main() {
Javalin.create {
it.enableDevLogging()
}.get("/") {
val stream = File("/path/to/an.jpeg").inputStream()
it.result(stream)
}.start()
}
Visit http://localhost:7000/ and the error occurs.
There should be something like this already for static files (don't remember how exactly it's set up). Could you submit a patch?
Yes, I can look into it later.
I fixed it in https://github.com/tipsy/javalin/pull/627