perwendel / spark

A simple expressive web framework for java. Spark has a kotlin DSL https://github.com/perwendel/spark-kotlin
Apache License 2.0
9.64k stars 1.56k forks source link

org.eclipse.jetty.http.BadMessageException: 400: Unable to parse form content #1084

Closed termermc closed 5 years ago

termermc commented 5 years ago

Hello, I've been using Spark for quite some time, and in one of my projects I noticed that I was getting a 404 error when I sent certain characters (such as curly quotes) in form data, it would generate a 500 error. Upon further inspection, I found the following error in the console:

org.eclipse.jetty.http.BadMessageException: 400: Unable to parse form content
    at org.eclipse.jetty.server.Request.getParameters(Request.java:380)
    at org.eclipse.jetty.server.Request.getParameterMap(Request.java:1031)
    at javax.servlet.ServletRequestWrapper.getParameterMap(ServletRequestWrapper.java:203)
    at spark.QueryParamsMap.<init>(QueryParamsMap.java:62)
    at spark.Request.initQueryMap(Request.java:409)
    at spark.Request.queryMap(Request.java:394)
    at spark.http.matching.RequestWrapper.queryMap(RequestWrapper.java:226)
    at net.termer.textbin.Module$2.handle(Module.java:94)
    at net.termer.twister.Twister.handleRequest(Twister.java:249)
    at net.termer.twister.Twister.lambda$2(Twister.java:193)
    at spark.RouteImpl$1.handle(RouteImpl.java:72)
    at spark.http.matching.Routes.execute(Routes.java:61)
    at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:130)
    at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1568)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:530)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:347)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:256)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
    at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:289)
    at org.eclipse.jetty.io.ssl.SslConnection$3.succeeded(SslConnection.java:149)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:382)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte 94 in state 0
    at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:253)
    at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:158)
    at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:522)
    at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:572)
    at org.eclipse.jetty.server.Request.extractFormParameters(Request.java:529)
    at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:461)
    at org.eclipse.jetty.server.Request.getParameters(Request.java:376)
    ... 32 more

If there any way to avoid this, as it seems to be a Jetty related error?

toyg commented 5 years ago

You are likely not sending UTF-8, the fix is probably necessary on the client side - see https://stackoverflow.com/questions/54220389/how-to-solve-badmessageexception-400-unable-to-parse-form-content-issue-while

If you really have to accept non-utf-8 characters, you have to dig out how Jetty is supposed to do it; then you can customize Spark with something like this: https://github.com/toyg/spark-custom-jetty

perwendel commented 5 years ago

This seems to be a client side error.