Răsfoiți Sursa

Merge pull request #97913 from Faless/fix/websocket_closing_transition

[WS] Detect disconnection due to protocol errors
Thaddeus Crews 8 luni în urmă
părinte
comite
caff0ff591
1 a modificat fișierele cu 31 adăugiri și 6 ștergeri
  1. 31 6
      modules/websocket/wsl_peer.cpp

+ 31 - 6
modules/websocket/wsl_peer.cpp

@@ -716,12 +716,37 @@ void WSLPeer::poll() {
 			close(-1);
 			close(-1);
 			return;
 			return;
 		}
 		}
-		if (wslay_event_get_close_sent(wsl_ctx) && wslay_event_get_close_received(wsl_ctx)) {
-			// Clean close.
-			wslay_event_context_free(wsl_ctx);
-			wsl_ctx = nullptr;
-			close(-1);
-			return;
+		if (wslay_event_get_close_sent(wsl_ctx)) {
+			if (wslay_event_get_close_received(wsl_ctx)) {
+				// Clean close.
+				wslay_event_context_free(wsl_ctx);
+				wsl_ctx = nullptr;
+				close(-1);
+				return;
+			} else if (!wslay_event_get_read_enabled(wsl_ctx)) {
+				// Some protocol error caused wslay to stop processing incoming events, we'll never receive a close from the other peer.
+				close_code = wslay_event_get_status_code_sent(wsl_ctx);
+				switch (close_code) {
+					case WSLAY_CODE_MESSAGE_TOO_BIG:
+						close_reason = "Message too big";
+						break;
+					case WSLAY_CODE_PROTOCOL_ERROR:
+						close_reason = "Protocol error";
+						break;
+					case WSLAY_CODE_ABNORMAL_CLOSURE:
+						close_reason = "Abnormal closure";
+						break;
+					case WSLAY_CODE_INVALID_FRAME_PAYLOAD_DATA:
+						close_reason = "Invalid frame payload data";
+						break;
+					default:
+						close_reason = "Unknown";
+				}
+				wslay_event_context_free(wsl_ctx);
+				wsl_ctx = nullptr;
+				close(-1);
+				return;
+			}
 		}
 		}
 	}
 	}
 }
 }