WebSocket server doesn't properly handle protocol mistakes.
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 45/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- scala
- Ambito
- networking
Direzione di ricerca
Inizia da org.http4s.websocket.package.makeFrame in package.scala:26 e traccia come FrameTranscoder.bufferToFrame gestisce l’opcode prima dell’errore. Confronta il comportamento degli opcode riservati con la sezione 5.2 di RFC 6455; il lavoro è completo quando i frame WebSocket malformati fanno fallire la connessione senza esporre un MatchError e producono una gestione comprensibile.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Unfortunately, I don't know how exactly to reproduce this error.
The problem is that when I ran a local WebSocket server it was closing all incoming connections and printing the next stack trace:
scala.MatchError: 7 (of class java.lang.Integer)
at org.http4s.websocket.package$.makeFrame(package.scala:26)
at org.http4s.websocket.FrameTranscoder.bufferToFrame(FrameTranscoder.scala:165)
at org.http4s.server.blaze.WebSocketDecoder.bufferToMessage(WebSocketDecoder.scala:30)
at org.http4s.blaze.pipeline.stages.ByteToObjectStage.$anonfun$readAndDecodeLoop$1(ByteToObjectStage.scala:85)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
at org.http4s.blaze.util.Execution$ThreadLocalTrampoline.run(Execution.scala:108)
at org.http4s.blaze.util.Execution$ThreadLocalTrampoline.execute(Execution.scala:94)
at org.http4s.blaze.util.Execution$$anon$2.execute(Execution.scala:53)
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68)
at scala.concurrent.impl.Promise$DefaultPromise.dispatchOrAddCallback(Promise.scala:312)
at scala.concurrent.impl.Promise$DefaultPromise.onComplete(Promise.scala:303)
at org.http4s.blaze.pipeline.stages.ByteToObjectStage.readAndDecodeLoop(ByteToObjectStage.scala:99)
at org.http4s.blaze.pipeline.stages.ByteToObjectStage.startReadDecode(ByteToObjectStage.scala:72)
at org.http4s.blaze.pipeline.stages.ByteToObjectStage.readRequest(ByteToObjectStage.scala:68)
at org.http4s.blaze.pipeline.stages.ByteToObjectStage.readRequest$(ByteToObjectStage.scala:56)
at org.http4s.server.blaze.WebSocketDecoder.readRequest(WebSocketDecoder.scala:8)
at org.http4s.blaze.pipeline.Tail.channelRead(Stages.scala:88)
at org.http4s.blaze.pipeline.Tail.channelRead$(Stages.scala:85)
at org.http4s.server.blaze.WSFrameAggregator.channelRead(WSFrameAggregator.scala:16)
at org.http4s.server.blaze.WSFrameAggregator.readRequest(WSFrameAggregator.scala:24)
at org.http4s.blaze.pipeline.Tail.channelRead(Stages.scala:88)
at org.http4s.blaze.pipeline.Tail.channelRead$(Stages.scala:85)
at org.http4s.blazecore.websocket.Http4sWSStage.channelRead(Http4sWSStage.scala:18)
at org.http4s.blazecore.websocket.Http4sWSStage.$anonfun$readFrameTrampoline$1(Http4sWSStage.scala:54)
at org.http4s.blazecore.websocket.Http4sWSStage.$anonfun$readFrameTrampoline$1$adapted(Http4sWSStage.scala:53)
at monix.eval.internal.TaskCreate$.$anonfun$async$1(TaskCreate.scala:124)
at monix.eval.internal.TaskCreate$.$anonfun$async$1$adapted(TaskCreate.scala:121)
at monix.eval.internal.TaskRestartCallback.start(TaskRestartCallback.scala:58)
at monix.eval.internal.TaskRunLoop$.executeAsyncTask(TaskRunLoop.scala:564)
at monix.eval.internal.TaskRunLoop$.startFull(TaskRunLoop.scala:115)
at monix.eval.internal.TaskRunLoop$.$anonfun$restartAsync$1(TaskRunLoop.scala:192)
at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Seems that it doesn't properly handle deviations from the protocol and throws an error in case if a received opcode doesn't match to the expected valid set of opcodes.
I've checked the WebSockets RFC and it says that a server must close a connection and return 400 in case of an handshake error - https://tools.ietf.org/html/rfc6455#section-4.2.1
Also, it says that opcodes from 3 to 7 are reserved for the future usage and I didn't find information on how they should be handled exactly. However, there is a sentence: If an unknown
opcode is received, the receiving endpoint MUST _Fail the
WebSocket Connection_., though not sure if it's applicable to them - https://tools.ietf.org/html/rfc6455#section-5.2
Probably at least server could handle such opcodes and print something less scary and more understandable for users.
- Lingua principale
- Scala
- Stelle
- 371
- Fork
- 63
- Merge medio
- 1g 18h
- PR unite (30g)
- 8
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di http4s/blaze
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
http4s/blaze#918 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
http4s/blaze#894 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
I maintainer di solito rispondono entro 1 giorno
-
support
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
http4s/blaze#774 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di http4s/blaze
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
I maintainer di solito rispondono entro 1 giorno
-
bug triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
propensive/soundness#2266 ·
I maintainer di solito rispondono entro 1 giorno
-
Module: Form Builder
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
orbeon/orbeon-forms#7943 ·
I maintainer di solito rispondono entro 2 giorni
-
bbb-web: concurrent joins lose RegisterUserReqMsg (HashMap race in Meeting.userCustomData)Forse già presa @ArsenFesiuk l’ha presa 1 giorno fa. Apertamodule: core
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
bigbluebutton/bigbluebutton#26028 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno