Javalin: enableDevLogging() does not work on binary output

Created on 15 Jun 2019  路  3Comments  路  Source: tipsy/javalin

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.

BUG

All 3 comments

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.

Was this page helpful?
0 / 5 - 0 ratings