diff --git a/.gitignore b/.gitignore index a9d37c5..6416a18 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ target Cargo.lock + +autobahn/client/* +autobahn/server/* diff --git a/Cargo.toml b/Cargo.toml index 286dad3..4dc875c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ edition = "2018" default = ["tls"] tls = ["native-tls"] tls-vendored = ["native-tls", "native-tls/vendored"] +deflate = ["flate2"] [dependencies] base64 = "0.12.0" @@ -30,6 +31,12 @@ sha-1 = "0.9" url = "2.1.0" utf-8 = "0.7.5" +[dependencies.flate2] +optional = true +version = "1.0" +default-features = false +features = ["zlib"] + [dependencies.native-tls] optional = true version = "0.2.3" @@ -37,3 +44,11 @@ version = "0.2.3" [dev-dependencies] env_logger = "0.7.1" net2 = "0.2.33" + +[[example]] +name = "autobahn-client" +required-features = ["deflate"] + +[[example]] +name = "autobahn-server" +required-features = ["deflate"] diff --git a/README.md b/README.md index a0351db..5374cfe 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Features Tungstenite provides a complete implementation of the WebSocket specification. TLS is supported on all platforms using native-tls. -There is no support for permessage-deflate at the moment. It's planned. +Permessage-deflate. Testing ------- diff --git a/autobahn/client-results.json b/autobahn/client-results.json index 4add9bb..cccdd64 100644 --- a/autobahn/client-results.json +++ b/autobahn/client-results.json @@ -17,14 +17,14 @@ "1.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_1_1_3.json" }, "1.1.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_1_1_4.json" }, @@ -52,7 +52,7 @@ "1.1.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 6, + "duration": 4, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_1_1_8.json" }, @@ -66,7 +66,7 @@ "1.2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_1_2_2.json" }, @@ -94,21 +94,21 @@ "1.2.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 31, + "duration": 17, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_1_2_6.json" }, "1.2.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 26, + "duration": 17, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_1_2_7.json" }, "1.2.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 36, + "duration": 18, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_1_2_8.json" }, @@ -120,1584 +120,1584 @@ "reportfile": "tungstenite_case_10_1_1.json" }, "12.1.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 507, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_1.json" }, "12.1.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2919, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_10.json" }, "12.1.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 697, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_11.json" }, "12.1.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 840, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_12.json" }, "12.1.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1147, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_13.json" }, "12.1.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1763, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_14.json" }, "12.1.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 3019, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_15.json" }, "12.1.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2919, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_16.json" }, "12.1.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2905, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_17.json" }, "12.1.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2856, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_18.json" }, "12.1.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 517, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_2.json" }, "12.1.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 521, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_3.json" }, "12.1.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 541, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_4.json" }, "12.1.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 615, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_5.json" }, "12.1.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 753, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_6.json" }, "12.1.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1070, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_7.json" }, "12.1.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1251, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_8.json" }, "12.1.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1715, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_1_9.json" }, "12.2.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 80, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_1.json" }, "12.2.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 6047, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_10.json" }, "12.2.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 708, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_11.json" }, "12.2.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1224, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_12.json" }, "12.2.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2278, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_13.json" }, "12.2.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 4457, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_14.json" }, "12.2.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 8522, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_15.json" }, "12.2.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 6699, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_16.json" }, "12.2.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 6321, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_17.json" }, "12.2.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 6184, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_18.json" }, "12.2.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 94, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_2.json" }, "12.2.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 120, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_3.json" }, "12.2.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 185, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_4.json" }, "12.2.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 352, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_5.json" }, "12.2.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 537, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_6.json" }, "12.2.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 920, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_7.json" }, "12.2.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1653, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_8.json" }, "12.2.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 3238, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_2_9.json" }, "12.3.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 82, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_1.json" }, "12.3.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 8368, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_10.json" }, "12.3.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 760, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_11.json" }, "12.3.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1399, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_12.json" }, "12.3.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2562, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_13.json" }, "12.3.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 5093, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_14.json" }, "12.3.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 9940, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_15.json" }, "12.3.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 8570, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_16.json" }, "12.3.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 8363, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_17.json" }, "12.3.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 8281, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_18.json" }, "12.3.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 90, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_2.json" }, "12.3.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 115, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_3.json" }, "12.3.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 188, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_4.json" }, "12.3.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 423, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_5.json" }, "12.3.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 684, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_6.json" }, "12.3.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1218, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_7.json" }, "12.3.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2216, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_8.json" }, "12.3.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 4302, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_3_9.json" }, "12.4.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 650, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_1.json" }, "12.4.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 3178, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_10.json" }, "12.4.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 843, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_11.json" }, "12.4.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1010, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_12.json" }, "12.4.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1343, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_13.json" }, "12.4.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2023, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_14.json" }, "12.4.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3377, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_15.json" }, "12.4.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3256, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_16.json" }, "12.4.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3217, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_17.json" }, "12.4.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3242, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_18.json" }, "12.4.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 648, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_2.json" }, "12.4.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 647, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_3.json" }, "12.4.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 679, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_4.json" }, "12.4.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 757, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_5.json" }, "12.4.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 833, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_6.json" }, "12.4.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 989, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_7.json" }, "12.4.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1300, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_8.json" }, "12.4.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1932, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_4_9.json" }, "12.5.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 84, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_1.json" }, "12.5.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 4412, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_10.json" }, "12.5.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 590, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_11.json" }, "12.5.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 968, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_12.json" }, "12.5.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1799, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_13.json" }, "12.5.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 3433, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_14.json" }, "12.5.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 6574, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_15.json" }, "12.5.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 5006, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_16.json" }, "12.5.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 4575, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_17.json" }, "12.5.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 4402, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_18.json" }, "12.5.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 91, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_2.json" }, "12.5.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 118, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_3.json" }, "12.5.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 164, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_4.json" }, "12.5.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 283, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_5.json" }, "12.5.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 432, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_6.json" }, "12.5.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 675, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_7.json" }, "12.5.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1223, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_8.json" }, "12.5.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2289, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_12_5_9.json" }, "13.1.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 508, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_1.json" }, "13.1.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2855, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_10.json" }, "13.1.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 683, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_11.json" }, "13.1.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 838, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_12.json" }, "13.1.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1173, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_13.json" }, "13.1.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1776, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_14.json" }, "13.1.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3034, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_15.json" }, "13.1.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2907, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_16.json" }, "13.1.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2909, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_17.json" }, "13.1.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2845, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_18.json" }, "13.1.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 506, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_2.json" }, "13.1.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 520, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_3.json" }, "13.1.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 524, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_4.json" }, "13.1.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 602, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_5.json" }, "13.1.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 680, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_6.json" }, "13.1.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 825, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_7.json" }, "13.1.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1112, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_8.json" }, "13.1.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1701, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_1_9.json" }, "13.2.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 508, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_1.json" }, "13.2.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2873, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_10.json" }, "13.2.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 686, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_11.json" }, "13.2.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 841, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_12.json" }, "13.2.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1151, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_13.json" }, "13.2.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1780, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_14.json" }, "13.2.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 3009, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_15.json" }, "13.2.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 4, + "duration": 2896, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_16.json" }, "13.2.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2873, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_17.json" }, "13.2.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2906, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_18.json" }, "13.2.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 513, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_2.json" }, "13.2.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 530, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_3.json" }, "13.2.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 545, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_4.json" }, "13.2.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 602, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_5.json" }, "13.2.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 679, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_6.json" }, "13.2.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 822, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_7.json" }, "13.2.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1123, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_8.json" }, "13.2.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1716, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_2_9.json" }, "13.3.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 515, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_1.json" }, "13.3.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2849, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_10.json" }, "13.3.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 684, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_11.json" }, "13.3.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 843, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_12.json" }, "13.3.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1151, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_13.json" }, "13.3.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1776, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_14.json" }, "13.3.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2996, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_15.json" }, "13.3.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2906, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_16.json" }, "13.3.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2865, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_17.json" }, "13.3.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2891, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_18.json" }, "13.3.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 518, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_2.json" }, "13.3.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 522, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_3.json" }, "13.3.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 543, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_4.json" }, "13.3.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 605, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_5.json" }, "13.3.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 683, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_6.json" }, "13.3.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 824, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_7.json" }, "13.3.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1129, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_8.json" }, "13.3.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1716, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_3_9.json" }, "13.4.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 505, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_1.json" }, "13.4.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2864, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_10.json" }, "13.4.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 680, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_11.json" }, "13.4.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 827, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_12.json" }, "13.4.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1149, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_13.json" }, "13.4.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1776, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_14.json" }, "13.4.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3011, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_15.json" }, "13.4.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2903, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_16.json" }, "13.4.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2878, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_17.json" }, "13.4.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2910, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_18.json" }, "13.4.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 504, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_2.json" }, "13.4.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 524, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_3.json" }, "13.4.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 537, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_4.json" }, "13.4.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 605, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_5.json" }, "13.4.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 681, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_6.json" }, "13.4.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 833, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_7.json" }, "13.4.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1118, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_8.json" }, "13.4.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1699, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_4_9.json" }, "13.5.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 520, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_1.json" }, "13.5.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2878, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_10.json" }, "13.5.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 695, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_11.json" }, "13.5.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 847, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_12.json" }, "13.5.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1162, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_13.json" }, "13.5.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1773, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_14.json" }, "13.5.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 3025, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_15.json" }, "13.5.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 2937, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_16.json" }, "13.5.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2897, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_17.json" }, "13.5.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2873, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_18.json" }, "13.5.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 654, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_2.json" }, "13.5.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 676, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_3.json" }, "13.5.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 706, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_4.json" }, "13.5.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 798, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_5.json" }, "13.5.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 812, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_6.json" }, "13.5.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 832, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_7.json" }, "13.5.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1115, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_8.json" }, "13.5.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1706, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_5_9.json" }, "13.6.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 503, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_1.json" }, "13.6.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2848, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_10.json" }, "13.6.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 686, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_11.json" }, "13.6.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 853, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_12.json" }, "13.6.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1151, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_13.json" }, "13.6.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1773, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_14.json" }, "13.6.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 3057, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_15.json" }, "13.6.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2949, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_16.json" }, "13.6.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2879, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_17.json" }, "13.6.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2868, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_18.json" }, "13.6.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 507, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_2.json" }, "13.6.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 519, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_3.json" }, "13.6.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 537, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_4.json" }, "13.6.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 600, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_5.json" }, "13.6.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 673, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_6.json" }, "13.6.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 836, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_7.json" }, "13.6.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1115, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_8.json" }, "13.6.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1694, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_6_9.json" }, "13.7.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 507, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_1.json" }, "13.7.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2890, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_10.json" }, "13.7.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 687, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_11.json" }, "13.7.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 839, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_12.json" }, "13.7.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1144, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_13.json" }, "13.7.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1768, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_14.json" }, "13.7.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3048, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_15.json" }, "13.7.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2902, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_16.json" }, "13.7.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2857, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_17.json" }, "13.7.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2841, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_18.json" }, "13.7.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 508, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_2.json" }, "13.7.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 517, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_3.json" }, "13.7.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 537, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_4.json" }, "13.7.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 604, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_5.json" }, "13.7.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 680, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_6.json" }, "13.7.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 824, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_7.json" }, "13.7.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1116, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_8.json" }, "13.7.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 1712, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_13_7_9.json" }, "2.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_1.json" }, "2.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_10.json" }, "2.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 10, + "duration": 6, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_11.json" }, "2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_2.json" }, "2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_3.json" }, "2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_4.json" }, "2.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_2_5.json" }, "2.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 9, + "duration": 5, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_6.json" }, "2.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_7.json" }, "2.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_2_8.json" }, @@ -1718,42 +1718,42 @@ "3.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_3_2.json" }, "3.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_3_3.json" }, "3.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 5, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_3_4.json" }, "3.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_3_5.json" }, "3.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_3_6.json" }, "3.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_3_7.json" }, @@ -1767,28 +1767,28 @@ "4.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_4_1_2.json" }, "4.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_4_1_3.json" }, "4.1.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_4_1_4.json" }, "4.1.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_4_1_5.json" }, @@ -1809,42 +1809,42 @@ "4.2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_4_2_3.json" }, "4.2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_4_2_4.json" }, "4.2.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_4_2_5.json" }, "5.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_5_1.json" }, "5.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_5_10.json" }, "5.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_5_11.json" }, @@ -1865,7 +1865,7 @@ "5.14": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 2, "remoteCloseCode": null, "reportfile": "tungstenite_case_5_14.json" }, @@ -1879,14 +1879,14 @@ "5.16": { "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 2, "remoteCloseCode": null, "reportfile": "tungstenite_case_5_16.json" }, "5.17": { "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_5_17.json" }, @@ -1900,7 +1900,7 @@ "5.19": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1004, + "duration": 1003, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_5_19.json" }, @@ -1914,7 +1914,7 @@ "5.20": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1005, + "duration": 1004, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_5_20.json" }, @@ -1935,14 +1935,14 @@ "5.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_5_5.json" }, "5.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 2, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_5_6.json" }, @@ -1956,21 +1956,21 @@ "5.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 17, + "duration": 2, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_5_8.json" }, "5.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_5_9.json" }, "6.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 3, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_1_1.json" }, @@ -1984,7 +1984,7 @@ "6.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 3, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_1_3.json" }, @@ -2075,7 +2075,7 @@ "6.12.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_12_5.json" }, @@ -2145,7 +2145,7 @@ "6.14.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_14_10.json" }, @@ -2201,63 +2201,63 @@ "6.14.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_14_9.json" }, "6.15.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_15_1.json" }, "6.16.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_16_1.json" }, "6.16.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_16_2.json" }, "6.16.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_16_3.json" }, "6.17.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_17_1.json" }, "6.17.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_17_2.json" }, "6.17.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_17_3.json" }, "6.17.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_17_4.json" }, @@ -2271,21 +2271,21 @@ "6.18.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_18_1.json" }, "6.18.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_18_2.json" }, "6.18.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_18_3.json" }, @@ -2348,7 +2348,7 @@ "6.2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 3, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_2_2.json" }, @@ -2362,7 +2362,7 @@ "6.2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 7, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_2_4.json" }, @@ -2488,7 +2488,7 @@ "6.22.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_11.json" }, @@ -2523,14 +2523,14 @@ "6.22.16": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_16.json" }, "6.22.17": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_17.json" }, @@ -2551,70 +2551,70 @@ "6.22.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_2.json" }, "6.22.20": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_20.json" }, "6.22.21": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_21.json" }, "6.22.22": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_22.json" }, "6.22.23": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_23.json" }, "6.22.24": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_24.json" }, "6.22.25": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_25.json" }, "6.22.26": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_26.json" }, "6.22.27": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_27.json" }, "6.22.28": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_28.json" }, @@ -2628,7 +2628,7 @@ "6.22.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_3.json" }, @@ -2642,7 +2642,7 @@ "6.22.31": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_31.json" }, @@ -2670,14 +2670,14 @@ "6.22.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 4, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_4.json" }, "6.22.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_5.json" }, @@ -2691,35 +2691,35 @@ "6.22.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_7.json" }, "6.22.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_8.json" }, "6.22.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_22_9.json" }, "6.23.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_23_1.json" }, "6.23.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_23_2.json" }, @@ -2740,21 +2740,21 @@ "6.23.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_23_5.json" }, "6.23.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_23_6.json" }, "6.23.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_23_7.json" }, @@ -2768,21 +2768,21 @@ "6.3.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_3_2.json" }, "6.4.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1001, + "duration": 1002, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_4_1.json" }, "6.4.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1002, + "duration": 1001, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_4_2.json" }, @@ -2803,7 +2803,7 @@ "6.5.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 3, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_5_1.json" }, @@ -2817,140 +2817,140 @@ "6.5.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_5_3.json" }, "6.5.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_5_4.json" }, "6.5.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_5_5.json" }, "6.6.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_6_1.json" }, "6.6.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_6_10.json" }, "6.6.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 5, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_6_11.json" }, "6.6.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_6_2.json" }, "6.6.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_6_3.json" }, "6.6.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_6_4.json" }, "6.6.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_6_5.json" }, "6.6.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_6_6.json" }, "6.6.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_6_7.json" }, "6.6.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_6_8.json" }, "6.6.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_6_9.json" }, "6.7.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_7_1.json" }, "6.7.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_7_2.json" }, "6.7.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_7_3.json" }, "6.7.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_7_4.json" }, "6.8.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_8_1.json" }, "6.8.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, "reportfile": "tungstenite_case_6_8_2.json" }, @@ -2971,7 +2971,7 @@ "6.9.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_6_9_3.json" }, @@ -2992,14 +2992,14 @@ "7.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_7_1_2.json" }, "7.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_7_1_3.json" }, @@ -3020,7 +3020,7 @@ "7.1.6": { "behavior": "INFORMATIONAL", "behaviorClose": "INFORMATIONAL", - "duration": 16, + "duration": 7, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_7_1_6.json" }, @@ -3034,14 +3034,14 @@ "7.13.2": { "behavior": "INFORMATIONAL", "behaviorClose": "INFORMATIONAL", - "duration": 2, + "duration": 0, "remoteCloseCode": 1002, "reportfile": "tungstenite_case_7_13_2.json" }, "7.3.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 3, "remoteCloseCode": null, "reportfile": "tungstenite_case_7_3_1.json" }, @@ -3069,7 +3069,7 @@ "7.3.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_7_3_5.json" }, @@ -3090,7 +3090,7 @@ "7.7.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_7_7_1.json" }, @@ -3125,7 +3125,7 @@ "7.7.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_7_7_2.json" }, @@ -3139,7 +3139,7 @@ "7.7.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_7_7_4.json" }, @@ -3188,21 +3188,21 @@ "7.9.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1002, "reportfile": "tungstenite_case_7_9_2.json" }, "7.9.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1002, "reportfile": "tungstenite_case_7_9_3.json" }, "7.9.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1002, "reportfile": "tungstenite_case_7_9_4.json" }, @@ -3230,7 +3230,7 @@ "7.9.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": 1002, "reportfile": "tungstenite_case_7_9_8.json" }, @@ -3244,378 +3244,378 @@ "9.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 5, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_1_1.json" }, "9.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 6, + "duration": 4, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_1_2.json" }, "9.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 22, + "duration": 16, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_1_3.json" }, "9.1.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 110, + "duration": 64, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_1_4.json" }, "9.1.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 205, + "duration": 126, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_1_5.json" }, "9.1.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 320, + "duration": 244, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_1_6.json" }, "9.2.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_2_1.json" }, "9.2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 6, + "duration": 4, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_2_2.json" }, "9.2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 16, + "duration": 14, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_2_3.json" }, "9.2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 123, + "duration": 57, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_2_4.json" }, "9.2.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 169, + "duration": 114, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_2_5.json" }, "9.2.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 360, + "duration": 253, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_2_6.json" }, "9.3.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 638, + "duration": 394, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_1.json" }, "9.3.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 209, + "duration": 129, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_2.json" }, "9.3.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 93, + "duration": 58, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_3.json" }, "9.3.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 64, + "duration": 40, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_4.json" }, "9.3.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, + "duration": 34, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_5.json" }, "9.3.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 50, + "duration": 34, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_6.json" }, "9.3.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 45, + "duration": 33, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_7.json" }, "9.3.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 51, + "duration": 34, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_8.json" }, "9.3.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 57, + "duration": 36, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_3_9.json" }, "9.4.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 608, + "duration": 364, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_1.json" }, "9.4.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 192, + "duration": 111, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_2.json" }, "9.4.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 75, + "duration": 41, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_3.json" }, "9.4.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, + "duration": 23, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_4.json" }, "9.4.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 29, + "duration": 19, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_5.json" }, "9.4.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 39, + "duration": 18, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_6.json" }, "9.4.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 35, + "duration": 18, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_7.json" }, "9.4.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 24, + "duration": 19, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_8.json" }, "9.4.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 29, + "duration": 19, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_4_9.json" }, "9.5.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 795, + "duration": 570, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_5_1.json" }, "9.5.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 425, + "duration": 290, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_5_2.json" }, "9.5.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 228, + "duration": 154, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_5_3.json" }, "9.5.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 114, + "duration": 85, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_5_4.json" }, "9.5.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 84, + "duration": 49, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_5_5.json" }, "9.5.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 51, + "duration": 30, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_5_6.json" }, "9.6.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 799, + "duration": 567, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_6_1.json" }, "9.6.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 429, + "duration": 291, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_6_2.json" }, "9.6.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 214, + "duration": 157, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_6_3.json" }, "9.6.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 127, + "duration": 83, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_6_4.json" }, "9.6.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 80, + "duration": 48, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_6_5.json" }, "9.6.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 57, + "duration": 30, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_6_6.json" }, "9.7.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 127, + "duration": 66, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_7_1.json" }, "9.7.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 121, + "duration": 69, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_7_2.json" }, "9.7.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 124, + "duration": 73, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_7_3.json" }, "9.7.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 146, + "duration": 81, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_7_4.json" }, "9.7.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 196, + "duration": 118, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_7_5.json" }, "9.7.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 351, + "duration": 250, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_7_6.json" }, "9.8.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 95, + "duration": 64, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_8_1.json" }, "9.8.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 119, + "duration": 69, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_8_2.json" }, "9.8.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 115, + "duration": 69, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_8_3.json" }, "9.8.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 134, + "duration": 79, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_8_4.json" }, "9.8.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 187, + "duration": 107, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_8_5.json" }, "9.8.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 328, + "duration": 202, "remoteCloseCode": 1000, "reportfile": "tungstenite_case_9_8_6.json" } diff --git a/autobahn/server-results.json b/autobahn/server-results.json index 4b1ea8d..e74b968 100644 --- a/autobahn/server-results.json +++ b/autobahn/server-results.json @@ -1,3637 +1,3623 @@ { - "rust-websocket": { + "Tungstenite": { "1.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 45, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_1.json" }, "1.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_2.json" }, "1.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_3.json" }, "1.1.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_4.json" }, "1.1.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_5.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_5.json" }, "1.1.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 26, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_6.json" + "duration": 4, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_6.json" }, "1.1.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 20, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_7.json" + "duration": 5, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_7.json" }, "1.1.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 20, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_1_8.json" + "duration": 6, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_1_8.json" }, "1.2.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_1.json" }, "1.2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 46, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_2.json" }, "1.2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 46, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_3.json" }, "1.2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_4.json" }, "1.2.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_5.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_5.json" }, "1.2.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 68, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_6.json" + "duration": 18, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_6.json" }, "1.2.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 40, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_7.json" + "duration": 18, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_7.json" }, "1.2.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 36, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_1_2_8.json" + "duration": 21, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_1_2_8.json" }, "10.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 33, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_10_1_1.json" + "duration": 9, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_10_1_1.json" }, "12.1.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_1.json" + "duration": 626, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_1.json" }, "12.1.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_10.json" + "duration": 5308, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_10.json" }, "12.1.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_11.json" + "duration": 796, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_11.json" }, "12.1.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_12.json" + "duration": 948, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_12.json" }, "12.1.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_13.json" + "duration": 1438, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_13.json" }, "12.1.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_14.json" + "duration": 2804, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_14.json" }, "12.1.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_15.json" + "duration": 5424, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_15.json" }, "12.1.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_16.json" + "duration": 5352, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_16.json" }, "12.1.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_17.json" + "duration": 5437, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_17.json" }, "12.1.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_18.json" + "duration": 5622, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_18.json" }, "12.1.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_2.json" + "duration": 612, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_2.json" }, "12.1.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_3.json" + "duration": 655, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_3.json" }, "12.1.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_4.json" + "duration": 667, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_4.json" }, "12.1.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_5.json" + "duration": 730, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_5.json" }, "12.1.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_6.json" + "duration": 825, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_6.json" }, "12.1.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_7.json" + "duration": 944, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_7.json" }, "12.1.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_8.json" + "duration": 1509, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_8.json" }, "12.1.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_1_9.json" + "duration": 2843, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_1_9.json" }, "12.2.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_1.json" + "duration": 110, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_1.json" }, "12.2.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_10.json" + "duration": 13106, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_10.json" }, "12.2.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_11.json" + "duration": 902, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_11.json" }, "12.2.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_12.json" + "duration": 1884, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_12.json" }, "12.2.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_13.json" + "duration": 4376, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_13.json" }, "12.2.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_14.json" + "duration": 8699, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_14.json" }, "12.2.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_15.json" + "duration": 17706, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_15.json" }, "12.2.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_16.json" + "duration": 14203, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_16.json" }, "12.2.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_17.json" + "duration": 13358, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_17.json" }, "12.2.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_18.json" + "duration": 13024, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_18.json" }, "12.2.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_2.json" + "duration": 141, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_2.json" }, "12.2.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_3.json" + "duration": 136, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_3.json" }, "12.2.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_4.json" + "duration": 237, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_4.json" }, "12.2.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_5.json" + "duration": 482, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_5.json" }, "12.2.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_6.json" + "duration": 885, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_6.json" }, "12.2.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_7.json" + "duration": 1692, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_7.json" }, "12.2.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_8.json" + "duration": 3395, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_8.json" }, "12.2.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_2_9.json" + "duration": 6743, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_2_9.json" }, "12.3.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_1.json" + "duration": 98, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_1.json" }, "12.3.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_10.json" + "duration": 11308, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_10.json" }, "12.3.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_11.json" + "duration": 734, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_11.json" }, "12.3.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_12.json" + "duration": 1263, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_12.json" }, "12.3.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_13.json" + "duration": 2953, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_13.json" }, "12.3.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_14.json" + "duration": 6534, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_14.json" }, "12.3.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_15.json" + "duration": 13252, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_15.json" }, "12.3.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_16.json" + "duration": 11823, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_16.json" }, "12.3.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_17.json" + "duration": 11151, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_17.json" }, "12.3.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_18.json" + "duration": 11493, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_18.json" }, "12.3.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_2.json" + "duration": 105, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_2.json" }, "12.3.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_3.json" + "duration": 133, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_3.json" }, "12.3.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_4.json" + "duration": 166, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_4.json" }, "12.3.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_5.json" + "duration": 368, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_5.json" }, "12.3.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_6.json" + "duration": 616, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_6.json" }, "12.3.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_7.json" + "duration": 1192, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_7.json" }, "12.3.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_8.json" + "duration": 2294, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_8.json" }, "12.3.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_3_9.json" + "duration": 5598, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_3_9.json" }, "12.4.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_1.json" + "duration": 689, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_1.json" }, "12.4.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_10.json" + "duration": 5214, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_10.json" }, "12.4.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_11.json" + "duration": 921, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_11.json" }, "12.4.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_12.json" + "duration": 1098, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_12.json" }, "12.4.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_13.json" + "duration": 1475, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_13.json" }, "12.4.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_14.json" + "duration": 2727, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_14.json" }, "12.4.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_15.json" + "duration": 5294, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_15.json" }, "12.4.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_16.json" + "duration": 5275, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_16.json" }, "12.4.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_17.json" + "duration": 5220, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_17.json" }, "12.4.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_18.json" + "duration": 5211, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_18.json" }, "12.4.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_2.json" + "duration": 693, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_2.json" }, "12.4.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_3.json" + "duration": 711, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_3.json" }, "12.4.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_4.json" + "duration": 742, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_4.json" }, "12.4.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_5.json" + "duration": 806, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_5.json" }, "12.4.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_6.json" + "duration": 880, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_6.json" }, "12.4.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_7.json" + "duration": 1047, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_7.json" }, "12.4.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_8.json" + "duration": 1420, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_8.json" }, "12.4.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_4_9.json" + "duration": 2700, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_4_9.json" }, "12.5.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_1.json" + "duration": 95, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_1.json" }, "12.5.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_10.json" + "duration": 11305, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_10.json" }, "12.5.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_11.json" + "duration": 1053, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_11.json" }, "12.5.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_12.json" + "duration": 1836, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_12.json" }, "12.5.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_13.json" + "duration": 3614, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_13.json" }, "12.5.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_14.json" + "duration": 7264, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_14.json" }, "12.5.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_15.json" + "duration": 14358, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_15.json" }, "12.5.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_16.json" + "duration": 11942, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_16.json" }, "12.5.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_17.json" + "duration": 11389, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_17.json" }, "12.5.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_18.json" + "duration": 11262, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_18.json" }, "12.5.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_2.json" + "duration": 105, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_2.json" }, "12.5.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_3.json" + "duration": 132, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_3.json" }, "12.5.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_4.json" + "duration": 171, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_4.json" }, "12.5.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_5.json" + "duration": 449, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_5.json" }, "12.5.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_6.json" + "duration": 772, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_6.json" }, "12.5.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_7.json" + "duration": 1472, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_7.json" }, "12.5.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_8.json" + "duration": 2853, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_8.json" }, "12.5.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_12_5_9.json" + "duration": 5700, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_12_5_9.json" }, "13.1.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_1.json" + "duration": 551, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_1.json" }, "13.1.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_10.json" + "duration": 5125, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_10.json" }, "13.1.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_11.json" + "duration": 745, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_11.json" }, "13.1.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_12.json" + "duration": 865, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_12.json" }, "13.1.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_13.json" + "duration": 1378, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_13.json" }, "13.1.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_14.json" + "duration": 2643, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_14.json" }, "13.1.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_15.json" + "duration": 5195, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_15.json" }, "13.1.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_16.json" + "duration": 5141, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_16.json" }, "13.1.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_17.json" + "duration": 5129, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_17.json" }, "13.1.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_18.json" + "duration": 5132, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_18.json" }, "13.1.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_2.json" + "duration": 549, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_2.json" }, "13.1.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_3.json" + "duration": 559, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_3.json" }, "13.1.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_4.json" + "duration": 590, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_4.json" }, "13.1.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_5.json" + "duration": 650, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_5.json" }, "13.1.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_6.json" + "duration": 710, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_6.json" }, "13.1.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_7.json" + "duration": 818, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_7.json" }, "13.1.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_8.json" + "duration": 1368, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_8.json" }, "13.1.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_1_9.json" + "duration": 2609, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_1_9.json" }, "13.2.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_1.json" + "duration": 548, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_1.json" }, "13.2.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_10.json" + "duration": 5127, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_10.json" }, "13.2.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_11.json" + "duration": 738, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_11.json" }, "13.2.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_12.json" + "duration": 861, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_12.json" }, "13.2.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_13.json" + "duration": 1372, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_13.json" }, "13.2.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_14.json" + "duration": 2658, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_14.json" }, "13.2.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_15.json" + "duration": 5206, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_15.json" }, "13.2.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_16.json" + "duration": 5130, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_16.json" }, "13.2.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_17.json" + "duration": 5380, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_17.json" }, "13.2.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_18.json" + "duration": 5297, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_18.json" }, "13.2.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_2.json" + "duration": 553, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_2.json" }, "13.2.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_3.json" + "duration": 576, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_3.json" }, "13.2.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_4.json" + "duration": 596, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_4.json" }, "13.2.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_5.json" + "duration": 649, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_5.json" }, "13.2.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_6.json" + "duration": 712, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_6.json" }, "13.2.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_7.json" + "duration": 824, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_7.json" }, "13.2.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_8.json" + "duration": 1357, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_8.json" }, "13.2.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_2_9.json" + "duration": 2603, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_2_9.json" }, "13.3.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_1.json" + "duration": 571, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_1.json" }, "13.3.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_10.json" + "duration": 5314, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_10.json" }, "13.3.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_11.json" + "duration": 750, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_11.json" }, "13.3.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_12.json" + "duration": 880, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_12.json" }, "13.3.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_13.json" + "duration": 1443, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_13.json" }, "13.3.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_14.json" + "duration": 2737, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_14.json" }, "13.3.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_15.json" + "duration": 5193, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_15.json" }, "13.3.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_16.json" + "duration": 5183, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_16.json" }, "13.3.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_17.json" + "duration": 5310, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_17.json" }, "13.3.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_18.json" + "duration": 5297, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_18.json" }, "13.3.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_2.json" + "duration": 555, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_2.json" }, "13.3.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_3.json" + "duration": 572, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_3.json" }, "13.3.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_4.json" + "duration": 601, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_4.json" }, "13.3.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_5.json" + "duration": 657, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_5.json" }, "13.3.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_6.json" + "duration": 714, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_6.json" }, "13.3.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_7.json" + "duration": 850, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_7.json" }, "13.3.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_8.json" + "duration": 1423, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_8.json" }, "13.3.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_3_9.json" + "duration": 2708, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_3_9.json" }, "13.4.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_1.json" + "duration": 552, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_1.json" }, "13.4.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_10.json" + "duration": 5125, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_10.json" }, "13.4.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_11.json" + "duration": 741, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_11.json" }, "13.4.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_12.json" + "duration": 861, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_12.json" }, "13.4.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_13.json" + "duration": 1376, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_13.json" }, "13.4.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_14.json" + "duration": 2644, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_14.json" }, "13.4.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_15.json" + "duration": 5192, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_15.json" }, "13.4.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_16.json" + "duration": 5155, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_16.json" }, "13.4.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_17.json" + "duration": 5127, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_17.json" }, "13.4.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_18.json" + "duration": 5694, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_18.json" }, "13.4.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_2.json" + "duration": 554, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_2.json" }, "13.4.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_3.json" + "duration": 569, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_3.json" }, "13.4.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_4.json" + "duration": 590, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_4.json" }, "13.4.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_5.json" + "duration": 656, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_5.json" }, "13.4.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_6.json" + "duration": 716, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_6.json" }, "13.4.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_7.json" + "duration": 824, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_7.json" }, "13.4.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_8.json" + "duration": 1361, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_8.json" }, "13.4.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_4_9.json" + "duration": 2603, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_4_9.json" }, "13.5.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_1.json" + "duration": 1199, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_1.json" }, "13.5.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_10.json" + "duration": 6059, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_10.json" }, "13.5.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_11.json" + "duration": 886, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_11.json" }, "13.5.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_12.json" + "duration": 1238, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_12.json" }, "13.5.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_13.json" + "duration": 1824, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_13.json" }, "13.5.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_14.json" + "duration": 2915, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_14.json" }, "13.5.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_15.json" + "duration": 5567, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_15.json" }, "13.5.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_16.json" + "duration": 5331, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_16.json" }, "13.5.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_17.json" + "duration": 5427, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_17.json" }, "13.5.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_18.json" + "duration": 5394, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_18.json" }, "13.5.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_2.json" + "duration": 1609, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_2.json" }, "13.5.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_3.json" + "duration": 1168, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_3.json" }, "13.5.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_4.json" + "duration": 1220, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_4.json" }, "13.5.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_5.json" + "duration": 891, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_5.json" }, "13.5.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_6.json" + "duration": 906, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_6.json" }, "13.5.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_7.json" + "duration": 1018, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_7.json" }, "13.5.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_8.json" + "duration": 1984, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_8.json" }, "13.5.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_5_9.json" + "duration": 3313, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_5_9.json" }, "13.6.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_1.json" + "duration": 640, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_1.json" }, "13.6.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_10.json" + "duration": 5641, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_10.json" }, "13.6.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_11.json" + "duration": 815, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_11.json" }, "13.6.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_12.json" + "duration": 1073, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_12.json" }, "13.6.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_13.json" + "duration": 1594, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_13.json" }, "13.6.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_14.json" + "duration": 2776, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_14.json" }, "13.6.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_15.json" + "duration": 5407, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_15.json" }, "13.6.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_16.json" + "duration": 5375, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_16.json" }, "13.6.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_17.json" + "duration": 5352, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_17.json" }, "13.6.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_18.json" + "duration": 5309, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_18.json" }, "13.6.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_2.json" + "duration": 609, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_2.json" }, "13.6.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_3.json" + "duration": 622, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_3.json" }, "13.6.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_4.json" + "duration": 646, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_4.json" }, "13.6.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_5.json" + "duration": 741, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_5.json" }, "13.6.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_6.json" + "duration": 872, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_6.json" }, "13.6.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_7.json" + "duration": 971, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_7.json" }, "13.6.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_8.json" + "duration": 1491, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_8.json" }, "13.6.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_6_9.json" + "duration": 2868, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_6_9.json" }, "13.7.1": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_1.json" + "duration": 610, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_1.json" }, "13.7.10": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_10.json" + "duration": 5631, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_10.json" }, "13.7.11": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_11.json" + "duration": 811, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_11.json" }, "13.7.12": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_12.json" + "duration": 986, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_12.json" }, "13.7.13": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_13.json" + "duration": 1535, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_13.json" }, "13.7.14": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_14.json" + "duration": 2851, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_14.json" }, "13.7.15": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_15.json" + "duration": 5344, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_15.json" }, "13.7.16": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_16.json" + "duration": 5311, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_16.json" }, "13.7.17": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_17.json" + "duration": 5355, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_17.json" }, "13.7.18": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_18.json" + "duration": 5762, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_18.json" }, "13.7.2": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_2.json" + "duration": 599, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_2.json" }, "13.7.3": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_3.json" + "duration": 619, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_3.json" }, "13.7.4": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_4.json" + "duration": 659, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_4.json" }, "13.7.5": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_5.json" + "duration": 731, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_5.json" }, "13.7.6": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_6.json" + "duration": 807, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_6.json" }, "13.7.7": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_7.json" + "duration": 979, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_7.json" }, "13.7.8": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_8.json" + "duration": 1557, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_8.json" }, "13.7.9": { - "behavior": "UNIMPLEMENTED", + "behavior": "OK", "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_13_7_9.json" + "duration": 2908, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_13_7_9.json" }, "2.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_1.json" }, "2.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 50, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_10.json" + "duration": 44, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_10.json" }, "2.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 72, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_11.json" + "duration": 7, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_11.json" }, "2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_2.json" }, "2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_3.json" }, "2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_4.json" }, "2.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_5.json" + "reportfile": "tungstenite_case_2_5.json" }, "2.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 66, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_6.json" + "duration": 5, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_6.json" }, "2.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_7.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_7.json" }, "2.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_8.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_8.json" }, "2.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 46, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_2_9.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_2_9.json" }, "3.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_3_1.json" + "reportfile": "tungstenite_case_3_1.json" }, "3.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_3_2.json" + "reportfile": "tungstenite_case_3_2.json" }, "3.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_3_3.json" + "reportfile": "tungstenite_case_3_3.json" }, "3.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 9, + "duration": 2, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_3_4.json" + "reportfile": "tungstenite_case_3_4.json" }, "3.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_3_5.json" + "reportfile": "tungstenite_case_3_5.json" }, "3.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_3_6.json" + "reportfile": "tungstenite_case_3_6.json" }, "3.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_3_7.json" + "reportfile": "tungstenite_case_3_7.json" }, "4.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_1_1.json" + "reportfile": "tungstenite_case_4_1_1.json" }, "4.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_1_2.json" + "reportfile": "tungstenite_case_4_1_2.json" }, "4.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_1_3.json" + "reportfile": "tungstenite_case_4_1_3.json" }, "4.1.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_1_4.json" + "reportfile": "tungstenite_case_4_1_4.json" }, "4.1.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_1_5.json" + "reportfile": "tungstenite_case_4_1_5.json" }, "4.2.1": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_2_1.json" + "reportfile": "tungstenite_case_4_2_1.json" }, "4.2.2": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_2_2.json" + "reportfile": "tungstenite_case_4_2_2.json" }, "4.2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_2_3.json" + "reportfile": "tungstenite_case_4_2_3.json" }, "4.2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_2_4.json" + "reportfile": "tungstenite_case_4_2_4.json" }, "4.2.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_4_2_5.json" + "reportfile": "tungstenite_case_4_2_5.json" }, "5.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_1.json" + "reportfile": "tungstenite_case_5_1.json" }, "5.10": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_10.json" + "reportfile": "tungstenite_case_5_10.json" }, "5.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 7, + "duration": 4, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_11.json" + "reportfile": "tungstenite_case_5_11.json" }, "5.12": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_12.json" + "reportfile": "tungstenite_case_5_12.json" }, "5.13": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_13.json" + "reportfile": "tungstenite_case_5_13.json" }, "5.14": { "behavior": "OK", "behaviorClose": "OK", - "duration": 4, + "duration": 3, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_14.json" + "reportfile": "tungstenite_case_5_14.json" }, "5.15": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_15.json" + "reportfile": "tungstenite_case_5_15.json" }, "5.16": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_16.json" + "reportfile": "tungstenite_case_5_16.json" }, "5.17": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_17.json" + "reportfile": "tungstenite_case_5_17.json" }, "5.18": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_18.json" + "reportfile": "tungstenite_case_5_18.json" }, "5.19": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1003, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_19.json" + "duration": 1004, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_19.json" }, "5.2": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_2.json" + "reportfile": "tungstenite_case_5_2.json" }, "5.20": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1046, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_20.json" + "duration": 1004, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_20.json" }, "5.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_3.json" }, "5.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_4.json" }, "5.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 51, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_5.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_5.json" }, "5.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_6.json" + "duration": 43, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_6.json" }, "5.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_7.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_7.json" }, "5.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 54, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_8.json" + "duration": 11, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_5_8.json" }, "5.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_5_9.json" + "reportfile": "tungstenite_case_5_9.json" }, "6.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_1_1.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_1_1.json" }, "6.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 47, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_1_2.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_1_2.json" }, "6.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 46, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_1_3.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_1_3.json" }, "6.10.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_10_1.json" + "reportfile": "tungstenite_case_6_10_1.json" }, "6.10.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_10_2.json" + "reportfile": "tungstenite_case_6_10_2.json" }, "6.10.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_10_3.json" + "reportfile": "tungstenite_case_6_10_3.json" }, "6.11.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 45, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_11_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_11_1.json" }, "6.11.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_11_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_11_2.json" }, "6.11.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_11_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_11_3.json" }, "6.11.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_11_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_11_4.json" }, "6.11.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_11_5.json" + "reportfile": "tungstenite_case_6_11_5.json" }, "6.12.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_1.json" + "reportfile": "tungstenite_case_6_12_1.json" }, "6.12.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_2.json" + "reportfile": "tungstenite_case_6_12_2.json" }, "6.12.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_3.json" + "reportfile": "tungstenite_case_6_12_3.json" }, "6.12.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_4.json" + "reportfile": "tungstenite_case_6_12_4.json" }, "6.12.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_5.json" + "reportfile": "tungstenite_case_6_12_5.json" }, "6.12.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_6.json" + "reportfile": "tungstenite_case_6_12_6.json" }, "6.12.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_7.json" + "reportfile": "tungstenite_case_6_12_7.json" }, "6.12.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_12_8.json" + "reportfile": "tungstenite_case_6_12_8.json" }, "6.13.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_13_1.json" + "reportfile": "tungstenite_case_6_13_1.json" }, "6.13.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_13_2.json" + "reportfile": "tungstenite_case_6_13_2.json" }, "6.13.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_13_3.json" + "reportfile": "tungstenite_case_6_13_3.json" }, "6.13.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_13_4.json" + "reportfile": "tungstenite_case_6_13_4.json" }, "6.13.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_13_5.json" + "reportfile": "tungstenite_case_6_13_5.json" }, "6.14.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_1.json" + "reportfile": "tungstenite_case_6_14_1.json" }, "6.14.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_10.json" + "reportfile": "tungstenite_case_6_14_10.json" }, "6.14.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_2.json" + "reportfile": "tungstenite_case_6_14_2.json" }, "6.14.3": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_3.json" + "reportfile": "tungstenite_case_6_14_3.json" }, "6.14.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_4.json" + "reportfile": "tungstenite_case_6_14_4.json" }, "6.14.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_5.json" + "reportfile": "tungstenite_case_6_14_5.json" }, "6.14.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_6.json" + "reportfile": "tungstenite_case_6_14_6.json" }, "6.14.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_7.json" + "reportfile": "tungstenite_case_6_14_7.json" }, "6.14.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_8.json" + "reportfile": "tungstenite_case_6_14_8.json" }, "6.14.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_14_9.json" + "reportfile": "tungstenite_case_6_14_9.json" }, "6.15.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_15_1.json" + "reportfile": "tungstenite_case_6_15_1.json" }, "6.16.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_16_1.json" + "reportfile": "tungstenite_case_6_16_1.json" }, "6.16.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_16_2.json" + "reportfile": "tungstenite_case_6_16_2.json" }, "6.16.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_16_3.json" + "reportfile": "tungstenite_case_6_16_3.json" }, "6.17.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_17_1.json" + "reportfile": "tungstenite_case_6_17_1.json" }, "6.17.2": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_17_2.json" + "reportfile": "tungstenite_case_6_17_2.json" }, "6.17.3": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_17_3.json" + "reportfile": "tungstenite_case_6_17_3.json" }, "6.17.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_17_4.json" + "reportfile": "tungstenite_case_6_17_4.json" }, "6.17.5": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_17_5.json" + "reportfile": "tungstenite_case_6_17_5.json" }, "6.18.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_18_1.json" + "reportfile": "tungstenite_case_6_18_1.json" }, "6.18.2": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_18_2.json" + "reportfile": "tungstenite_case_6_18_2.json" }, "6.18.3": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_18_3.json" + "reportfile": "tungstenite_case_6_18_3.json" }, "6.18.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_18_4.json" + "reportfile": "tungstenite_case_6_18_4.json" }, "6.18.5": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_18_5.json" + "reportfile": "tungstenite_case_6_18_5.json" }, "6.19.1": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_19_1.json" + "reportfile": "tungstenite_case_6_19_1.json" }, "6.19.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_19_2.json" + "reportfile": "tungstenite_case_6_19_2.json" }, "6.19.3": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_19_3.json" + "reportfile": "tungstenite_case_6_19_3.json" }, "6.19.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_19_4.json" + "reportfile": "tungstenite_case_6_19_4.json" }, "6.19.5": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_19_5.json" + "reportfile": "tungstenite_case_6_19_5.json" }, "6.2.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_2_1.json" + "duration": 2, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_2_1.json" }, "6.2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_2_2.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_2_2.json" }, "6.2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 47, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_2_3.json" + "duration": 4, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_2_3.json" }, "6.2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 47, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_2_4.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_2_4.json" }, "6.20.1": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_20_1.json" + "reportfile": "tungstenite_case_6_20_1.json" }, "6.20.2": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_20_2.json" + "reportfile": "tungstenite_case_6_20_2.json" }, "6.20.3": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_20_3.json" + "reportfile": "tungstenite_case_6_20_3.json" }, "6.20.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_20_4.json" + "reportfile": "tungstenite_case_6_20_4.json" }, "6.20.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_20_5.json" + "reportfile": "tungstenite_case_6_20_5.json" }, "6.20.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 0, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_20_6.json" + "reportfile": "tungstenite_case_6_20_6.json" }, "6.20.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_20_7.json" + "reportfile": "tungstenite_case_6_20_7.json" }, "6.21.1": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_1.json" + "reportfile": "tungstenite_case_6_21_1.json" }, "6.21.2": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_2.json" + "reportfile": "tungstenite_case_6_21_2.json" }, "6.21.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_3.json" + "reportfile": "tungstenite_case_6_21_3.json" }, "6.21.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_4.json" + "reportfile": "tungstenite_case_6_21_4.json" }, "6.21.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_5.json" + "reportfile": "tungstenite_case_6_21_5.json" }, "6.21.6": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_6.json" + "reportfile": "tungstenite_case_6_21_6.json" }, "6.21.7": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_7.json" + "reportfile": "tungstenite_case_6_21_7.json" }, "6.21.8": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_21_8.json" + "reportfile": "tungstenite_case_6_21_8.json" }, "6.22.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 45, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_1.json" }, "6.22.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_10.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_10.json" }, "6.22.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_11.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_11.json" }, "6.22.12": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_12.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_12.json" }, "6.22.13": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_13.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_13.json" }, "6.22.14": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_14.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_14.json" }, "6.22.15": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_15.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_15.json" }, "6.22.16": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_16.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_16.json" }, "6.22.17": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_17.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_17.json" }, "6.22.18": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_18.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_18.json" }, "6.22.19": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_19.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_19.json" }, "6.22.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_2.json" }, "6.22.20": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_20.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_20.json" }, "6.22.21": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_21.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_21.json" }, "6.22.22": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_22.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_22.json" }, "6.22.23": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_23.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_23.json" }, "6.22.24": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_24.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_24.json" }, "6.22.25": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_25.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_25.json" }, "6.22.26": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_26.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_26.json" }, "6.22.27": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_27.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_27.json" }, "6.22.28": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_28.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_28.json" }, "6.22.29": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_29.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_29.json" }, "6.22.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_3.json" }, "6.22.30": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_30.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_30.json" }, "6.22.31": { "behavior": "OK", "behaviorClose": "OK", - "duration": 45, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_31.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_31.json" }, "6.22.32": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_32.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_32.json" }, "6.22.33": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_33.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_33.json" }, "6.22.34": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_34.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_34.json" }, "6.22.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_4.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_4.json" }, "6.22.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_5.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_5.json" }, "6.22.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_6.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_6.json" }, "6.22.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_7.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_7.json" }, "6.22.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_8.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_8.json" }, "6.22.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_22_9.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_22_9.json" }, "6.23.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_23_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_23_1.json" }, "6.23.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_23_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_23_2.json" }, "6.23.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_23_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_23_3.json" }, "6.23.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_23_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_23_4.json" }, "6.23.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_23_5.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_23_5.json" }, "6.23.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_23_6.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_23_6.json" }, "6.23.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_23_7.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_23_7.json" }, "6.3.1": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_3_1.json" + "reportfile": "tungstenite_case_6_3_1.json" }, "6.3.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 3, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_3_2.json" + "reportfile": "tungstenite_case_6_3_2.json" }, "6.4.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2002, + "duration": 1002, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_4_1.json" + "reportfile": "tungstenite_case_6_4_1.json" }, "6.4.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2001, + "duration": 1002, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_4_2.json" + "reportfile": "tungstenite_case_6_4_2.json" }, "6.4.3": { - "behavior": "OK", + "behavior": "NON-STRICT", "behaviorClose": "OK", - "duration": 2003, + "duration": 2002, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_4_3.json" + "reportfile": "tungstenite_case_6_4_3.json" }, "6.4.4": { - "behavior": "OK", + "behavior": "NON-STRICT", "behaviorClose": "OK", - "duration": 2003, + "duration": 2002, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_4_4.json" + "reportfile": "tungstenite_case_6_4_4.json" }, "6.5.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 46, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_5_1.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_5_1.json" }, "6.5.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_5_2.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_5_2.json" }, "6.5.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_5_3.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_5_3.json" }, "6.5.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_5_4.json" + "duration": 3, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_5_4.json" }, "6.5.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 46, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_5_5.json" + "duration": 6, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_5_5.json" }, "6.6.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_1.json" + "reportfile": "tungstenite_case_6_6_1.json" }, "6.6.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_10.json" + "reportfile": "tungstenite_case_6_6_10.json" }, "6.6.11": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_11.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_6_11.json" }, "6.6.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_6_2.json" }, "6.6.3": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_3.json" + "reportfile": "tungstenite_case_6_6_3.json" }, "6.6.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_4.json" + "reportfile": "tungstenite_case_6_6_4.json" }, "6.6.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 45, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_5.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_6_5.json" }, "6.6.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_6.json" + "reportfile": "tungstenite_case_6_6_6.json" }, "6.6.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_7.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_6_7.json" }, "6.6.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, + "duration": 1, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_8.json" + "reportfile": "tungstenite_case_6_6_8.json" }, "6.6.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_6_9.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_6_9.json" }, "6.7.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_7_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_7_1.json" }, "6.7.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_7_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_7_2.json" }, "6.7.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_7_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_7_3.json" }, "6.7.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 47, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_7_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_7_4.json" }, "6.8.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 4, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_8_1.json" + "reportfile": "tungstenite_case_6_8_1.json" }, "6.8.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_8_2.json" + "reportfile": "tungstenite_case_6_8_2.json" }, "6.9.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 47, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_9_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_9_1.json" }, "6.9.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 45, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_9_2.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_9_2.json" }, "6.9.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_9_3.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_9_3.json" }, "6.9.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_6_9_4.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_6_9_4.json" }, "7.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_1_1.json" + "duration": 1, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_1_1.json" }, "7.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_1_2.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_1_2.json" }, "7.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_1_3.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_1_3.json" }, "7.1.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_1_4.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_1_4.json" }, "7.1.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_1_5.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_1_5.json" }, "7.1.6": { "behavior": "INFORMATIONAL", "behaviorClose": "INFORMATIONAL", - "duration": 104, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_1_6.json" + "duration": 19, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_1_6.json" }, "7.13.1": { "behavior": "INFORMATIONAL", "behaviorClose": "INFORMATIONAL", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_13_1.json" + "duration": 2, + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_13_1.json" }, "7.13.2": { "behavior": "INFORMATIONAL", "behaviorClose": "INFORMATIONAL", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_13_2.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_13_2.json" }, "7.3.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_3_1.json" + "reportfile": "tungstenite_case_7_3_1.json" }, "7.3.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_3_2.json" + "reportfile": "tungstenite_case_7_3_2.json" }, "7.3.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_3_3.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_3_3.json" }, "7.3.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_3_4.json" + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_3_4.json" }, "7.3.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_3_5.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_3_5.json" }, "7.3.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_3_6.json" + "reportfile": "tungstenite_case_7_3_6.json" }, "7.5.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, + "duration": 0, "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_5_1.json" + "reportfile": "tungstenite_case_7_5_1.json" }, "7.7.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_1.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_1.json" }, "7.7.10": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_10.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_10.json" }, "7.7.11": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_11.json" + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_11.json" }, "7.7.12": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_12.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_12.json" }, "7.7.13": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_13.json" + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_13.json" }, "7.7.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_2.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_2.json" }, "7.7.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_3.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_3.json" }, "7.7.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_4.json" + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_4.json" }, "7.7.5": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_5.json" + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_5.json" }, "7.7.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_6.json" + "duration": 2, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_6.json" }, "7.7.7": { "behavior": "OK", "behaviorClose": "OK", "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_7.json" + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_7.json" }, "7.7.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_8.json" + "duration": 0, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_8.json" }, "7.7.9": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_7_9.json" + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_7_7_9.json" }, "7.9.1": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_1.json" - }, - "7.9.10": { - "behavior": "OK", - "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_10.json" - }, - "7.9.11": { - "behavior": "OK", - "behaviorClose": "OK", - "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_11.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_1.json" }, "7.9.2": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_2.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_2.json" }, "7.9.3": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_3.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_3.json" }, "7.9.4": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_4.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_4.json" }, "7.9.5": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_5.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_5.json" }, "7.9.6": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_6.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_6.json" }, "7.9.7": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_7.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_7.json" }, "7.9.8": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_8.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_8.json" }, "7.9.9": { "behavior": "OK", "behaviorClose": "OK", "duration": 0, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_7_9_9.json" + "remoteCloseCode": 1002, + "reportfile": "tungstenite_case_7_9_9.json" }, "9.1.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 19, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_1_1.json" + "duration": 4, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_1_1.json" }, "9.1.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 67, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_1_2.json" + "duration": 18, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_1_2.json" }, "9.1.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 257, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_1_3.json" + "duration": 76, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_1_3.json" }, "9.1.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1004, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_1_4.json" + "duration": 285, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_1_4.json" }, "9.1.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1993, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_1_5.json" + "duration": 531, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_1_5.json" }, "9.1.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 4003, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_1_6.json" + "duration": 1063, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_1_6.json" }, "9.2.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 19, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_2_1.json" + "duration": 5, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_2_1.json" }, "9.2.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 66, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_2_2.json" + "duration": 21, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_2_2.json" }, "9.2.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 255, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_2_3.json" + "duration": 69, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_2_3.json" }, "9.2.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1006, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_2_4.json" + "duration": 275, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_2_4.json" }, "9.2.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2003, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_2_5.json" + "duration": 554, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_2_5.json" }, "9.2.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 4071, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_2_6.json" + "duration": 1115, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_2_6.json" }, "9.3.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2098, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_1.json" + "duration": 978, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_1.json" }, "9.3.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1530, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_2.json" + "duration": 555, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_2.json" }, "9.3.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1363, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_3.json" + "duration": 446, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_3.json" }, "9.3.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1289, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_4.json" + "duration": 419, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_4.json" }, "9.3.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1150, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_5.json" + "duration": 393, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_5.json" }, "9.3.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1038, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_6.json" + "duration": 389, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_6.json" }, "9.3.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1035, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_7.json" + "duration": 387, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_7.json" }, "9.3.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 986, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_8.json" + "duration": 350, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_8.json" }, "9.3.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 983, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_3_9.json" + "duration": 231, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_3_9.json" }, "9.4.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 2076, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_1.json" + "duration": 947, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_1.json" }, "9.4.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1500, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_2.json" + "duration": 553, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_2.json" }, "9.4.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1350, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_3.json" + "duration": 433, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_3.json" }, "9.4.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1293, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_4.json" + "duration": 412, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_4.json" }, "9.4.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1115, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_5.json" + "duration": 394, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_5.json" }, "9.4.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1021, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_6.json" + "duration": 391, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_6.json" }, "9.4.7": { "behavior": "OK", "behaviorClose": "OK", - "duration": 976, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_7.json" + "duration": 388, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_7.json" }, "9.4.8": { "behavior": "OK", "behaviorClose": "OK", - "duration": 968, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_8.json" + "duration": 348, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_8.json" }, "9.4.9": { "behavior": "OK", "behaviorClose": "OK", - "duration": 963, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_4_9.json" + "duration": 227, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_4_9.json" }, "9.5.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1012, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_5_1.json" + "duration": 599, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_5_1.json" }, "9.5.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 616, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_5_2.json" + "duration": 322, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_5_2.json" }, "9.5.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 418, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_5_3.json" + "duration": 183, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_5_3.json" }, "9.5.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 318, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_5_4.json" + "duration": 114, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_5_4.json" }, "9.5.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 269, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_5_5.json" + "duration": 79, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_5_5.json" }, "9.5.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 256, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_5_6.json" + "duration": 64, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_5_6.json" }, "9.6.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 1036, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_6_1.json" + "duration": 593, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_6_1.json" }, "9.6.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 632, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_6_2.json" + "duration": 322, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_6_2.json" }, "9.6.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 431, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_6_3.json" + "duration": 199, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_6_3.json" }, "9.6.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 322, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_6_4.json" + "duration": 128, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_6_4.json" }, "9.6.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 267, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_6_5.json" + "duration": 90, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_6_5.json" }, "9.6.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 255, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_6_6.json" + "duration": 77, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_6_6.json" }, "9.7.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43376, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_7_1.json" + "duration": 86, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_7_1.json" }, "9.7.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43431, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_7_2.json" + "duration": 90, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_7_2.json" }, "9.7.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43364, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_7_3.json" + "duration": 99, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_7_3.json" }, "9.7.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43667, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_7_4.json" + "duration": 124, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_7_4.json" }, "9.7.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43511, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_7_5.json" + "duration": 167, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_7_5.json" }, "9.7.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 47030, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_7_6.json" + "duration": 500, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_7_6.json" }, "9.8.1": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43414, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_8_1.json" + "duration": 83, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_8_1.json" }, "9.8.2": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43357, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_8_2.json" + "duration": 97, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_8_2.json" }, "9.8.3": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43340, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_8_3.json" + "duration": 136, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_8_3.json" }, "9.8.4": { "behavior": "OK", "behaviorClose": "OK", - "duration": 44120, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_8_4.json" + "duration": 123, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_8_4.json" }, "9.8.5": { "behavior": "OK", "behaviorClose": "OK", - "duration": 43581, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_8_5.json" + "duration": 175, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_8_5.json" }, "9.8.6": { "behavior": "OK", "behaviorClose": "OK", - "duration": 46744, - "remoteCloseCode": null, - "reportfile": "rust_websocket_case_9_8_6.json" + "duration": 495, + "remoteCloseCode": 1000, + "reportfile": "tungstenite_case_9_8_6.json" } } -} +} \ No newline at end of file diff --git a/examples/autobahn-client.rs b/examples/autobahn-client.rs index 31aedb2..8e0726f 100644 --- a/examples/autobahn-client.rs +++ b/examples/autobahn-client.rs @@ -1,6 +1,9 @@ use log::*; use url::Url; +use tungstenite::client::connect_with_config; +use tungstenite::extensions::deflate::{DeflateConfigBuilder, DeflateExt}; +use tungstenite::protocol::WebSocketConfig; use tungstenite::{connect, Error, Message, Result}; const AGENT: &str = "Tungstenite"; @@ -31,7 +34,19 @@ fn run_test(case: u32) -> Result<()> { case, AGENT )) .unwrap(); - let (mut socket, _) = connect(case_url)?; + let deflate_config = DeflateConfigBuilder::default() + .max_message_size(None) + .build(); + + let (mut socket, _) = connect_with_config( + case_url, + Some(WebSocketConfig { + max_send_queue: None, + max_frame_size: Some(16 << 20), + encoder: DeflateExt::new(deflate_config), + }), + )?; + loop { match socket.read_message()? { msg @ Message::Text(_) | msg @ Message::Binary(_) => { diff --git a/examples/autobahn-server.rs b/examples/autobahn-server.rs index 3c99545..f6e7622 100644 --- a/examples/autobahn-server.rs +++ b/examples/autobahn-server.rs @@ -2,8 +2,11 @@ use std::net::{TcpListener, TcpStream}; use std::thread::spawn; use log::*; +use tungstenite::extensions::deflate::{DeflateExt, DeflateConfigBuilder}; use tungstenite::handshake::HandshakeRole; -use tungstenite::{accept, Error, HandshakeError, Message, Result}; +use tungstenite::protocol::WebSocketConfig; +use tungstenite::server::accept_with_config; +use tungstenite::{Error, HandshakeError, Message, Result}; fn must_not_block(err: HandshakeError) -> Error { match err { @@ -13,7 +16,19 @@ fn must_not_block(err: HandshakeError) -> Error { } fn handle_client(stream: TcpStream) -> Result<()> { - let mut socket = accept(stream).map_err(must_not_block)?; + let deflate_config = DeflateConfigBuilder::default() + .max_message_size(None) + .build(); + + let mut socket = accept_with_config( + stream, + Some(WebSocketConfig { + max_send_queue: None, + max_frame_size: Some(16 << 20), + encoder: DeflateExt::new(deflate_config), + }), + ) + .map_err(must_not_block)?; info!("Running test"); loop { match socket.read_message()? { @@ -32,12 +47,14 @@ fn main() { for stream in server.incoming() { spawn(move || match stream { - Ok(stream) => if let Err(err) = handle_client(stream) { - match err { - Error::ConnectionClosed | Error::Protocol(_) | Error::Utf8 => (), - e => error!("test: {}", e), + Ok(stream) => { + if let Err(err) = handle_client(stream) { + match err { + Error::ConnectionClosed | Error::Protocol(_) | Error::Utf8 => (), + e => error!("test: {}", e), + } } - }, + } Err(e) => error!("Error accepting stream: {}", e), }); } diff --git a/fuzz/fuzz_targets/read_message_client.rs b/fuzz/fuzz_targets/read_message_client.rs index 1c0708b..bd3bf05 100644 --- a/fuzz/fuzz_targets/read_message_client.rs +++ b/fuzz/fuzz_targets/read_message_client.rs @@ -6,6 +6,7 @@ use std::io; use std::io::Cursor; use tungstenite::WebSocket; use tungstenite::protocol::Role; +use tungstenite::extensions::uncompressed::UncompressedExt; //use std::result::Result; // FIXME: copypasted from tungstenite's protocol/mod.rs @@ -32,6 +33,7 @@ impl io::Read for WriteMoc { fuzz_target!(|data: &[u8]| { //let vector: Vec = data.into(); let cursor = Cursor::new(data); - let mut socket = WebSocket::from_raw_socket(WriteMoc(cursor), Role::Client, None); + let mut socket: WebSocket<_, UncompressedExt> = + WebSocket::from_raw_socket(WriteMoc(cursor), Role::Client, None); socket.read_message().ok(); -}); +}); \ No newline at end of file diff --git a/fuzz/fuzz_targets/read_message_server.rs b/fuzz/fuzz_targets/read_message_server.rs index d96db96..aae4bd2 100644 --- a/fuzz/fuzz_targets/read_message_server.rs +++ b/fuzz/fuzz_targets/read_message_server.rs @@ -1,11 +1,13 @@ #![no_main] -#[macro_use] extern crate libfuzzer_sys; +#[macro_use] +extern crate libfuzzer_sys; extern crate tungstenite; use std::io; use std::io::Cursor; -use tungstenite::WebSocket; use tungstenite::protocol::Role; +use tungstenite::WebSocket; +use tungstenite::extensions::uncompressed::UncompressedExt; //use std::result::Result; // FIXME: copypasted from tungstenite's protocol/mod.rs @@ -32,6 +34,7 @@ impl io::Read for WriteMoc { fuzz_target!(|data: &[u8]| { //let vector: Vec = data.into(); let cursor = Cursor::new(data); - let mut socket = WebSocket::from_raw_socket(WriteMoc(cursor), Role::Server, None); + let mut socket: WebSocket<_, UncompressedExt> = + WebSocket::from_raw_socket(WriteMoc(cursor), Role::Server, None); socket.read_message().ok(); }); diff --git a/scripts/autobahn-client.sh b/scripts/autobahn-client.sh index d78b52d..2523a80 100755 --- a/scripts/autobahn-client.sh +++ b/scripts/autobahn-client.sh @@ -23,10 +23,10 @@ function test_diff() { fi } -cargo build --release --example autobahn-client +cargo build --release --example autobahn-client --features deflate wstest -m fuzzingserver -s 'autobahn/fuzzingserver.json' & FUZZINGSERVER_PID=$! sleep 3 echo "Server PID: ${FUZZINGSERVER_PID}" -cargo run --release --example autobahn-client +cargo run --release --example autobahn-client --features deflate test_diff diff --git a/scripts/autobahn-server.sh b/scripts/autobahn-server.sh index b244d73..54f44e5 100755 --- a/scripts/autobahn-server.sh +++ b/scripts/autobahn-server.sh @@ -14,7 +14,7 @@ trap cleanup TERM EXIT function test_diff() { if ! diff -q \ - <(jq -S 'del(."Tungstenite" | .. | .duration?)' 'autobahn/client-results.json') \ + <(jq -S 'del(."Tungstenite" | .. | .duration?)' 'autobahn/server-results.json') \ <(jq -S 'del(."Tungstenite" | .. | .duration?)' 'autobahn/server/index.json') then echo Difference in results, either this is a regression or \ @@ -23,8 +23,8 @@ function test_diff() { fi } -cargo build --release --example autobahn-server -cargo run --release --example autobahn-server & WSSERVER_PID=$! +cargo build --release --example autobahn-server --features deflate +cargo run --release --example autobahn-server --features deflate & WSSERVER_PID=$! echo "Server PID: ${WSSERVER_PID}" sleep 3 wstest -m fuzzingclient -s 'autobahn/fuzzingclient.json' diff --git a/src/client.rs b/src/client.rs index d9d7151..3911342 100644 --- a/src/client.rs +++ b/src/client.rs @@ -66,6 +66,8 @@ use self::encryption::wrap_stream; pub use self::encryption::AutoStream; use crate::error::{Error, Result}; +use crate::extensions::uncompressed::UncompressedExt; +use crate::extensions::WebSocketExtension; use crate::handshake::client::ClientHandshake; use crate::handshake::HandshakeError; use crate::protocol::WebSocket; @@ -86,10 +88,14 @@ use crate::stream::{Mode, NoDelay}; /// This function uses `native_tls` to do TLS. If you want to use other TLS libraries, /// use `client` instead. There is no need to enable the "tls" feature if you don't call /// `connect` since it's the only function that uses native_tls. -pub fn connect_with_config( +pub fn connect_with_config( request: Req, - config: Option, -) -> Result<(WebSocket, Response)> { + config: Option>, +) -> Result<(WebSocket, Response)> +where + Req: IntoClientRequest, + Ext: WebSocketExtension, +{ let request: Request = request.into_client_request()?; let uri = request.uri(); let mode = uri_mode(uri)?; @@ -122,7 +128,9 @@ pub fn connect_with_config( /// This function uses `native_tls` to do TLS. If you want to use other TLS libraries, /// use `client` instead. There is no need to enable the "tls" feature if you don't call /// `connect` since it's the only function that uses native_tls. -pub fn connect(request: Req) -> Result<(WebSocket, Response)> { +pub fn connect( + request: Req, +) -> Result<(WebSocket, Response)> { connect_with_config(request, None) } @@ -159,14 +167,15 @@ pub fn uri_mode(uri: &Uri) -> Result { /// Use this function if you need a nonblocking handshake support or if you /// want to use a custom stream like `mio::tcp::TcpStream` or `openssl::ssl::SslStream`. /// Any stream supporting `Read + Write` will do. -pub fn client_with_config( +pub fn client_with_config( request: Req, stream: Stream, - config: Option, -) -> StdResult<(WebSocket, Response), HandshakeError>> + config: Option>, +) -> StdResult<(WebSocket, Response), HandshakeError>> where Stream: Read + Write, Req: IntoClientRequest, + Ext: WebSocketExtension, { ClientHandshake::start(stream, request.into_client_request()?, config)?.handshake() } @@ -179,7 +188,10 @@ where pub fn client( request: Req, stream: Stream, -) -> StdResult<(WebSocket, Response), HandshakeError>> +) -> StdResult< + (WebSocket, Response), + HandshakeError>, +> where Stream: Read + Write, Req: IntoClientRequest, diff --git a/src/error.rs b/src/error.rs index ab24753..547a931 100644 --- a/src/error.rs +++ b/src/error.rs @@ -67,6 +67,8 @@ pub enum Error { Http(http::StatusCode), /// HTTP format error. HttpFormat(http::Error), + /// An error from a WebSocket extension. + ExtensionError(Cow<'static, str>), } impl fmt::Display for Error { @@ -84,6 +86,7 @@ impl fmt::Display for Error { Error::Url(ref msg) => write!(f, "URL error: {}", msg), Error::Http(code) => write!(f, "HTTP error: {}", code), Error::HttpFormat(ref err) => write!(f, "HTTP format error: {}", err), + Error::ExtensionError(ref e) => write!(f, "Extension error: {}", e), } } } diff --git a/src/extensions/deflate.rs b/src/extensions/deflate.rs new file mode 100644 index 0000000..82caf36 --- /dev/null +++ b/src/extensions/deflate.rs @@ -0,0 +1,922 @@ +//! Permessage-deflate extension + +use std::fmt::{Display, Formatter}; + +use crate::extensions::uncompressed::UncompressedExt; +use crate::extensions::WebSocketExtension; +use crate::protocol::frame::coding::{Data, OpCode}; +use crate::protocol::frame::Frame; +use crate::protocol::MAX_MESSAGE_SIZE; +use crate::Message; +use bytes::BufMut; +use flate2::{ + Compress, CompressError, Compression, Decompress, DecompressError, FlushCompress, + FlushDecompress, Status, +}; +use http::header::{InvalidHeaderValue, SEC_WEBSOCKET_EXTENSIONS}; +use http::{HeaderValue, Request, Response}; +use std::borrow::Cow; +use std::mem::replace; +use std::slice; + +/// The WebSocket Extension Identifier as per the IANA registry. +const EXT_IDENT: &str = "permessage-deflate"; + +/// The minimum size of the LZ77 sliding window size. +const LZ77_MIN_WINDOW_SIZE: u8 = 8; + +/// The maximum size of the LZ77 sliding window size. Absence of the `max_window_bits` parameter +/// indicates that the client can receive messages compressed using an LZ77 sliding window of up to +/// 32,768 bytes. RFC 7692 7.1.2.1. +const LZ77_MAX_WINDOW_SIZE: u8 = 15; + +/// A permessage-deflate configuration. +#[derive(Clone, Copy, Debug)] +pub struct DeflateConfig { + /// The maximum size of a message. The default value is 64 MiB which should be reasonably big + /// for all normal use-cases but small enough to prevent memory eating by a malicious user. + max_message_size: usize, + /// The LZ77 sliding window size. Negotiated during the HTTP upgrade. In client mode, this + /// conforms to RFC 7692 7.1.2.1. In server mode, this conforms to RFC 7692 7.1.2.2. Must be in + /// range 8..15 inclusive. + max_window_bits: u8, + /// Request that the server resets the LZ77 sliding window between messages - RFC 7692 7.1.1.1. + request_no_context_takeover: bool, + /// Whether to accept `no_context_takeover`. + accept_no_context_takeover: bool, + // Whether the compressor should be reset after usage. + compress_reset: bool, + // Whether the decompressor should be reset after usage. + decompress_reset: bool, + /// The active compression level. The integer here is typically on a scale of 0-9 where 0 means + /// "no compression" and 9 means "take as long as you'd like". + compression_level: Compression, +} + +impl DeflateConfig { + /// Builds a new `DeflateConfig` using the `compression_level` and the defaults for all other + /// members. + pub fn with_compression_level(compression_level: Compression) -> DeflateConfig { + DeflateConfig { + compression_level, + ..Default::default() + } + } + + /// Returns the maximum message size permitted. + pub fn max_message_size(&self) -> usize { + self.max_message_size + } + + /// Returns the maximum LZ77 window size permitted. + pub fn max_window_bits(&self) -> u8 { + self.max_window_bits + } + + /// Returns whether `no_context_takeover` has been requested. + pub fn request_no_context_takeover(&self) -> bool { + self.request_no_context_takeover + } + + /// Returns whether this WebSocket will accept `no_context_takeover`. + pub fn accept_no_context_takeover(&self) -> bool { + self.accept_no_context_takeover + } + + /// Returns whether or not the inner compressor is set to reset after completing a message. + pub fn compress_reset(&self) -> bool { + self.compress_reset + } + + /// Returns whether or not the inner decompressor is set to reset after completing a message. + pub fn decompress_reset(&self) -> bool { + self.decompress_reset + } + + /// Returns the active compression level. + pub fn compression_level(&self) -> Compression { + self.compression_level + } + + /// Sets the maximum message size permitted. + pub fn set_max_message_size(&mut self, max_message_size: Option) { + self.max_message_size = max_message_size.unwrap_or_else(usize::max_value); + } + + /// Sets the LZ77 sliding window size. + pub fn set_max_window_bits(&mut self, max_window_bits: u8) { + assert!((LZ77_MIN_WINDOW_SIZE..=LZ77_MAX_WINDOW_SIZE).contains(&max_window_bits)); + self.max_window_bits = max_window_bits; + } + + /// Sets the WebSocket to request `no_context_takeover` if `true`. + pub fn set_request_no_context_takeover(&mut self, request_no_context_takeover: bool) { + self.request_no_context_takeover = request_no_context_takeover; + } + + /// Sets the WebSocket to accept `no_context_takeover` if `true`. + pub fn set_accept_no_context_takeover(&mut self, accept_no_context_takeover: bool) { + self.accept_no_context_takeover = accept_no_context_takeover; + } +} + +impl Default for DeflateConfig { + fn default() -> Self { + DeflateConfig { + max_message_size: MAX_MESSAGE_SIZE, + max_window_bits: LZ77_MAX_WINDOW_SIZE, + request_no_context_takeover: false, + accept_no_context_takeover: true, + compress_reset: false, + decompress_reset: false, + compression_level: Compression::best(), + } + } +} + +/// A `DeflateConfig` builder. +#[derive(Debug, Copy, Clone)] +pub struct DeflateConfigBuilder { + max_message_size: Option, + max_window_bits: u8, + request_no_context_takeover: bool, + accept_no_context_takeover: bool, + fragments_grow: bool, + compression_level: Compression, +} + +impl Default for DeflateConfigBuilder { + fn default() -> Self { + DeflateConfigBuilder { + max_message_size: Some(MAX_MESSAGE_SIZE), + max_window_bits: LZ77_MAX_WINDOW_SIZE, + request_no_context_takeover: false, + accept_no_context_takeover: true, + fragments_grow: true, + compression_level: Compression::fast(), + } + } +} + +impl DeflateConfigBuilder { + /// Sets the maximum message size permitted. + pub fn max_message_size(mut self, max_message_size: Option) -> DeflateConfigBuilder { + self.max_message_size = max_message_size; + self + } + + /// Sets the LZ77 sliding window size. Panics if the provided size is not in `8..=15`. + pub fn max_window_bits(mut self, max_window_bits: u8) -> DeflateConfigBuilder { + assert!( + (LZ77_MIN_WINDOW_SIZE..=LZ77_MAX_WINDOW_SIZE).contains(&max_window_bits), + "max window bits must be in range 8..=15" + ); + self.max_window_bits = max_window_bits; + self + } + + /// Sets the WebSocket to request `no_context_takeover`. + pub fn request_no_context_takeover( + mut self, + request_no_context_takeover: bool, + ) -> DeflateConfigBuilder { + self.request_no_context_takeover = request_no_context_takeover; + self + } + + /// Sets the WebSocket to accept `no_context_takeover`. + pub fn accept_no_context_takeover( + mut self, + accept_no_context_takeover: bool, + ) -> DeflateConfigBuilder { + self.accept_no_context_takeover = accept_no_context_takeover; + self + } + + /// Consumes the builder and produces a `DeflateConfig.` + pub fn build(self) -> DeflateConfig { + DeflateConfig { + max_message_size: self.max_message_size.unwrap_or_else(usize::max_value), + max_window_bits: self.max_window_bits, + request_no_context_takeover: self.request_no_context_takeover, + accept_no_context_takeover: self.accept_no_context_takeover, + compression_level: self.compression_level, + ..Default::default() + } + } +} + +/// A permessage-deflate encoding WebSocket extension. +#[derive(Debug)] +pub struct DeflateExt { + /// Defines whether the extension is enabled. Following a successful handshake, this will be + /// `true`. + enabled: bool, + /// The configuration for the extension. + config: DeflateConfig, + /// A stack of continuation frames awaiting `fin` and the total size of all of the fragments. + fragment_buffer: FragmentBuffer, + /// The deflate decompressor. + inflator: Inflator, + /// The deflate compressor. + deflator: Deflator, + /// If this deflate extension is not used, messages will be forwarded to this extension. + uncompressed_extension: UncompressedExt, +} + +impl DeflateExt { + /// Creates a `DeflateExt` instance using the provided configuration. + pub fn new(config: DeflateConfig) -> DeflateExt { + DeflateExt { + enabled: false, + config, + fragment_buffer: FragmentBuffer::new(config.max_message_size), + inflator: Inflator::new(), + deflator: Deflator::new(Compression::fast()), + uncompressed_extension: UncompressedExt::new(Some(config.max_message_size())), + } + } + + fn parse_window_parameter<'a>( + &mut self, + mut param_iter: impl Iterator, + ) -> Result, String> { + if let Some(window_bits_str) = param_iter.next() { + match window_bits_str.trim().parse() { + Ok(window_bits) => { + if window_bits >= LZ77_MIN_WINDOW_SIZE && window_bits <= LZ77_MAX_WINDOW_SIZE { + if window_bits != self.config.max_window_bits() { + self.config.max_window_bits = window_bits; + Ok(Some(window_bits)) + } else { + Ok(None) + } + } else { + Err(format!("Invalid window parameter: {}", window_bits)) + } + } + Err(e) => Err(e.to_string()), + } + } else { + Ok(None) + } + } + + fn decline(&mut self, res: &mut Response) { + self.enabled = false; + res.headers_mut().remove(EXT_IDENT); + } +} + +/// A permessage-deflate extension error. +#[derive(Debug, Clone)] +pub enum DeflateExtensionError { + /// An error produced when deflating a message. + DeflateError(String), + /// An error produced when inflating a message. + InflateError(String), + /// An error produced during the WebSocket negotiation. + NegotiationError(String), + /// Produced when fragment buffer grew beyond the maximum configured size. + Capacity(Cow<'static, str>), +} + +impl Display for DeflateExtensionError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + DeflateExtensionError::DeflateError(m) => { + write!(f, "An error was produced during decompression: {}", m) + } + DeflateExtensionError::InflateError(m) => { + write!(f, "An error was produced during compression: {}", m) + } + DeflateExtensionError::NegotiationError(m) => { + write!(f, "An upgrade error was encountered: {}", m) + } + DeflateExtensionError::Capacity(ref msg) => write!(f, "Space limit exceeded: {}", msg), + } + } +} + +impl std::error::Error for DeflateExtensionError {} + +impl From for crate::Error { + fn from(e: DeflateExtensionError) -> Self { + crate::Error::ExtensionError(Cow::from(e.to_string())) + } +} + +impl From for DeflateExtensionError { + fn from(e: InvalidHeaderValue) -> Self { + DeflateExtensionError::NegotiationError(e.to_string()) + } +} + +impl Default for DeflateExt { + fn default() -> Self { + DeflateExt::new(Default::default()) + } +} + +impl WebSocketExtension for DeflateExt { + type Error = DeflateExtensionError; + + fn new(max_message_size: Option) -> Self { + DeflateExt::new(DeflateConfig { + max_message_size: max_message_size.unwrap_or_else(usize::max_value), + ..Default::default() + }) + } + + fn enabled(&self) -> bool { + self.enabled + } + + fn on_make_request(&mut self, mut request: Request) -> Request { + let mut header_value = String::from(EXT_IDENT); + let DeflateConfig { + max_window_bits, + request_no_context_takeover, + .. + } = self.config; + + if max_window_bits < LZ77_MAX_WINDOW_SIZE { + header_value.push_str(&format!( + "; client_max_window_bits={}; server_max_window_bits={}", + max_window_bits, max_window_bits + )) + } else { + header_value.push_str("; client_max_window_bits") + } + + if request_no_context_takeover { + header_value.push_str("; server_no_context_takeover") + } + + request.headers_mut().append( + SEC_WEBSOCKET_EXTENSIONS, + HeaderValue::from_str(&header_value).unwrap(), + ); + + request + } + + fn on_receive_request( + &mut self, + request: &Request, + response: &mut Response, + ) -> Result<(), Self::Error> { + for header in request.headers().get_all(SEC_WEBSOCKET_EXTENSIONS) { + return match header.to_str() { + Ok(header) => { + let mut response_str = String::with_capacity(header.len()); + let mut server_takeover = false; + let mut client_takeover = false; + let mut server_max_bits = false; + let mut client_max_bits = false; + + for param in header.split(';') { + match param.trim().to_lowercase().as_str() { + "permessage-deflate" => response_str.push_str("permessage-deflate"), + "server_no_context_takeover" => { + if server_takeover { + self.decline(response); + } else { + server_takeover = true; + if self.config.accept_no_context_takeover() { + self.config.compress_reset = true; + response_str.push_str("; server_no_context_takeover"); + } + } + } + "client_no_context_takeover" => { + if client_takeover { + self.decline(response); + } else { + client_takeover = true; + self.config.decompress_reset = true; + response_str.push_str("; client_no_context_takeover"); + } + } + param if param.starts_with("server_max_window_bits") => { + if server_max_bits { + self.decline(response); + } else { + server_max_bits = true; + + match self.parse_window_parameter(param.split('=').skip(1)) { + Ok(Some(bits)) => { + self.deflator = Deflator::new_with_window_bits( + self.config.compression_level, + bits, + ); + response_str.push_str("; "); + response_str.push_str(param) + } + Ok(None) => {} + Err(_) => { + self.decline(response); + } + } + } + } + param if param.starts_with("client_max_window_bits") => { + if client_max_bits { + self.decline(response); + } else { + client_max_bits = true; + + match self.parse_window_parameter(param.split('=').skip(1)) { + Ok(Some(bits)) => { + self.inflator = Inflator::new_with_window_bits(bits); + + response_str.push_str("; "); + response_str.push_str(param); + continue; + } + Ok(None) => {} + Err(_) => { + self.decline(response); + } + } + + response_str.push_str("; "); + response_str.push_str(&format!( + "client_max_window_bits={}", + self.config.max_window_bits() + )) + } + } + _ => { + self.decline(response); + } + } + } + + if !response_str.contains("client_no_context_takeover") + && self.config.request_no_context_takeover() + { + self.config.decompress_reset = true; + response_str.push_str("; client_no_context_takeover"); + } + + if !response_str.contains("server_max_window_bits") { + response_str.push_str("; "); + response_str.push_str(&format!( + "server_max_window_bits={}", + self.config.max_window_bits() + )) + } + + if !response_str.contains("client_max_window_bits") + && self.config.max_window_bits() < LZ77_MAX_WINDOW_SIZE + { + continue; + } + + response.headers_mut().insert( + SEC_WEBSOCKET_EXTENSIONS, + HeaderValue::from_str(&response_str)?, + ); + + self.enabled = true; + + Ok(()) + } + Err(e) => { + self.enabled = false; + Err(DeflateExtensionError::NegotiationError(format!( + "Failed to parse request header: {}", + e, + ))) + } + }; + } + + self.decline(response); + Ok(()) + } + + fn on_response(&mut self, response: &Response) -> Result<(), Self::Error> { + let mut extension_name = false; + let mut server_takeover = false; + let mut client_takeover = false; + let mut server_max_window_bits = false; + let mut client_max_window_bits = false; + + for header in response.headers().get_all(SEC_WEBSOCKET_EXTENSIONS).iter() { + match header.to_str() { + Ok(header) => { + for param in header.split(';') { + match param.trim().to_lowercase().as_str() { + "permessage-deflate" => { + if extension_name { + return Err(DeflateExtensionError::NegotiationError(format!( + "Duplicate extension parameter: permessage-deflate" + ))); + } else { + self.enabled = true; + extension_name = true; + } + } + "server_no_context_takeover" => { + if server_takeover { + return Err(DeflateExtensionError::NegotiationError(format!( + "Duplicate extension parameter: server_no_context_takeover" + ))); + } else { + server_takeover = true; + self.config.decompress_reset = true; + } + } + "client_no_context_takeover" => { + if client_takeover { + return Err(DeflateExtensionError::NegotiationError(format!( + "Duplicate extension parameter: client_no_context_takeover" + ))); + } else { + client_takeover = true; + + if self.config.accept_no_context_takeover() { + self.config.compress_reset = true; + } else { + return Err(DeflateExtensionError::NegotiationError( + format!("The client requires context takeover."), + )); + } + } + } + param if param.starts_with("server_max_window_bits") => { + if server_max_window_bits { + return Err(DeflateExtensionError::NegotiationError(format!( + "Duplicate extension parameter: server_max_window_bits" + ))); + } else { + server_max_window_bits = true; + + match self.parse_window_parameter(param.split("=").skip(1)) { + Ok(Some(bits)) => { + self.inflator = Inflator::new_with_window_bits(bits); + } + Ok(None) => {} + Err(e) => { + return Err(DeflateExtensionError::NegotiationError( + format!( + "server_max_window_bits parameter error: {}", + e + ), + )) + } + } + } + } + param if param.starts_with("client_max_window_bits") => { + if client_max_window_bits { + return Err(DeflateExtensionError::NegotiationError(format!( + "Duplicate extension parameter: client_max_window_bits" + ))); + } else { + client_max_window_bits = true; + + match self.parse_window_parameter(param.split("=").skip(1)) { + Ok(Some(bits)) => { + self.deflator = Deflator::new_with_window_bits( + self.config.compression_level, + bits, + ); + } + Ok(None) => {} + Err(e) => { + return Err(DeflateExtensionError::NegotiationError( + format!( + "client_max_window_bits parameter error: {}", + e + ), + )) + } + } + } + } + p => { + return Err(DeflateExtensionError::NegotiationError(format!( + "Unknown permessage-deflate parameter: {}", + p + ))); + } + } + } + } + Err(e) => { + self.enabled = false; + return Err(DeflateExtensionError::NegotiationError(format!( + "Failed to parse extension parameter: {}", + e + ))); + } + } + } + + Ok(()) + } + + fn on_send_frame(&mut self, mut frame: Frame) -> Result { + if self.enabled { + if let OpCode::Data(_) = frame.header().opcode { + let mut compressed = Vec::with_capacity(frame.payload().len()); + self.deflator.compress(frame.payload(), &mut compressed)?; + + let len = compressed.len(); + compressed.truncate(len - 4); + + *frame.payload_mut() = compressed; + frame.header_mut().rsv1 = true; + + if self.config.compress_reset() { + self.deflator.reset(); + } + } + } + + Ok(frame) + } + + fn on_receive_frame(&mut self, frame: Frame) -> Result, Self::Error> { + let r = if self.enabled && (!self.fragment_buffer.is_empty() || frame.header().rsv1) { + if !frame.header().is_final { + self.fragment_buffer + .try_push_frame(frame) + .map_err(|s| DeflateExtensionError::Capacity(s.into()))?; + Ok(None) + } else { + let mut compressed = if self.fragment_buffer.is_empty() { + Vec::with_capacity(frame.payload().len()) + } else { + Vec::with_capacity(self.fragment_buffer.len() + frame.payload().len()) + }; + + let mut decompressed = Vec::with_capacity(frame.payload().len() * 2); + + let opcode = match frame.header().opcode { + OpCode::Data(Data::Continue) => { + self.fragment_buffer + .try_push_frame(frame) + .map_err(|s| DeflateExtensionError::Capacity(s.into()))?; + + let opcode = self.fragment_buffer.first().unwrap().header().opcode; + + self.fragment_buffer.reset().into_iter().for_each(|f| { + compressed.extend(f.into_data()); + }); + + opcode + } + _ => { + compressed.put_slice(frame.payload()); + frame.header().opcode + } + }; + + compressed.extend(&[0, 0, 255, 255]); + + self.inflator.decompress(&compressed, &mut decompressed)?; + + if self.config.decompress_reset() { + self.inflator.reset(false); + } + + self.uncompressed_extension.on_receive_frame(Frame::message( + decompressed, + opcode, + true, + )) + } + } else { + self.uncompressed_extension.on_receive_frame(frame) + }; + + match r { + Ok(msg) => Ok(msg), + Err(e) => Err(DeflateExtensionError::DeflateError(e.to_string())), + } + } +} + +impl From for DeflateExtensionError { + fn from(e: DecompressError) -> Self { + DeflateExtensionError::InflateError(e.to_string()) + } +} + +impl From for DeflateExtensionError { + fn from(e: CompressError) -> Self { + DeflateExtensionError::DeflateError(e.to_string()) + } +} + +#[derive(Debug)] +struct Deflator { + compress: Compress, +} + +impl Deflator { + fn new(compresion: Compression) -> Deflator { + Deflator { + compress: Compress::new(compresion, false), + } + } + + fn new_with_window_bits(compression: Compression, mut window_size: u8) -> Deflator { + // https://github.com/madler/zlib/blob/cacf7f1d4e3d44d871b605da3b647f07d718623f/deflate.c#L303 + if window_size == 8 { + window_size = 9; + } + + Deflator { + compress: Compress::new_with_window_bits(compression, false, window_size), + } + } + + fn reset(&mut self) { + self.compress.reset() + } + + fn compress(&mut self, input: &[u8], output: &mut Vec) -> Result<(), CompressError> { + let mut read_buff = Vec::from(input); + let mut output_size; + + loop { + output_size = output.len(); + + if output_size == output.capacity() { + output.reserve(input.len()); + } + + let before_out = self.compress.total_out(); + let before_in = self.compress.total_in(); + + let out_slice = unsafe { + slice::from_raw_parts_mut( + output.as_mut_ptr().offset(output_size as isize), + output.capacity() - output_size, + ) + }; + + let status = self + .compress + .compress(&read_buff, out_slice, FlushCompress::Sync)?; + + let consumed = (self.compress.total_in() - before_in) as usize; + read_buff = read_buff.split_off(consumed); + + unsafe { + output.set_len((self.compress.total_out() - before_out) as usize + output_size); + } + + match status { + Status::Ok | Status::BufError => { + if before_out == self.compress.total_out() && read_buff.is_empty() { + return Ok(()); + } + } + s => panic!("Compression error: {:?}", s), + } + } + } +} + +#[derive(Debug)] +struct Inflator { + decompress: Decompress, +} + +impl Inflator { + fn new() -> Inflator { + Inflator { + decompress: Decompress::new(false), + } + } + + fn new_with_window_bits(mut window_size: u8) -> Inflator { + // https://github.com/madler/zlib/blob/cacf7f1d4e3d44d871b605da3b647f07d718623f/deflate.c#L303 + if window_size == 8 { + window_size = 9; + } + + Inflator { + decompress: Decompress::new_with_window_bits(false, window_size), + } + } + + fn reset(&mut self, zlib_header: bool) { + self.decompress.reset(zlib_header) + } + + fn decompress(&mut self, input: &[u8], output: &mut Vec) -> Result<(), DecompressError> { + let mut read_buff = Vec::from(input); + let mut output_size; + + loop { + output_size = output.len(); + + if output_size == output.capacity() { + output.reserve(input.len()); + } + + let before_out = self.decompress.total_out(); + let before_in = self.decompress.total_in(); + + let out_slice = unsafe { + slice::from_raw_parts_mut( + output.as_mut_ptr().offset(output_size as isize), + output.capacity() - output_size, + ) + }; + + let status = + self.decompress + .decompress(&read_buff, out_slice, FlushDecompress::Sync)?; + + let consumed = (self.decompress.total_in() - before_in) as usize; + read_buff = read_buff.split_off(consumed); + + unsafe { + output.set_len((self.decompress.total_out() - before_out) as usize + output_size); + } + + match status { + Status::Ok | Status::BufError => { + if before_out == self.decompress.total_out() && read_buff.is_empty() { + return Ok(()); + } + } + s => panic!("Decompression error: {:?}", s), + } + } + } +} + +/// A buffer for holding continuation frames. Ensures that the total length of all of the frame's +/// payloads does not exceed `max_len`. +/// +/// Defaults to an initial capacity of ten frames. +#[derive(Debug)] +struct FragmentBuffer { + fragments: Vec, + fragments_len: usize, + max_len: usize, +} + +impl FragmentBuffer { + /// Creates a new fragment buffer that will permit a maximum length of `max_len`. + fn new(max_len: usize) -> FragmentBuffer { + FragmentBuffer { + fragments: Vec::with_capacity(10), + fragments_len: 0, + max_len, + } + } + + /// Attempts to push a frame into the buffer. This will fail if the new length of the buffer's + /// frames exceeds the maximum capacity of `max_len`. + fn try_push_frame(&mut self, frame: Frame) -> Result<(), String> { + let FragmentBuffer { + fragments, + fragments_len, + max_len, + } = self; + + *fragments_len += frame.payload().len(); + + if *fragments_len > *max_len || frame.len() > *max_len - *fragments_len { + return Err(format!( + "Message too big: {} + {} > {}", + fragments_len, fragments_len, max_len + ) + .into()); + } else { + fragments.push(frame); + Ok(()) + } + } + + /// Returns the total length of all of the frames that have been pushed into the buffer. + fn len(&self) -> usize { + self.fragments_len + } + + /// Returns whether the buffer is empty. + fn is_empty(&self) -> bool { + self.fragments.is_empty() + } + + /// Returns the first element of the fragments slice, or `None` if it is empty. + fn first(&self) -> Option<&Frame> { + self.fragments.first() + } + + /// Drains the buffer and resets it to an initial capacity of 10 elements. + fn reset(&mut self) -> Vec { + self.fragments_len = 0; + replace(&mut self.fragments, Vec::with_capacity(10)) + } +} diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs new file mode 100644 index 0000000..6a9cee1 --- /dev/null +++ b/src/extensions/mod.rs @@ -0,0 +1,56 @@ +//! WebSocket extensions + +use http::{Request, Response}; + +use crate::protocol::frame::Frame; +use crate::Message; + +/// A permessage-deflate WebSocket extension (RFC 7692). +#[cfg(feature = "deflate")] +pub mod deflate; +/// An uncompressed message handler for a WebSocket. +pub mod uncompressed; + +/// A trait for defining WebSocket extensions for both WebSocket clients and servers. Extensions +/// may be stacked by nesting them inside one another. +pub trait WebSocketExtension { + /// An error type that the extension produces. + type Error: Into; + + /// Constructs a new WebSocket extension that will permit messages of the provided size. + fn new(max_message_size: Option) -> Self; + + /// Returns whether or not the extension is enabled. + fn enabled(&self) -> bool { + false + } + + /// For WebSocket clients, this will be called when a `Request` is being constructed. + fn on_make_request(&mut self, request: Request) -> Request { + request + } + + /// For WebSocket server, this will be called when a `Request` has been received. + fn on_receive_request( + &mut self, + _request: &Request, + _response: &mut Response, + ) -> Result<(), Self::Error> { + Ok(()) + } + + /// For WebSocket clients, this will be called when a response from the server has been + /// received. If an error is produced, then subsequent calls to `rsv1()` should return `false`. + fn on_response(&mut self, _response: &Response) -> Result<(), Self::Error> { + Ok(()) + } + + /// Called when a frame is about to be sent. + fn on_send_frame(&mut self, frame: Frame) -> Result { + Ok(frame) + } + + /// Called when a frame has been received and unmasked. The frame provided frame will be of the + /// type `OpCode::Data`. + fn on_receive_frame(&mut self, frame: Frame) -> Result, Self::Error>; +} diff --git a/src/extensions/uncompressed.rs b/src/extensions/uncompressed.rs new file mode 100644 index 0000000..b16fb49 --- /dev/null +++ b/src/extensions/uncompressed.rs @@ -0,0 +1,104 @@ +use crate::extensions::WebSocketExtension; +use crate::protocol::frame::coding::{Data, OpCode}; +use crate::protocol::frame::Frame; +use crate::protocol::message::{IncompleteMessage, IncompleteMessageType}; +use crate::{Error, Message}; +use crate::protocol::MAX_MESSAGE_SIZE; + +/// An uncompressed message handler for a WebSocket. +#[derive(Debug)] +pub struct UncompressedExt { + incomplete: Option, + max_message_size: Option, +} + +impl Default for UncompressedExt { + fn default() -> Self { + UncompressedExt { + incomplete: None, + max_message_size: Some(MAX_MESSAGE_SIZE) + } + } +} + +impl UncompressedExt { + /// Builds a new `UncompressedExt` that will permit a maximum message size of `max_message_size` + /// or will be unbounded if `None`. + pub fn new(max_message_size: Option) -> UncompressedExt { + UncompressedExt { + incomplete: None, + max_message_size, + } + } +} + +impl WebSocketExtension for UncompressedExt { + type Error = Error; + + fn new(max_message_size: Option) -> Self { + UncompressedExt { + incomplete: None, + max_message_size, + } + } + + fn enabled(&self) -> bool { + true + } + + fn on_receive_frame(&mut self, frame: Frame) -> Result, Self::Error> { + let fin = frame.header().is_final; + + let hdr = frame.header(); + + if hdr.rsv1 || hdr.rsv2 || hdr.rsv3 { + return Err(Error::Protocol( + "Reserved bits are non-zero and no WebSocket extensions are enabled".into(), + )); + } + + match frame.header().opcode { + OpCode::Data(data) => match data { + Data::Continue => { + if let Some(ref mut msg) = self.incomplete { + msg.extend(frame.into_data(), self.max_message_size)?; + } else { + return Err(Error::Protocol( + "Continue frame but nothing to continue".into(), + )); + } + if fin { + Ok(Some(self.incomplete.take().unwrap().complete()?)) + } else { + Ok(None) + } + } + c if self.incomplete.is_some() => Err(Error::Protocol( + format!("Received {} while waiting for more fragments", c).into(), + )), + Data::Text | Data::Binary => { + let msg = { + let message_type = match data { + Data::Text => IncompleteMessageType::Text, + Data::Binary => IncompleteMessageType::Binary, + _ => panic!("Bug: message is not text nor binary"), + }; + let mut m = IncompleteMessage::new(message_type); + m.extend(frame.into_data(), self.max_message_size)?; + m + }; + if fin { + Ok(Some(msg.complete()?)) + } else { + self.incomplete = Some(msg); + Ok(None) + } + } + Data::Reserved(i) => Err(Error::Protocol( + format!("Unknown data frame type {}", i).into(), + )), + }, + _ => unreachable!(), + } + } +} diff --git a/src/handshake/client.rs b/src/handshake/client.rs index 745da90..d8c84d7 100644 --- a/src/handshake/client.rs +++ b/src/handshake/client.rs @@ -11,6 +11,7 @@ use super::headers::{FromHttparse, MAX_HEADERS}; use super::machine::{HandshakeMachine, StageResult, TryParse}; use super::{convert_key, HandshakeRole, MidHandshake, ProcessingResult}; use crate::error::{Error, Result}; +use crate::extensions::WebSocketExtension; use crate::protocol::{Role, WebSocket, WebSocketConfig}; /// Client request type. @@ -21,18 +22,25 @@ pub type Response = HttpResponse<()>; /// Client handshake role. #[derive(Debug)] -pub struct ClientHandshake { +pub struct ClientHandshake +where + Extension: WebSocketExtension, +{ verify_data: VerifyData, - config: Option, + config: Option>>, _marker: PhantomData, } -impl ClientHandshake { +impl ClientHandshake +where + Stream: Read + Write, + Ext: WebSocketExtension, +{ /// Initiate a client handshake. pub fn start( - stream: S, + stream: Stream, request: Request, - config: Option, + mut config: Option>, ) -> Result> { if request.method() != http::Method::GET { return Err(Error::Protocol( @@ -52,7 +60,7 @@ impl ClientHandshake { let key = generate_key(); let machine = { - let req = generate_request(request, &key)?; + let req = generate_request(request, &key, &mut config)?; HandshakeMachine::start_write(stream, req) }; @@ -60,7 +68,7 @@ impl ClientHandshake { let accept_key = convert_key(key.as_ref()).unwrap(); ClientHandshake { verify_data: VerifyData { accept_key }, - config, + config: Some(config), _marker: PhantomData, } }; @@ -73,10 +81,15 @@ impl ClientHandshake { } } -impl HandshakeRole for ClientHandshake { +impl HandshakeRole for ClientHandshake +where + Stream: Read + Write, + Ext: WebSocketExtension, +{ type IncomingData = Response; - type InternalStream = S; - type FinalResult = (WebSocket, Response); + type InternalStream = Stream; + type FinalResult = (WebSocket, Response); + fn stage_finished( &mut self, finish: StageResult, @@ -90,10 +103,11 @@ impl HandshakeRole for ClientHandshake { result, tail, } => { - self.verify_data.verify_response(&result)?; + let mut config = self.config.take().unwrap(); + + self.verify_data.verify_response(&result, &mut config)?; debug!("Client handshake done."); - let websocket = - WebSocket::from_partially_read(stream, tail, Role::Client, self.config); + let websocket = WebSocket::from_partially_read(stream, tail, Role::Client, config); ProcessingResult::Done((websocket, result)) } }) @@ -101,20 +115,33 @@ impl HandshakeRole for ClientHandshake { } /// Generate client request. -fn generate_request(request: Request, key: &str) -> Result> { +fn generate_request( + request: Request, + key: &str, + config: &mut Option>, +) -> Result> +where + Ext: WebSocketExtension, +{ + let request = match config { + Some(ref mut config) => config.encoder.on_make_request(request), + None => request, + }; let mut req = Vec::new(); let uri = request.uri(); - let authority = uri.authority() + let authority = uri + .authority() .ok_or_else(|| Error::Url("No host name in the URL".into()))? .as_str(); - let host = if let Some(idx) = authority.find('@') { // handle possible name:password@ + let host = if let Some(idx) = authority.find('@') { + // handle possible name:password@ authority.split_at(idx + 1).1 } else { authority }; if authority.is_empty() { - return Err(Error::Url("URL contains empty host name".into())) + return Err(Error::Url("URL contains empty host name".into())); } write!( @@ -138,7 +165,7 @@ fn generate_request(request: Request, key: &str) -> Result> { for (k, v) in request.headers() { let mut k = k.as_str(); - if k == "sec-websocket-protocol" { + if k == "sec-websocket-protocol" { k = "Sec-WebSocket-Protocol"; } writeln!(req, "{}: {}\r", k, v.to_str()?).unwrap(); @@ -156,7 +183,14 @@ struct VerifyData { } impl VerifyData { - pub fn verify_response(&self, response: &Response) -> Result<()> { + pub fn verify_response( + &self, + response: &Response, + config: &mut Option>, + ) -> Result<()> + where + Ext: WebSocketExtension, + { // 1. If the status code received from the server is not 101, the // client handles the response per HTTP [RFC2616] procedures. (RFC 6455) if response.status() != StatusCode::SWITCHING_PROTOCOLS { @@ -205,12 +239,18 @@ impl VerifyData { "Key mismatch in Sec-WebSocket-Accept".into(), )); } + // 5. If the response includes a |Sec-WebSocket-Extensions| header // field and this header field indicates the use of an extension // that was not present in the client's handshake (the server has // indicated an extension not requested by the client), the client // MUST _Fail the WebSocket Connection_. (RFC 6455) - // TODO + + if let Some(config) = config { + if let Err(e) = config.encoder.on_response(response) { + return Err(e.into()); + } + } // 6. If the response includes a |Sec-WebSocket-Protocol| header field // and this header field indicates the use of a subprotocol that was @@ -266,8 +306,9 @@ fn generate_key() -> String { #[cfg(test)] mod tests { use super::super::machine::TryParse; - use crate::client::IntoClientRequest; use super::{generate_key, generate_request, Response}; + use crate::client::IntoClientRequest; + use crate::extensions::uncompressed::UncompressedExt; #[test] fn random_keys() { @@ -297,14 +338,18 @@ mod tests { Sec-WebSocket-Version: 13\r\n\ Sec-WebSocket-Key: A70tsIbeMZUbJHh5BWFw6Q==\r\n\ \r\n"; - let request = generate_request(request, key).unwrap(); + let request = + generate_request::(request, key, &mut Some(Default::default())) + .unwrap(); println!("Request: {}", String::from_utf8_lossy(&request)); assert_eq!(&request[..], &correct[..]); } #[test] fn request_formatting_with_host() { - let request = "wss://localhost:9001/getCaseCount".into_client_request().unwrap(); + let request = "wss://localhost:9001/getCaseCount" + .into_client_request() + .unwrap(); let key = "A70tsIbeMZUbJHh5BWFw6Q=="; let correct = b"\ GET /getCaseCount HTTP/1.1\r\n\ @@ -314,14 +359,18 @@ mod tests { Sec-WebSocket-Version: 13\r\n\ Sec-WebSocket-Key: A70tsIbeMZUbJHh5BWFw6Q==\r\n\ \r\n"; - let request = generate_request(request, key).unwrap(); + let request = + generate_request::(request, key, &mut Some(Default::default())) + .unwrap(); println!("Request: {}", String::from_utf8_lossy(&request)); assert_eq!(&request[..], &correct[..]); } #[test] fn request_formatting_with_at() { - let request = "wss://user:pass@localhost:9001/getCaseCount".into_client_request().unwrap(); + let request = "wss://user:pass@localhost:9001/getCaseCount" + .into_client_request() + .unwrap(); let key = "A70tsIbeMZUbJHh5BWFw6Q=="; let correct = b"\ GET /getCaseCount HTTP/1.1\r\n\ @@ -331,7 +380,9 @@ mod tests { Sec-WebSocket-Version: 13\r\n\ Sec-WebSocket-Key: A70tsIbeMZUbJHh5BWFw6Q==\r\n\ \r\n"; - let request = generate_request(request, key).unwrap(); + let request = + generate_request::(request, key, &mut Some(Default::default())) + .unwrap(); println!("Request: {}", String::from_utf8_lossy(&request)); assert_eq!(&request[..], &correct[..]); } diff --git a/src/handshake/server.rs b/src/handshake/server.rs index 9412a6f..c04755a 100644 --- a/src/handshake/server.rs +++ b/src/handshake/server.rs @@ -12,6 +12,7 @@ use super::headers::{FromHttparse, MAX_HEADERS}; use super::machine::{HandshakeMachine, StageResult, TryParse}; use super::{convert_key, HandshakeRole, MidHandshake, ProcessingResult}; use crate::error::{Error, Result}; +use crate::extensions::WebSocketExtension; use crate::protocol::{Role, WebSocket, WebSocketConfig}; /// Server request type. @@ -39,7 +40,10 @@ pub fn create_response(request: &Request) -> Result { .headers() .get("Connection") .and_then(|h| h.to_str().ok()) - .map(|h| h.split(|c| c == ' ' || c == ',').any(|p| p.eq_ignore_ascii_case("Upgrade"))) + .map(|h| { + h.split(|c| c == ' ' || c == ',') + .any(|p| p.eq_ignore_ascii_case("Upgrade")) + }) .unwrap_or(false) { return Err(Error::Protocol( @@ -187,31 +191,43 @@ impl Callback for NoCallback { /// Server handshake role. #[allow(missing_copy_implementations)] #[derive(Debug)] -pub struct ServerHandshake { +pub struct ServerHandshake +where + Ext: WebSocketExtension, +{ /// Callback which is called whenever the server read the request from the client and is ready /// to reply to it. The callback returns an optional headers which will be added to the reply /// which the server sends to the user. callback: Option, /// WebSocket configuration. - config: Option, + config: Option>>, /// Error code/flag. If set, an error will be returned after sending response to the client. error_code: Option, /// Internal stream type. _marker: PhantomData, } -impl ServerHandshake { +impl ServerHandshake +where + S: Read + Write, + C: Callback, + Ext: WebSocketExtension, +{ /// Start server handshake. `callback` specifies a custom callback which the user can pass to /// the handshake, this callback will be called when the a websocket client connnects to the /// server, you can specify the callback if you want to add additional header to the client /// upon join based on the incoming headers. - pub fn start(stream: S, callback: C, config: Option) -> MidHandshake { + pub fn start( + stream: S, + callback: C, + config: Option>, + ) -> MidHandshake { trace!("Server handshake initiated."); MidHandshake { machine: HandshakeMachine::start_read(stream), role: ServerHandshake { callback: Some(callback), - config, + config: Some(config), error_code: None, _marker: PhantomData, }, @@ -219,10 +235,15 @@ impl ServerHandshake { } } -impl HandshakeRole for ServerHandshake { +impl HandshakeRole for ServerHandshake +where + S: Read + Write, + C: Callback, + Ext: WebSocketExtension, +{ type IncomingData = Request; type InternalStream = S; - type FinalResult = WebSocket; + type FinalResult = WebSocket; fn stage_finished( &mut self, @@ -231,16 +252,23 @@ impl HandshakeRole for ServerHandshake { Ok(match finish { StageResult::DoneReading { stream, - result, + result: request, tail, } => { if !tail.is_empty() { return Err(Error::Protocol("Junk after client request".into())); } - let response = create_response(&result)?; + let mut response = create_response(&request)?; + + if let Some(ref mut config) = self.config.as_mut().unwrap() { + if let Err(e) = config.encoder.on_receive_request(&request, &mut response) { + return Err(e.into()); + } + } + let callback_result = if let Some(callback) = self.callback.take() { - callback.on_request(&result, response) + callback.on_request(&request, response) } else { Ok(response) }; @@ -277,7 +305,11 @@ impl HandshakeRole for ServerHandshake { return Err(Error::Http(StatusCode::from_u16(err)?)); } else { debug!("Server handshake done."); - let websocket = WebSocket::from_raw_socket(stream, Role::Server, self.config); + let websocket = WebSocket::from_raw_socket( + stream, + Role::Server, + self.config.take().unwrap(), + ); ProcessingResult::Done(websocket) } } diff --git a/src/lib.rs b/src/lib.rs index f965478..36b947d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,8 @@ pub mod server; pub mod stream; pub mod util; +pub mod extensions; + pub use crate::client::{client, connect}; pub use crate::error::{Error, Result}; pub use crate::handshake::client::ClientHandshake; diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 97b376e..bb695e5 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -2,7 +2,7 @@ pub mod frame; -mod message; +pub(crate) mod message; pub use self::frame::CloseFrame; pub use self::message::Message; @@ -14,10 +14,14 @@ use std::mem::replace; use self::frame::coding::{CloseCode, Control as OpCtl, Data as OpData, OpCode}; use self::frame::{Frame, FrameCodec}; -use self::message::{IncompleteMessage, IncompleteMessageType}; +use self::message::IncompleteMessage; use crate::error::{Error, Result}; +use crate::extensions::uncompressed::UncompressedExt; +use crate::extensions::WebSocketExtension; use crate::util::NonBlockingResult; +pub(crate) const MAX_MESSAGE_SIZE: usize = 64 << 20; + /// Indicates a Client or Server role of the websocket #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Role { @@ -28,29 +32,48 @@ pub enum Role { } /// The configuration for WebSocket connection. -#[derive(Debug, Clone, Copy)] -pub struct WebSocketConfig { +#[derive(Debug, Copy, Clone)] +pub struct WebSocketConfig +where + E: WebSocketExtension, +{ /// The size of the send queue. You can use it to turn on/off the backpressure features. `None` /// means here that the size of the queue is unlimited. The default value is the unlimited /// queue. pub max_send_queue: Option, - /// The maximum size of a message. `None` means no size limit. The default value is 64 MiB - /// which should be reasonably big for all normal use-cases but small enough to prevent - /// memory eating by a malicious user. - pub max_message_size: Option, /// The maximum size of a single message frame. `None` means no size limit. The limit is for /// frame payload NOT including the frame header. The default value is 16 MiB which should /// be reasonably big for all normal use-cases but small enough to prevent memory eating /// by a malicious user. pub max_frame_size: Option, + /// Per-message compression strategy. + pub encoder: E, } -impl Default for WebSocketConfig { +impl Default for WebSocketConfig +where + E: WebSocketExtension, +{ fn default() -> Self { WebSocketConfig { max_send_queue: None, - max_message_size: Some(64 << 20), max_frame_size: Some(16 << 20), + encoder: E::new(Some(MAX_MESSAGE_SIZE)), + } + } +} + +impl WebSocketConfig +where + E: WebSocketExtension, +{ + /// Creates a `WebSocketConfig` instance using the default configuration and the provided + /// encoder for new connections. + pub fn default_with_encoder(encoder: E) -> WebSocketConfig { + WebSocketConfig { + max_send_queue: None, + max_frame_size: Some(16 << 20), + encoder, } } } @@ -60,20 +83,30 @@ impl Default for WebSocketConfig { /// This is THE structure you want to create to be able to speak the WebSocket protocol. /// It may be created by calling `connect`, `accept` or `client` functions. #[derive(Debug)] -pub struct WebSocket { +pub struct WebSocket +where + Ext: WebSocketExtension, +{ /// The underlying socket. socket: Stream, /// The context for managing a WebSocket. - context: WebSocketContext, + context: WebSocketContext, } -impl WebSocket { +impl WebSocket +where + Ext: WebSocketExtension, +{ /// Convert a raw socket into a WebSocket without performing a handshake. /// /// Call this function if you're using Tungstenite as a part of a web framework /// or together with an existing one. If you need an initial handshake, use /// `connect()` or `accept()` functions of the crate to construct a websocket. - pub fn from_raw_socket(stream: Stream, role: Role, config: Option) -> Self { + pub fn from_raw_socket( + stream: Stream, + role: Role, + config: Option>, + ) -> Self { WebSocket { socket: stream, context: WebSocketContext::new(role, config), @@ -89,7 +122,7 @@ impl WebSocket { stream: Stream, part: Vec, role: Role, - config: Option, + config: Option>, ) -> Self { WebSocket { socket: stream, @@ -101,18 +134,19 @@ impl WebSocket { pub fn get_ref(&self) -> &Stream { &self.socket } + /// Returns a mutable reference to the inner stream. pub fn get_mut(&mut self) -> &mut Stream { &mut self.socket } /// Change the configuration. - pub fn set_config(&mut self, set_func: impl FnOnce(&mut WebSocketConfig)) { + pub fn set_config(&mut self, set_func: impl FnOnce(&mut WebSocketConfig)) { self.context.set_config(set_func) } /// Read the configuration. - pub fn get_config(&self) -> &WebSocketConfig { + pub fn get_config(&self) -> &WebSocketConfig { self.context.get_config() } @@ -132,7 +166,11 @@ impl WebSocket { } } -impl WebSocket { +impl WebSocket +where + Stream: Read + Write, + Ext: WebSocketExtension, +{ /// Read a message from stream, if possible. /// /// This will queue responses to ping and close messages to be sent. It will call @@ -215,7 +253,10 @@ impl WebSocket { /// A context for managing WebSocket stream. #[derive(Debug)] -pub struct WebSocketContext { +pub struct WebSocketContext +where + Ext: WebSocketExtension, +{ /// Server or client? role: Role, /// encoder/decoder of frame. @@ -229,12 +270,17 @@ pub struct WebSocketContext { /// Send: an OOB pong message. pong: Option, /// The configuration for the websocket session. - config: WebSocketConfig, + config: WebSocketConfig, } -impl WebSocketContext { +impl WebSocketContext +where + Ext: WebSocketExtension, +{ /// Create a WebSocket context that manages a post-handshake stream. - pub fn new(role: Role, config: Option) -> Self { + pub fn new(role: Role, config: Option>) -> Self { + let config = config.unwrap_or_else(Default::default); + WebSocketContext { role, frame: FrameCodec::new(), @@ -242,12 +288,16 @@ impl WebSocketContext { incomplete: None, send_queue: VecDeque::new(), pong: None, - config: config.unwrap_or_else(WebSocketConfig::default), + config, } } /// Create a WebSocket context that manages an post-handshake stream. - pub fn from_partially_read(part: Vec, role: Role, config: Option) -> Self { + pub fn from_partially_read( + part: Vec, + role: Role, + config: Option>, + ) -> Self { WebSocketContext { frame: FrameCodec::from_partially_read(part), ..WebSocketContext::new(role, config) @@ -255,12 +305,12 @@ impl WebSocketContext { } /// Change the configuration. - pub fn set_config(&mut self, set_func: impl FnOnce(&mut WebSocketConfig)) { + pub fn set_config(&mut self, set_func: impl FnOnce(&mut WebSocketConfig)) { set_func(&mut self.config) } /// Read the configuration. - pub fn get_config(&self) -> &WebSocketConfig { + pub fn get_config(&self) -> &WebSocketConfig { &self.config } @@ -426,17 +476,6 @@ impl WebSocketContext { "Remote sent frame after having sent a Close Frame".into(), )); } - // MUST be 0 unless an extension is negotiated that defines meanings - // for non-zero values. If a nonzero value is received and none of - // the negotiated extensions defines the meaning of such a nonzero - // value, the receiving endpoint MUST _Fail the WebSocket - // Connection_. - { - let hdr = frame.header(); - if hdr.rsv1 || hdr.rsv2 || hdr.rsv3 { - return Err(Error::Protocol("Reserved bits are non-zero".into())); - } - } match self.role { Role::Server => { @@ -489,49 +528,10 @@ impl WebSocketContext { } } - OpCode::Data(data) => { - let fin = frame.header().is_final; - match data { - OpData::Continue => { - if let Some(ref mut msg) = self.incomplete { - msg.extend(frame.into_data(), self.config.max_message_size)?; - } else { - return Err(Error::Protocol( - "Continue frame but nothing to continue".into(), - )); - } - if fin { - Ok(Some(self.incomplete.take().unwrap().complete()?)) - } else { - Ok(None) - } - } - c if self.incomplete.is_some() => Err(Error::Protocol( - format!("Received {} while waiting for more fragments", c).into(), - )), - OpData::Text | OpData::Binary => { - let msg = { - let message_type = match data { - OpData::Text => IncompleteMessageType::Text, - OpData::Binary => IncompleteMessageType::Binary, - _ => panic!("Bug: message is not text nor binary"), - }; - let mut m = IncompleteMessage::new(message_type); - m.extend(frame.into_data(), self.config.max_message_size)?; - m - }; - if fin { - Ok(Some(msg.complete()?)) - } else { - self.incomplete = Some(msg); - Ok(None) - } - } - OpData::Reserved(i) => Err(Error::Protocol( - format!("Unknown data frame type {}", i).into(), - )), - } - } + _ => match self.config.encoder.on_receive_frame(frame) { + Ok(r) => Ok(r), + Err(e) => Err(e.into()), + }, } // match opcode } else { // Connection closed by peer @@ -601,6 +601,13 @@ impl WebSocketContext { } } + if frame.header().is_final { + frame = match self.config.encoder.on_send_frame(frame) { + Ok(frame) => frame, + Err(e) => return Err(e.into()), + }; + } + trace!("Sending frame: {:?}", frame); self.frame .write_frame(stream, frame) @@ -675,6 +682,7 @@ impl CheckConnectionReset for Result { mod tests { use super::{Message, Role, WebSocket, WebSocketConfig}; + use crate::extensions::uncompressed::UncompressedExt; use std::io; use std::io::Cursor; @@ -702,7 +710,8 @@ mod tests { 0x2c, 0x20, 0x80, 0x06, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x82, 0x03, 0x01, 0x02, 0x03, ]); - let mut socket = WebSocket::from_raw_socket(WriteMoc(incoming), Role::Client, None); + let mut socket: WebSocket<_, UncompressedExt> = + WebSocket::from_raw_socket(WriteMoc(incoming), Role::Client, None); assert_eq!(socket.read_message().unwrap(), Message::Ping(vec![1, 2])); assert_eq!(socket.read_message().unwrap(), Message::Pong(vec![3])); assert_eq!( @@ -722,8 +731,9 @@ mod tests { 0x6c, 0x64, 0x21, ]); let limit = WebSocketConfig { - max_message_size: Some(10), - ..WebSocketConfig::default() + max_send_queue: None, + max_frame_size: Some(16 << 20), + encoder: UncompressedExt::new(Some(10)), }; let mut socket = WebSocket::from_raw_socket(WriteMoc(incoming), Role::Client, Some(limit)); assert_eq!( @@ -736,8 +746,9 @@ mod tests { fn size_limiting_binary() { let incoming = Cursor::new(vec![0x82, 0x03, 0x01, 0x02, 0x03]); let limit = WebSocketConfig { - max_message_size: Some(2), - ..WebSocketConfig::default() + max_send_queue: None, + max_frame_size: Some(16 << 20), + encoder: UncompressedExt::new(Some(2)), }; let mut socket = WebSocket::from_raw_socket(WriteMoc(incoming), Role::Client, Some(limit)); assert_eq!( diff --git a/src/server.rs b/src/server.rs index 725d892..99e3757 100644 --- a/src/server.rs +++ b/src/server.rs @@ -7,6 +7,8 @@ use crate::handshake::HandshakeError; use crate::protocol::{WebSocket, WebSocketConfig}; +use crate::extensions::uncompressed::UncompressedExt; +use crate::extensions::WebSocketExtension; use std::io::{Read, Write}; /// Accept the given Stream as a WebSocket. @@ -18,10 +20,14 @@ use std::io::{Read, Write}; /// If you want TLS support, use `native_tls::TlsStream` or `openssl::ssl::SslStream` /// for the stream here. Any `Read + Write` streams are supported, including /// those from `Mio` and others. -pub fn accept_with_config( - stream: S, - config: Option, -) -> Result, HandshakeError>> { +pub fn accept_with_config( + stream: Stream, + config: Option>, +) -> Result, HandshakeError>> +where + Stream: Read + Write, + Ext: WebSocketExtension, +{ accept_hdr_with_config(stream, NoCallback, config) } @@ -33,7 +39,10 @@ pub fn accept_with_config( /// those from `Mio` and others. pub fn accept( stream: S, -) -> Result, HandshakeError>> { +) -> Result< + WebSocket, + HandshakeError>, +> { accept_with_config(stream, None) } @@ -45,11 +54,16 @@ pub fn accept( /// This function does the same as `accept()` but accepts an extra callback /// for header processing. The callback receives headers of the incoming /// requests and is able to add extra headers to the reply. -pub fn accept_hdr_with_config( +pub fn accept_hdr_with_config( stream: S, callback: C, - config: Option, -) -> Result, HandshakeError>> { + config: Option>, +) -> Result, HandshakeError>> +where + S: Read + Write, + C: Callback, + Ext: WebSocketExtension, +{ ServerHandshake::start(stream, callback, config).handshake() } @@ -61,6 +75,6 @@ pub fn accept_hdr_with_config( pub fn accept_hdr( stream: S, callback: C, -) -> Result, HandshakeError>> { +) -> Result, HandshakeError>> { accept_hdr_with_config(stream, callback, None) } diff --git a/tests/connection_reset.rs b/tests/connection_reset.rs index d95ee81..87396ff 100644 --- a/tests/connection_reset.rs +++ b/tests/connection_reset.rs @@ -1,22 +1,23 @@ //! Verifies that the server returns a `ConnectionClosed` error when the connection //! is closedd from the server's point of view and drop the underlying tcp socket. -use std::net::{TcpStream, TcpListener}; +use std::net::{TcpListener, TcpStream}; use std::process::exit; use std::thread::{sleep, spawn}; use std::time::Duration; -use tungstenite::{accept, connect, Error, Message, WebSocket, stream::Stream}; use native_tls::TlsStream; -use url::Url; use net2::TcpStreamExt; +use tungstenite::extensions::uncompressed::UncompressedExt; +use tungstenite::{accept, connect, stream::Stream, Error, Message, WebSocket}; +use url::Url; -type Sock = WebSocket>>; +type Sock = WebSocket>, Ext>; fn do_test(port: u16, client_task: CT, server_task: ST) where - CT: FnOnce(Sock) + Send + 'static, - ST: FnOnce(WebSocket), + CT: FnOnce(Sock) + Send + 'static, + ST: FnOnce(WebSocket), { env_logger::try_init().ok(); @@ -26,8 +27,8 @@ where exit(1); }); - let server = TcpListener::bind(("127.0.0.1", port)) - .expect("Can't listen, is port already in use?"); + let server = + TcpListener::bind(("127.0.0.1", port)).expect("Can't listen, is port already in use?"); let client_thread = spawn(move || { let (client, _) = connect(Url::parse(&format!("ws://localhost:{}/socket", port)).unwrap()) @@ -46,7 +47,8 @@ where #[test] fn test_server_close() { - do_test(3012, + do_test( + 3012, |mut cli_sock| { cli_sock .write_message(Message::Text("Hello WebSocket".into())) @@ -75,12 +77,14 @@ fn test_server_close() { Error::ConnectionClosed => {} _ => panic!("unexpected error: {:?}", err), } - }); + }, + ); } #[test] fn test_evil_server_close() { - do_test(3013, + do_test( + 3013, |mut cli_sock| { cli_sock .write_message(Message::Text("Hello WebSocket".into())) @@ -106,14 +110,19 @@ fn test_evil_server_close() { let message = srv_sock.read_message().unwrap(); // receive acknowledgement assert!(message.is_close()); // and now just drop the connection without waiting for `ConnectionClosed` - srv_sock.get_mut().set_linger(Some(Duration::from_secs(0))).unwrap(); + srv_sock + .get_mut() + .set_linger(Some(Duration::from_secs(0))) + .unwrap(); drop(srv_sock); - }); + }, + ); } #[test] fn test_client_close() { - do_test(3014, + do_test( + 3014, |mut cli_sock| { cli_sock .write_message(Message::Text("Hello WebSocket".into())) @@ -137,7 +146,9 @@ fn test_client_close() { let message = srv_sock.read_message().unwrap(); assert_eq!(message.into_data(), b"Hello WebSocket"); - srv_sock.write_message(Message::Text("From Server".into())).unwrap(); + srv_sock + .write_message(Message::Text("From Server".into())) + .unwrap(); let message = srv_sock.read_message().unwrap(); // receive close from client assert!(message.is_close()); @@ -147,6 +158,6 @@ fn test_client_close() { Error::ConnectionClosed => {} _ => panic!("unexpected error: {:?}", err), } - }); - + }, + ); }