You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@pekko.apache.org by "michaelf-crwd (via GitHub)" <gi...@apache.org> on 2024/08/12 10:44:27 UTC

[I] Accept-Charset throws exception instead of defaulting on bad charset header values [pekko-http]

michaelf-crwd opened a new issue, #583:
URL: https://github.com/apache/pekko-http/issues/583

   Hi Pekko team,
   
   I'm having an odd issue with a simple http request to a pekko micro service. The `Accept-Charset` header value is deliberately set wrong (by a security scanning tool) and the result is Server Error 500 and a stack trace logged out server side. Expected behaviour was for pekko-http to do a default to e.g. UTF-8 charset and report back a server side error to the client, nor log out a stack trace.
   
   Minimal sample scala code processing the inbound request:
   
   ```
   import org.apache.pekko.actor.ActorSystem
   import org.apache.pekko.event.{Logging, LoggingAdapter}
   import org.apache.pekko.http.scaladsl.Http
   import org.apache.pekko.http.scaladsl.model.{ContentTypes, HttpEntity}
   import org.apache.pekko.http.scaladsl.server.Directives._
   import org.apache.pekko.http.scaladsl.server.Route
   import com.typesafe.config.Config
   import com.typesafe.config.ConfigFactory
   
   import scala.concurrent.ExecutionContext
   
   import scala.util.Using
   
   trait Service {
     implicit val system: ActorSystem
     implicit def executor: ExecutionContext
   
     def config: Config
     val logger: LoggingAdapter
     val routes: Route = {
       logRequestResult("pekko-http-microservice") {
         concat(
           // http://localhost:9000/hello
           path("hello") {
             get {
               complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Greetings from the pekko-http-microservice</h1>"))
             }
           }
         )
       }
     }
   }
   
   object ServerApp extends App with Service {
     override implicit val system: ActorSystem = ActorSystem()
     override implicit val executor: ExecutionContext = system.dispatcher
   
     override val config = ConfigFactory.load()
     override val logger = Logging(system, "pekkoHttpMicroservice")
   
     Http()
       .newServerAt(config.getString("http.interface"), config.getInt("http.port"))
       .bindFlow(routes)
   }
   ```
   
   Sample request:
   
   ```
   curl -v -H "Accept-Charset: wrong" http://localhost:9000/hello
   * Host localhost:9000 was resolved.
   * IPv6: ::1
   * IPv4: 127.0.0.1
   *   Trying [::1]:9000...
   * Connected to localhost (::1) port 9000
   > GET /hello HTTP/1.1
   > Host: localhost:9000
   > User-Agent: curl/8.6.0
   > Accept: */*
   > Accept-Charset: wrong
   >
   < HTTP/1.1 500 Internal Server Error
   < Server: pekko-http/1.0.1
   < Date: Mon, 12 Aug 2024 10:34:32 GMT
   < Content-Type: text/plain; charset=UTF-8
   < Content-Length: 35
   <
   * Connection #0 to host localhost left intact
   There was an internal server error.%
   ```
   
   Expected response:
   
   ```
   < HTTP/1.1 200 OK
   < Server: pekko-http/1.0.1
   < Date: Mon, 12 Aug 2024 10:35:10 GMT
   < Content-Type: text/html; charset=UTF-8
   < Content-Length: 51
   <
   * Connection #0 to host localhost left intact
   <h1>Greetings from the pekko-http-microservice</h1>%
   ```
   
   The following stack-trace is logged server-side:
   
   ```
   [ERROR] [08/12/2024 12:34:32.515] [default-pekko.actor.default-dispatcher-107] [org.apache.pekko.actor.ActorSystemImpl(default)] Error during processing of request: 'wrong'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler.
   java.nio.charset.UnsupportedCharsetException: wrong
   	at java.base/java.nio.charset.Charset.forName(Charset.java:559)
   	at org.apache.pekko.http.scaladsl.model.HttpCharset$.$anonfun$findNioCharset$1(HttpCharset.scala:88)
   	at scala.util.Try$.apply(Try.scala:217)
   	at org.apache.pekko.http.scaladsl.model.HttpCharset$.findNioCharset(HttpCharset.scala:88)
   	at org.apache.pekko.http.scaladsl.model.HttpCharset.<init>(HttpCharset.scala:64)
   	at org.apache.pekko.http.scaladsl.model.HttpCharset$.apply(HttpCharset.scala:62)
   	at org.apache.pekko.http.scaladsl.model.HttpCharset$.custom(HttpCharset.scala:86)
   	at org.apache.pekko.http.impl.model.parser.CommonActions.$anonfun$getCharset$1(CommonActions.scala:71)
   	at scala.Option.getOrElse(Option.scala:201)
   	at org.apache.pekko.http.impl.model.parser.CommonActions.getCharset(CommonActions.scala:71)
   	at org.apache.pekko.http.impl.model.parser.CommonActions.getCharset$(CommonActions.scala:68)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser.getCharset(HeaderParser.scala:37)
   	at org.apache.pekko.http.impl.model.parser.AcceptCharsetHeader.charset$minusrange$minusdef(AcceptCharsetHeader.scala:38)
   	at org.apache.pekko.http.impl.model.parser.AcceptCharsetHeader.charset$minusrange$minusdef$(AcceptCharsetHeader.scala:37)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser.charset$minusrange$minusdef(HeaderParser.scala:37)
   	at org.apache.pekko.http.impl.model.parser.AcceptCharsetHeader.charset$minusrange$minusdecl(AcceptCharsetHeader.scala:29)
   	at org.apache.pekko.http.impl.model.parser.AcceptCharsetHeader.charset$minusrange$minusdecl$(AcceptCharsetHeader.scala:28)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser.charset$minusrange$minusdecl(HeaderParser.scala:37)
   	at org.apache.pekko.http.impl.model.parser.AcceptCharsetHeader.rec$2(AcceptCharsetHeader.scala:25)
   	at org.apache.pekko.http.impl.model.parser.AcceptCharsetHeader.accept$minuscharset(AcceptCharsetHeader.scala:24)
   	at org.apache.pekko.http.impl.model.parser.AcceptCharsetHeader.accept$minuscharset$(AcceptCharsetHeader.scala:24)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser.accept$minuscharset(HeaderParser.scala:37)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser$$anon$1$$anon$60.$anonfun$apply$59(HeaderParser.scala:141)
   	at org.parboiled2.Parser.__run(Parser.scala:125)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser$$anon$1$$anon$60.apply(HeaderParser.scala:141)
   	at org.parboiled2.DynamicRuleDispatch.$anonfun$apply$1(DynamicRuleDispatch.scala:36)
   	at scala.Option.map(Option.scala:242)
   	at org.parboiled2.DynamicRuleDispatch.apply(DynamicRuleDispatch.scala:36)
   	at org.parboiled2.DynamicRuleDispatch.apply$(DynamicRuleDispatch.scala:35)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser$$anon$1.apply(HeaderParser.scala:141)
   	at org.apache.pekko.http.impl.model.parser.HeaderParser$.$anonfun$lookupParser$1(HeaderParser.scala:126)
   	at org.apache.pekko.http.impl.engine.parsing.HttpHeaderParser$ModeledHeaderValueParser.apply(HttpHeaderParser.scala:570)
   	at org.apache.pekko.http.impl.engine.parsing.HttpHeaderParser.startValueBranch$1(HttpHeaderParser.scala:125)
   	at org.apache.pekko.http.impl.engine.parsing.HttpHeaderParser.parseHeaderLine(HttpHeaderParser.scala:145)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.parseHeaderLines(HttpMessageParser.scala:158)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.parseHeaderLines$(HttpMessageParser.scala:148)
   	at org.apache.pekko.http.impl.engine.parsing.HttpRequestParser$$anon$1.parseHeaderLines(HttpRequestParser.scala:59)
   	at org.apache.pekko.http.impl.engine.parsing.HttpRequestParser$$anon$1.parseMessage(HttpRequestParser.scala:94)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.startNewMessage(HttpMessageParser.scala:124)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.startNewMessage$(HttpMessageParser.scala:122)
   	at org.apache.pekko.http.impl.engine.parsing.HttpRequestParser$$anon$1.startNewMessage(HttpRequestParser.scala:59)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.$anonfun$state$1(HttpMessageParser.scala:49)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.run$1(HttpMessageParser.scala:82)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.parseBytes(HttpMessageParser.scala:96)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.parseBytes$(HttpMessageParser.scala:80)
   	at org.apache.pekko.http.impl.engine.parsing.HttpRequestParser$$anon$1.parseBytes(HttpRequestParser.scala:59)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.parseSessionBytes(HttpMessageParser.scala:78)
   	at org.apache.pekko.http.impl.engine.parsing.HttpMessageParser.parseSessionBytes$(HttpMessageParser.scala:73)
   	at org.apache.pekko.http.impl.engine.parsing.HttpRequestParser$$anon$1.parseSessionBytes(HttpRequestParser.scala:59)
   	at org.apache.pekko.http.impl.engine.parsing.HttpRequestParser$$anon$1.onPush(HttpRequestParser.scala:71)
   	at org.apache.pekko.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:555)
   	at org.apache.pekko.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:433)
   	at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:662)
   	at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:532)
   	at org.apache.pekko.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:637)
   	at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter.org$apache$pekko$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:813)
   	at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:831)
   	at org.apache.pekko.actor.Actor.aroundReceive(Actor.scala:547)
   	at org.apache.pekko.actor.Actor.aroundReceive$(Actor.scala:545)
   	at org.apache.pekko.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:729)
   	at org.apache.pekko.actor.ActorCell.receiveMessage(ActorCell.scala:590)
   	at org.apache.pekko.actor.ActorCell.invoke(ActorCell.scala:557)
   	at org.apache.pekko.dispatch.Mailbox.processMailbox(Mailbox.scala:280)
   	at org.apache.pekko.dispatch.Mailbox.run(Mailbox.scala:241)
   	at org.apache.pekko.dispatch.Mailbox.exec(Mailbox.scala:253)
   	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
   	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1491)
   	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:2073)
   	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2035)
   	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org
For additional commands, e-mail: notifications-help@pekko.apache.org


Re: [I] Accept-Charset throws exception instead of defaulting on bad charset header values [pekko-http]

Posted by "pjfanning (via GitHub)" <gi...@apache.org>.
pjfanning commented on issue #583:
URL: https://github.com/apache/pekko-http/issues/583#issuecomment-2283643431

   Thanks - but this looks like the existing issue https://github.com/apache/pekko-http/issues/300
   
   So I will close this in favour of that.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org
For additional commands, e-mail: notifications-help@pekko.apache.org


Re: [I] Accept-Charset throws exception instead of defaulting on bad charset header values [pekko-http]

Posted by "pjfanning (via GitHub)" <gi...@apache.org>.
pjfanning closed issue #583: Accept-Charset throws exception instead of defaulting on bad charset header values
URL: https://github.com/apache/pekko-http/issues/583


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@pekko.apache.org
For additional commands, e-mail: notifications-help@pekko.apache.org