playframework akka-http-server : warning Illegal header issue

Programming 2017. 7. 19. 18:16

play 2.5->2.6으로 업그래이드 도중 만나게된 이슈 정리.

Playframework 2.6 부터는 akka-http-server를 기본 back-end 서버로 사용하도록 셋팅되어있다.

 [warn] a.a.ActorSystemImpl - Illegal header: Illegal 'accept-language' header: Invalid input '_', expected weight, OWS, 'EOI', listSep, ALPHA or '-' (line 1, column 3): zh_CN


만약 이러한 워닝을 만나게 된다면.

이유 : 규약에 위배 되는 사항들은 warn level로 경고를 날리게 되어있음.

그중 하나가 header에는 언더바(_) 문자가 들어갈 수 없다는 규약에 걸렸기 때문.

해결책 :

가장 좋은 방법은 잘못된 헤더를 안받으면 되는데, 웹서버를 nginx를 쓴다면 기본적으로 nginx가 잘못된 헤더를 걸러버리기 때문에 만나기 힘든 이슈.

그러나 나는 nginx의 header filter옵션을 꺼뒀기에 akka-http-server에서 만나게 됨.

위 warning을 끄는 방법은 

reference.conf 파일에 보면

# Enables/disables the logging of warning messages in case an incoming
# message (request or response) contains an HTTP header which cannot be
# parsed into its high-level model class due to incompatible syntax.
# Note that, independently of this settings, akka-http will accept messages
# with such headers as long as the message as a whole would still be legal
# under the HTTP specification even without this header.
# If a header cannot be parsed into a high-level model instance it will be
# provided as a `RawHeader`.
# If logging is enabled it is performed with the configured
# `error-logging-verbosity`. illegal-header-warnings = on

요런 설정이 있음.

위 설정을 off 시키면 됨.

이걸 playframework의 application.conf에 적용하면..

akka.http.parsing.illegal-header-warnings = off

sbt run으로 그냥 띄우면 적용되지 않음.

Dev 모드에서는 적용하지 않는다고 되어있음.

참고 :

Note: In dev mode, when you use the run command, your application.confsettings will not be picked up by the server. This is because in dev mode the server starts before the application classpath is available. There are several other optionsyou’ll need to use instead.