From ba5cd3ad0d49e0ea065d6670473ad4379d57b2f3 Mon Sep 17 00:00:00 2001 From: Dominic Cerisano Date: Mon, 12 Sep 2016 03:18:58 -0400 Subject: [PATCH 1/2] fix --- .travis.yml | 5 - CodeFormatterProfile.xml | 279 -- LICENSE | 22 - README.markdown | 163 - autobahn reports/clients/index.html | 3614 ----------------- autobahn reports/servers/index.html | 3614 ----------------- .../tootallnate_websocket_case_3_2.html | 305 -- .../tootallnate_websocket_case_4_1_3.html | 305 -- .../tootallnate_websocket_case_4_1_4.html | 306 -- .../tootallnate_websocket_case_4_2_3.html | 305 -- .../tootallnate_websocket_case_4_2_4.html | 306 -- .../tootallnate_websocket_case_6_20_1.html | 304 -- .../tootallnate_websocket_case_6_20_2.html | 304 -- .../tootallnate_websocket_case_6_20_3.html | 304 -- .../tootallnate_websocket_case_6_20_4.html | 304 -- .../tootallnate_websocket_case_6_20_5.html | 304 -- .../tootallnate_websocket_case_6_20_6.html | 304 -- .../tootallnate_websocket_case_6_20_7.html | 304 -- .../tootallnate_websocket_case_6_21_1.html | 304 -- .../tootallnate_websocket_case_6_21_2.html | 304 -- .../tootallnate_websocket_case_6_21_3.html | 304 -- .../tootallnate_websocket_case_6_21_4.html | 304 -- .../tootallnate_websocket_case_6_21_5.html | 304 -- .../tootallnate_websocket_case_6_21_6.html | 304 -- .../tootallnate_websocket_case_6_21_7.html | 304 -- .../tootallnate_websocket_case_6_21_8.html | 304 -- .../tootallnate_websocket_case_6_3_1.html | 304 -- .../tootallnate_websocket_case_6_3_2.html | 365 -- .../tootallnate_websocket_case_6_4_1.html | 318 -- .../tootallnate_websocket_case_6_4_2.html | 316 -- .../tootallnate_websocket_case_6_4_3.html | 312 -- .../tootallnate_websocket_case_6_4_4.html | 312 -- .../tootallnate_websocket_case_6_5_1.html | 303 -- build.gradle | 44 - dist/java_websocket.jar | Bin 88934 -> 95696 bytes gradle/wrapper/gradle-wrapper.jar | Bin 51348 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 6 - gradlew | 164 - gradlew.bat | 90 - index.html | 88 - pom.xml | 142 - project.properties | 0 .../DefaultSSLWebSocketServerFactory.java | 3 +- .../AutobahnClientScenario.java | 236 -- .../java_websocket/AutobahnClientTest.java | 10 - .../example/AutobahnClientTest.java | 165 - .../example/AutobahnServerTest.java | 74 - .../org/java_websocket/AutobahnClient.feature | 25 - 48 files changed, 2 insertions(+), 17059 deletions(-) delete mode 100644 .travis.yml delete mode 100644 CodeFormatterProfile.xml delete mode 100644 LICENSE delete mode 100644 README.markdown delete mode 100644 autobahn reports/clients/index.html delete mode 100644 autobahn reports/servers/index.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_3_2.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_4_1_3.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_4_1_4.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_4_2_3.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_4_2_4.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_20_1.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_20_2.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_20_3.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_20_4.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_20_5.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_20_6.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_20_7.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_1.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_2.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_3.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_4.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_5.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_6.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_7.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_21_8.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_3_1.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_3_2.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_4_1.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_4_2.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_4_3.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_4_4.html delete mode 100644 autobahn reports/servers/tootallnate_websocket_case_6_5_1.html delete mode 100644 build.gradle delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat delete mode 100644 index.html delete mode 100644 pom.xml create mode 100644 project.properties delete mode 100644 src/test/java/org/java_websocket/AutobahnClientScenario.java delete mode 100644 src/test/java/org/java_websocket/AutobahnClientTest.java delete mode 100644 src/test/java/org/java_websocket/example/AutobahnClientTest.java delete mode 100644 src/test/java/org/java_websocket/example/AutobahnServerTest.java delete mode 100644 src/test/resources/org/java_websocket/AutobahnClient.feature diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 067c53e42..000000000 --- a/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: java -jdk: - - oraclejdk7 - -script: "./gradlew test" diff --git a/CodeFormatterProfile.xml b/CodeFormatterProfile.xml deleted file mode 100644 index 73325dedd..000000000 --- a/CodeFormatterProfile.xml +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 5a93449e0..000000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - Copyright (c) 2010-2012 Nathan Rajlich - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.markdown b/README.markdown deleted file mode 100644 index 88349fa48..000000000 --- a/README.markdown +++ /dev/null @@ -1,163 +0,0 @@ -[![Build Status](https://travis-ci.org/ck1125/Java-WebSocket.png?branch=master)](https://travis-ci.org/ck1125/Java-WebSocket) -Java WebSockets -=============== - -This repository contains a barebones WebSocket server and client implementation -written in 100% Java. The underlying classes are implemented `java.nio`, which allows for a -non-blocking event-driven model (similar to the -[WebSocket API](http://dev.w3.org/html5/websockets/) for web browsers). - -Implemented WebSocket protocol versions are: - - * [RFC 6455](http://tools.ietf.org/html/rfc6455) - * [Hybi 17](http://tools.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-17.txt) - * [Hybi 10](http://tools.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-10.txt) - * [Hixie 76](http://tools.ietf.org/id/draft-hixie-thewebsocketprotocol-76.txt) - * [Hixie 75](http://tools.ietf.org/id/draft-hixie-thewebsocketprotocol-75.txt) - -[Here](https://github.com/TooTallNate/Java-WebSocket/wiki/Drafts) some more details about protocol versions/drafts. - - -##Build -You can build using Ant or Maven but there is nothing against just putting the source path ```src/main/java ``` on your applications buildpath. - -###Ant - -``` bash -ant -``` - -will create the javadoc of this library at ```doc/``` and build the library itself: ```dest/java_websocket.jar``` - -The ant targets are: ```compile```, ```jar```, ```doc``` and ```clean``` - -###Maven - -To use maven just add this dependency to your pom.xml: -```xml - - org.java-websocket - Java-WebSocket - 1.3.0 - -``` - -Running the Examples -------------------- - -**Note:** If you're on Windows, then replace the `:` (colon) in the classpath -in the commands below with a `;` (semicolon). - -After you build the library you can start the chat server (a `WebSocketServer` subclass): - -``` bash -java -cp build/examples:dist/java_websocket.jar ChatServer -``` - -Now that the server is started, you need to connect some clients. Run the -Java chat client (a `WebSocketClient` subclass): - -``` bash -java -cp build/examples:dist/java_websocket.jar ChatClient -``` - -The chat client is a simple Swing GUI application that allows you to send -messages to all other connected clients, and receive messages from others in a -text box. - -In the example folder is also a simple HTML file chat client `chat.html`, which can be opened by any browser. If the browser natively supports the WebSocket API, then it's -implementation will be used, otherwise it will fall back to a -[Flash-based WebSocket Implementation](http://github.com/gimite/web-socket-js). - - -Writing your own WebSocket Server ---------------------------------- - -The `org.java_websocket.server.WebSocketServer` abstract class implements the -server-side of the -[WebSocket Protocol](http://www.whatwg.org/specs/web-socket-protocol/). -A WebSocket server by itself doesn't do anything except establish socket -connections though HTTP. After that it's up to **your** subclass to add purpose. - - -Writing your own WebSocket Client ---------------------------------- - -The `org.java_websocket.client.WebSocketClient` abstract class can connect to -valid WebSocket servers. The constructor expects a valid `ws://` URI to -connect to. Important events `onOpen`, `onClose`, `onMessage` and `onIOError` -get fired throughout the life of the WebSocketClient, and must be implemented -in **your** subclass. - -WSS Support ---------------------------------- -This library supports wss. -To see how to use wss please take a look at the examples.
- -If you do not have a valid **certificate** in place then you will have to create a self signed one. -Browsers will simply refuse the connection in case of a bad certificate and will not ask the user to accept it. -So the first step will be to make a browser to accept your self signed certificate. ( https://bugzilla.mozilla.org/show_bug.cgi?id=594502 ).
-If the websocket server url is `wss://localhost:8000` visit the url `https://localhost:8000` with your browser. The browser will recognize the handshake and allow you to accept the certificate. This technique is also demonstrated in this [video](http://www.youtube.com/watch?v=F8lBdfAZPkU). - -The vm option `-Djavax.net.debug=all` can help to find out if there is a problem with the certificate. - -It is currently not possible to accept ws and wss connections at the same time via the same websocket server instance. - -For some reason firefox does not allow multible connections to the same wss server if the server uses a different port than the default port(443). - - -If you want to use `wss` on the android platfrom you should take a look at [this](http://blog.antoine.li/2010/10/22/android-trusting-ssl-certificates/). - -I ( @Davidiusdadi ) would be glad if you would give some feedback whether wss is working fine for you or not. - -Minimum Required JDK --------------------- - -`Java-WebSocket` is known to work with: - - * Java 1.5 (aka SE 6) - * Android 1.6 (API 4) - -Other JRE implementations may work as well, but haven't been tested. - - -Testing in Android Emulator ---------------------------- - -Please note Android Emulator has issues using `IPv6 addresses`. Executing any -socket related code (like this library) inside it will address an error - -``` bash -java.net.SocketException: Bad address family -``` - -You have to manually disable `IPv6` by calling - -``` java -java.lang.System.setProperty("java.net.preferIPv6Addresses", "false"); -java.lang.System.setProperty("java.net.preferIPv4Stack", "true"); -``` - -somewhere in your project, before instantiating the `WebSocketClient` class. -You can check if you are currently testing in the Android Emulator like this - -``` java -if ("google_sdk".equals( Build.PRODUCT )) { - // ... disable IPv6 -} -``` - - -Getting Support ---------------- - -If you are looking for help using `Java-WebSocket` you might want to check out the -[#java-websocket](http://webchat.freenode.net/?channels=java-websocket) IRC room -on the FreeNode IRC network. - - -License -------- - -Everything found in this repo is licensed under an MIT license. See -the `LICENSE` file for specifics. diff --git a/autobahn reports/clients/index.html b/autobahn reports/clients/index.html deleted file mode 100644 index 5fa8f93d7..000000000 --- a/autobahn reports/clients/index.html +++ /dev/null @@ -1,3614 +0,0 @@ - - - - - - - - - -
Toggle Details
- -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

Summary report generated on 2012-02-04T14:47:30Z (UTC) by Autobahn WebSockets v0.4.10.

- - - - - - - - - - - - - - - - - - - - - - -
PassTest case was executed and passed successfully.
Non-StrictTest case was executed and passed non-strictly. - A non-strict behavior is one that does not adhere to a SHOULD-behavior as described in the protocol specification or - a well-defined, canonical behavior that appears to be desirable but left open in the protocol specification. - An implementation with non-strict behavior is still conformant to the protocol specification.
FailTest case was executed and failed. An implementation which fails a test case - other - than a performance/limits related one - is non-conforming to a MUST-behavior as described in the protocol specification.
InfoInformational test case which detects certain implementation behavior left unspecified by the spec - but nevertheless potentially interesting to implementors.
MissingTest case is missing, either because it was skipped via the test suite configuration - or deactivated, i.e. because the implementation does not implement the tested feature or breaks during running - the test case.
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 Framingtootallnate/websocket
1.1 Text Messages
Case 1.1.1PassNone
Case 1.1.2PassNone
Case 1.1.3PassNone
Case 1.1.4PassNone
Case 1.1.5PassNone
Case 1.1.6PassNone
Case 1.1.7PassNone
Case 1.1.8PassNone
1 Framingtootallnate/websocket
1.2 Binary Messages
Case 1.2.1PassNone
Case 1.2.2PassNone
Case 1.2.3PassNone
Case 1.2.4PassNone
Case 1.2.5PassNone
Case 1.2.6PassNone
Case 1.2.7PassNone
Case 1.2.8PassNone
2 Pings/Pongstootallnate/websocket
Case 2.1PassNone
Case 2.2PassNone
Case 2.3PassNone
Case 2.4PassNone
Case 2.5PassNone
Case 2.6PassNone
Case 2.7PassNone
Case 2.8PassNone
Case 2.9PassNone
Case 2.10PassNone
Case 2.11PassNone
3 Reserved Bitstootallnate/websocket
Case 3.1PassNone
Case 3.2Non-StrictNone
Case 3.3Non-StrictNone
Case 3.4PassNone
Case 3.5PassNone
Case 3.6PassNone
Case 3.7PassNone
4 Opcodestootallnate/websocket
4.1 Non-control Opcodes
Case 4.1.1PassNone
Case 4.1.2PassNone
Case 4.1.3Non-StrictNone
Case 4.1.4Non-StrictNone
Case 4.1.5PassNone
4 Opcodestootallnate/websocket
4.2 Control Opcodes
Case 4.2.1PassNone
Case 4.2.2PassNone
Case 4.2.3Non-StrictNone
Case 4.2.4Non-StrictNone
Case 4.2.5PassNone
5 Fragmentationtootallnate/websocket
Case 5.1PassNone
Case 5.2PassNone
Case 5.3PassNone
Case 5.4PassNone
Case 5.5PassNone
Case 5.6PassNone
Case 5.7PassNone
Case 5.8PassNone
Case 5.9PassNone
Case 5.10PassNone
Case 5.11PassNone
Case 5.12PassNone
Case 5.13PassNone
Case 5.14PassNone
Case 5.15PassNone
Case 5.16PassNone
Case 5.17PassNone
Case 5.18PassNone
Case 5.19PassNone
Case 5.20PassNone
6 UTF-8 Handlingtootallnate/websocket
6.1 Valid UTF-8 with zero payload fragments
Case 6.1.1PassNone
Case 6.1.2PassNone
Case 6.1.3PassNone
6 UTF-8 Handlingtootallnate/websocket
6.2 Valid UTF-8 unfragmented, fragmented on code-points and within code-points
Case 6.2.1PassNone
Case 6.2.2PassNone
Case 6.2.3PassNone
Case 6.2.4PassNone
6 UTF-8 Handlingtootallnate/websocket
6.3 Invalid UTF-8 differently fragmented
Case 6.3.1FailFail
Case 6.3.2FailFail
6 UTF-8 Handlingtootallnate/websocket
6.4 Fail-fast on invalid UTF-8
Case 6.4.1Non-StrictNone
Case 6.4.2Non-StrictNone
Case 6.4.3Non-StrictNone
Case 6.4.4Non-StrictNone
6 UTF-8 Handlingtootallnate/websocket
6.5 Some valid UTF-8 sequences
Case 6.5.1PassNone
6 UTF-8 Handlingtootallnate/websocket
6.6 All prefixes of a valid UTF-8 string that contains multi-byte code points
Case 6.6.1PassNone
Case 6.6.2PassNone
Case 6.6.3PassNone
Case 6.6.4PassNone
Case 6.6.5PassNone
Case 6.6.6PassNone
Case 6.6.7PassNone
Case 6.6.8PassNone
Case 6.6.9PassNone
Case 6.6.10PassNone
Case 6.6.11PassNone
6 UTF-8 Handlingtootallnate/websocket
6.7 First possible sequence of a certain length
Case 6.7.1PassNone
Case 6.7.2PassNone
Case 6.7.3PassNone
Case 6.7.4PassNone
6 UTF-8 Handlingtootallnate/websocket
6.8 First possible sequence length 5/6 (invalid codepoints)
Case 6.8.1PassNone
Case 6.8.2PassNone
6 UTF-8 Handlingtootallnate/websocket
6.9 Last possible sequence of a certain length
Case 6.9.1PassNone
Case 6.9.2PassNone
Case 6.9.3PassNone
Case 6.9.4PassNone
6 UTF-8 Handlingtootallnate/websocket
6.10 Last possible sequence length 4/5/6 (invalid codepoints)
Case 6.10.1PassNone
Case 6.10.2PassNone
Case 6.10.3PassNone
6 UTF-8 Handlingtootallnate/websocket
6.11 Other boundary conditions
Case 6.11.1PassNone
Case 6.11.2PassNone
Case 6.11.3PassNone
Case 6.11.4PassNone
Case 6.11.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.12 Unexpected continuation bytes
Case 6.12.1PassNone
Case 6.12.2PassNone
Case 6.12.3PassNone
Case 6.12.4PassNone
Case 6.12.5PassNone
Case 6.12.6PassNone
Case 6.12.7PassNone
Case 6.12.8PassNone
6 UTF-8 Handlingtootallnate/websocket
6.13 Lonely start characters
Case 6.13.1PassNone
Case 6.13.2PassNone
Case 6.13.3PassNone
Case 6.13.4PassNone
Case 6.13.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.14 Sequences with last continuation byte missing
Case 6.14.1PassNone
Case 6.14.2PassNone
Case 6.14.3PassNone
Case 6.14.4PassNone
Case 6.14.5PassNone
Case 6.14.6PassNone
Case 6.14.7PassNone
Case 6.14.8PassNone
Case 6.14.9PassNone
Case 6.14.10PassNone
6 UTF-8 Handlingtootallnate/websocket
6.15 Concatenation of incomplete sequences
Case 6.15.1PassNone
6 UTF-8 Handlingtootallnate/websocket
6.16 Impossible bytes
Case 6.16.1PassNone
Case 6.16.2PassNone
Case 6.16.3PassNone
6 UTF-8 Handlingtootallnate/websocket
6.17 Examples of an overlong ASCII character
Case 6.17.1PassNone
Case 6.17.2PassNone
Case 6.17.3PassNone
Case 6.17.4PassNone
Case 6.17.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.18 Maximum overlong sequences
Case 6.18.1PassNone
Case 6.18.2PassNone
Case 6.18.3PassNone
Case 6.18.4PassNone
Case 6.18.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.19 Overlong representation of the NUL character
Case 6.19.1PassNone
Case 6.19.2PassNone
Case 6.19.3PassNone
Case 6.19.4PassNone
Case 6.19.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.20 Single UTF-16 surrogates
Case 6.20.1FailFail
Case 6.20.2FailFail
Case 6.20.3FailFail
Case 6.20.4FailFail
Case 6.20.5FailFail
Case 6.20.6FailFail
Case 6.20.7FailFail
6 UTF-8 Handlingtootallnate/websocket
6.21 Paired UTF-16 surrogates
Case 6.21.1FailFail
Case 6.21.2FailFail
Case 6.21.3FailFail
Case 6.21.4FailFail
Case 6.21.5FailFail
Case 6.21.6FailFail
Case 6.21.7FailFail
Case 6.21.8FailFail
6 UTF-8 Handlingtootallnate/websocket
6.22 Non-character code points (valid UTF-8)
Case 6.22.1PassNone
Case 6.22.2PassNone
Case 6.22.3PassNone
Case 6.22.4PassNone
Case 6.22.5PassNone
Case 6.22.6PassNone
Case 6.22.7PassNone
Case 6.22.8PassNone
Case 6.22.9PassNone
Case 6.22.10PassNone
Case 6.22.11PassNone
Case 6.22.12PassNone
Case 6.22.13PassNone
Case 6.22.14PassNone
Case 6.22.15PassNone
Case 6.22.16PassNone
Case 6.22.17PassNone
Case 6.22.18PassNone
Case 6.22.19PassNone
Case 6.22.20PassNone
Case 6.22.21PassNone
Case 6.22.22PassNone
Case 6.22.23PassNone
Case 6.22.24PassNone
Case 6.22.25PassNone
Case 6.22.26PassNone
Case 6.22.27PassNone
Case 6.22.28PassNone
Case 6.22.29PassNone
Case 6.22.30PassNone
Case 6.22.31PassNone
Case 6.22.32PassNone
Case 6.22.33PassNone
Case 6.22.34PassNone
6 UTF-8 Handlingtootallnate/websocket
6.23 Unicode replacement character
Case 6.23.1PassNone
7 Close Handlingtootallnate/websocket
7.1 Basic close behavior (fuzzer initiated)
Case 7.1.1PassNone
Case 7.1.2PassNone
Case 7.1.3PassNone
Case 7.1.4PassNone
Case 7.1.5PassNone
Case 7.1.6InfoNone
7 Close Handlingtootallnate/websocket
7.3 Close frame structure: payload length (fuzzer initiated)
Case 7.3.1PassNone
Case 7.3.2PassNone
Case 7.3.3PassNone
Case 7.3.4PassNone
Case 7.3.5PassNone
Case 7.3.6PassNone
7 Close Handlingtootallnate/websocket
7.5 Close frame structure: payload value (fuzzer initiated)
Case 7.5.1PassNone
7 Close Handlingtootallnate/websocket
7.7 Close frame structure: valid close codes (fuzzer initiated)
Case 7.7.1PassNone
Case 7.7.2PassNone
Case 7.7.3PassNone
Case 7.7.4PassNone
Case 7.7.5PassNone
Case 7.7.6PassNone
Case 7.7.7PassNone
Case 7.7.8PassNone
Case 7.7.9PassNone
Case 7.7.10PassNone
Case 7.7.11PassNone
Case 7.7.12PassNone
Case 7.7.13PassNone
7 Close Handlingtootallnate/websocket
7.9 Close frame structure: invalid close codes (fuzzer initiated)
Case 7.9.1PassNone
Case 7.9.2PassNone
Case 7.9.3PassNone
Case 7.9.4PassNone
Case 7.9.5PassNone
Case 7.9.6PassNone
Case 7.9.7PassNone
Case 7.9.8PassNone
Case 7.9.9PassNone
Case 7.9.10PassNone
Case 7.9.11PassNone
Case 7.9.12PassNone
Case 7.9.13PassNone
7 Close Handlingtootallnate/websocket
7.13 Informational close information (fuzzer initiated)
Case 7.13.1InfoNone
Case 7.13.2InfoNone
9 Limits/Performancetootallnate/websocket
9.1 Text Message (increasing size)
Case 9.1.1Pass
88 ms
None
Case 9.1.2Pass
354 ms
None
Case 9.1.3Pass
1278 ms
None
Case 9.1.4Pass
5138 ms
None
Case 9.1.5Pass
10252 ms
None
Case 9.1.6Pass
20383 ms
None
9 Limits/Performancetootallnate/websocket
9.2 Binary Message (increasing size)
Case 9.2.1Pass
50 ms
None
Case 9.2.2Pass
149 ms
None
Case 9.2.3Pass
576 ms
None
Case 9.2.4Pass
2368 ms
None
Case 9.2.5Pass
4974 ms
None
Case 9.2.6Pass
9816 ms
None
9 Limits/Performancetootallnate/websocket
9.3 Fragmented Text Message (fixed size, increasing fragment size)
Case 9.3.1Pass
73618 ms
None
Case 9.3.2Pass
21904 ms
None
Case 9.3.3Pass
9511 ms
None
Case 9.3.4Pass
6355 ms
None
Case 9.3.5Pass
5412 ms
None
Case 9.3.6Pass
5167 ms
None
Case 9.3.7Pass
5097 ms
None
Case 9.3.8Pass
5109 ms
None
Case 9.3.9Pass
5064 ms
None
9 Limits/Performancetootallnate/websocket
9.4 Fragmented Binary Message (fixed size, increasing fragment size)
Case 9.4.1Pass
68983 ms
None
Case 9.4.2Pass
19104 ms
None
Case 9.4.3Pass
6678 ms
None
Case 9.4.4Pass
3500 ms
None
Case 9.4.5Pass
2588 ms
None
Case 9.4.6Pass
2373 ms
None
Case 9.4.7Pass
2271 ms
None
Case 9.4.8Pass
2251 ms
None
Case 9.4.9Pass
2252 ms
None
9 Limits/Performancetootallnate/websocket
9.5 Text Message (fixed size, increasing chop size)
Case 9.5.1Pass
18135 ms
None
Case 9.5.2Pass
9891 ms
None
Case 9.5.3Pass
5464 ms
None
Case 9.5.4Pass
3387 ms
None
Case 9.5.5Pass
2355 ms
None
Case 9.5.6Pass
1902 ms
None
9 Limits/Performancetootallnate/websocket
9.6 Binary Text Message (fixed size, increasing chop size)
Case 9.6.1Pass
17756 ms
None
Case 9.6.2Pass
9052 ms
None
Case 9.6.3Pass
4858 ms
None
Case 9.6.4Pass
2682 ms
None
Case 9.6.5Pass
1675 ms
None
Case 9.6.6Pass
1146 ms
None
9 Limits/Performancetootallnate/websocket
9.7 Text Message Roundtrip Time (fixed number, increasing size)
Case 9.7.1Pass
258 ms
None
Case 9.7.2Pass
273 ms
None
Case 9.7.3Pass
348 ms
None
Case 9.7.4Pass
595 ms
None
Case 9.7.5Pass
1671 ms
None
Case 9.7.6Pass
5664 ms
None
9 Limits/Performancetootallnate/websocket
9.8 Binary Message Roundtrip Time (fixed number, increasing size)
Case 9.8.1Pass
247 ms
None
Case 9.8.2Pass
262 ms
None
Case 9.8.3Pass
302 ms
None
Case 9.8.4Pass
396 ms
None
Case 9.8.5Pass
957 ms
None
Case 9.8.6Pass
2814 ms
None
10 Autobahn Protocol Optionstootallnate/websocket
10.1 Auto-Fragmentation
Case 10.1.1PassNone
-

-
-
- -

Case 1.1.1

- Up -

Case Description

Send text message with payload 0.

-

Case Expectation

Receive echo'ed text message (with empty payload). Clean close with normal code.

-
- -

Case 1.1.2

- Up -

Case Description

Send text message message with payload of length 125.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.3

- Up -

Case Description

Send text message message with payload of length 126.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.4

- Up -

Case Description

Send text message message with payload of length 127.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.5

- Up -

Case Description

Send text message message with payload of length 128.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.6

- Up -

Case Description

Send text message message with payload of length 65535.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.7

- Up -

Case Description

Send text message message with payload of length 65536.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.8

- Up -

Case Description

Send text message message with payload of length 65536. Sent out data in chops of 997 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.1

- Up -

Case Description

Send binary message with payload 0.

-

Case Expectation

Receive echo'ed binary message (with empty payload). Clean close with normal code.

-
- -

Case 1.2.2

- Up -

Case Description

Send binary message message with payload of length 125.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.3

- Up -

Case Description

Send binary message message with payload of length 126.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.4

- Up -

Case Description

Send binary message message with payload of length 127.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.5

- Up -

Case Description

Send binary message message with payload of length 128.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.6

- Up -

Case Description

Send binary message message with payload of length 65535.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.7

- Up -

Case Description

Send binary message message with payload of length 65536.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.8

- Up -

Case Description

Send binary message message with payload of length 65536. Sent out data in chops of 997 octets.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 2.1

- Up -

Case Description

Send ping without payload.

-

Case Expectation

Pong (with empty payload) is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.2

- Up -

Case Description

Send ping with small text payload.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.3

- Up -

Case Description

Send ping with small binary (non UTF-8) payload.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.4

- Up -

Case Description

Send ping with binary payload of 125 octets.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.5

- Up -

Case Description

Send ping with binary payload of 126 octets.

-

Case Expectation

Connection is failed immediately (1002/Protocol Error), since control frames are only allowed to have payload up to and including 125 octets..

-
- -

Case 2.6

- Up -

Case Description

Send ping with binary payload of 125 octets, send in octet-wise chops.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Implementations must be TCP clean. Clean close with normal code.

-
- -

Case 2.7

- Up -

Case Description

Send unsolicited pong without payload. Verify nothing is received. Clean close with normal code.

-

Case Expectation

Nothing.

-
- -

Case 2.8

- Up -

Case Description

Send unsolicited pong with payload. Verify nothing is received. Clean close with normal code.

-

Case Expectation

Nothing.

-
- -

Case 2.9

- Up -

Case Description

Send unsolicited pong with payload. Send ping with payload. Verify pong for ping is received.

-

Case Expectation

Nothing in reply to own Pong, but Pong with payload echo'ed in reply to Ping. Clean close with normal code.

-
- -

Case 2.10

- Up -

Case Description

Send 10 Pings with payload.

-

Case Expectation

Pongs for our Pings with all the payloads. Note: This is not required by the Spec .. but we check for this behaviour anyway. Clean close with normal code.

-
- -

Case 2.11

- Up -

Case Description

Send 10 Pings with payload. Send out octets in octet-wise chops.

-

Case Expectation

Pongs for our Pings with all the payloads. Note: This is not required by the Spec .. but we check for this behaviour anyway. Clean close with normal code.

-
- -

Case 3.1

- Up -

Case Description

Send small text message with RSV = 1.

-

Case Expectation

The connection is failed immediately (1002/protocol error), since RSV must be 0, when no extension defining RSV meaning has been negoiated.

-
- -

Case 3.2

- Up -

Case Description

Send small text message, then send again with RSV = 2, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since RSV must be 0, when no extension defining RSV meaning has been negoiated. The Pong is not received.

-
- -

Case 3.3

- Up -

Case Description

Send small text message, then send again with RSV = 3, then send Ping. Octets are sent in frame-wise chops. Octets are sent in octet-wise chops.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since RSV must be 0, when no extension defining RSV meaning has been negoiated. The Pong is not received.

-
- -

Case 3.4

- Up -

Case Description

Send small text message, then send again with RSV = 4, then send Ping. Octets are sent in octet-wise chops.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since RSV must be 0, when no extension defining RSV meaning has been negoiated. The Pong is not received.

-
- -

Case 3.5

- Up -

Case Description

Send small binary message with RSV = 5.

-

Case Expectation

The connection is failed immediately, since RSV must be 0.

-
- -

Case 3.6

- Up -

Case Description

Send Ping with RSV = 6.

-

Case Expectation

The connection is failed immediately, since RSV must be 0.

-
- -

Case 3.7

- Up -

Case Description

Send Close with RSV = 7.

-

Case Expectation

The connection is failed immediately, since RSV must be 0.

-
- -

Case 4.1.1

- Up -

Case Description

Send frame with reserved non-control Opcode = 3.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.1.2

- Up -

Case Description

Send frame with reserved non-control Opcode = 4 and non-empty payload.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.1.3

- Up -

Case Description

Send small text message, then send frame with reserved non-control Opcode = 5, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.1.4

- Up -

Case Description

Send small text message, then send frame with reserved non-control Opcode = 6 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.1.5

- Up -

Case Description

Send small text message, then send frame with reserved non-control Opcode = 7 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.2.1

- Up -

Case Description

Send frame with reserved control Opcode = 11.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.2.2

- Up -

Case Description

Send frame with reserved control Opcode = 12 and non-empty payload.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.2.3

- Up -

Case Description

Send small text message, then send frame with reserved control Opcode = 13, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.2.4

- Up -

Case Description

Send small text message, then send frame with reserved control Opcode = 14 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.2.5

- Up -

Case Description

Send small text message, then send frame with reserved control Opcode = 15 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 5.1

- Up -

Case Description

Send Ping fragmented into 2 fragments.

-

Case Expectation

Connection is failed immediately, since control message MUST NOT be fragmented.

-
- -

Case 5.2

- Up -

Case Description

Send Pong fragmented into 2 fragments.

-

Case Expectation

Connection is failed immediately, since control message MUST NOT be fragmented.

-
- -

Case 5.3

- Up -

Case Description

Send text Message fragmented into 2 fragments.

-

Case Expectation

Message is processed and echo'ed back to us.

-
- -

Case 5.4

- Up -

Case Description

Send text Message fragmented into 2 fragments, octets are sent in frame-wise chops.

-

Case Expectation

Message is processed and echo'ed back to us.

-
- -

Case 5.5

- Up -

Case Description

Send text Message fragmented into 2 fragments, octets are sent in octet-wise chops.

-

Case Expectation

Message is processed and echo'ed back to us.

-
- -

Case 5.6

- Up -

Case Description

Send text Message fragmented into 2 fragments, one ping with payload in-between.

-

Case Expectation

A pong is received, then the message is echo'ed back to us.

-
- -

Case 5.7

- Up -

Case Description

Send text Message fragmented into 2 fragments, one ping with payload in-between. Octets are sent in frame-wise chops.

-

Case Expectation

A pong is received, then the message is echo'ed back to us.

-
- -

Case 5.8

- Up -

Case Description

Send text Message fragmented into 2 fragments, one ping with payload in-between. Octets are sent in octet-wise chops.

-

Case Expectation

A pong is received, then the message is echo'ed back to us.

-
- -

Case 5.9

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = true, where there is nothing to continue, sent in one chop.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.10

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = true, where there is nothing to continue, sent in per-frame chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.11

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = true, where there is nothing to continue, sent in octet-wise chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.12

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = false, where there is nothing to continue, sent in one chop.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.13

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = false, where there is nothing to continue, sent in per-frame chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.14

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = false, where there is nothing to continue, sent in octet-wise chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.15

- Up -

Case Description

Send text Message fragmented into 2 fragments, then Continuation Frame with FIN = false where there is nothing to continue, then unfragmented Text Message, all sent in one chop.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.16

- Up -

Case Description

Repeated 2x: Continuation Frame with FIN = false (where there is nothing to continue), then text Message fragmented into 2 fragments.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.17

- Up -

Case Description

Repeated 2x: Continuation Frame with FIN = true (where there is nothing to continue), then text Message fragmented into 2 fragments.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.18

- Up -

Case Description

Send text Message fragmented into 2 fragments, with both frame opcodes set to text, sent in one chop.

-

Case Expectation

The connection is failed immediately, since all data frames after the initial data frame must have opcode 0.

-
- -

Case 5.19

- Up -

Case Description

A fragmented text message is sent in multiple frames. After - sending the first 2 frames of the text message, a Ping is sent. Then we wait 1s, - then we send 2 more text fragments, another Ping and then the final text fragment. - Everything is legal.

-

Case Expectation

The peer immediately answers the first Ping before - it has received the last text message fragment. The peer pong's back the Ping's - payload exactly, and echo's the payload of the fragmented message back to us.

-
- -

Case 5.20

- Up -

Case Description

Same as Case 5.19, but send all frames with SYNC = True. - Note, this does not change the octets sent in any way, only how the stream - is chopped up on the wire.

-

Case Expectation

Same as Case 5.19. Implementations must be agnostic to how - octet stream is chopped up on wire (must be TCP clean).

-
- -

Case 6.1.1

- Up -

Case Description

Send text message of length 0.

-

Case Expectation

A message is echo'ed back to us (with empty payload).

-
- -

Case 6.1.2

- Up -

Case Description

Send fragmented text message, 3 fragments each of length 0.

-

Case Expectation

A message is echo'ed back to us (with empty payload).

-
- -

Case 6.1.3

- Up -

Case Description

Send fragmented text message, 3 fragments, first and last of length 0, middle non-empty.

-

Case Expectation

A message is echo'ed back to us (with payload = payload of middle fragment).

-
- -

Case 6.2.1

- Up -

Case Description

Send a valid UTF-8 text message in one fragment.

MESSAGE:
Hello-µ@ßöäüàá-UTF-8!!
48656c6c6f2dc2b540c39fc3b6c3a4c3bcc3a0c3a12d5554462d382121

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.2.2

- Up -

Case Description

Send a valid UTF-8 text message in two fragments, fragmented on UTF-8 code point boundary.

MESSAGE FRAGMENT 1:
Hello-µ@ßöä
48656c6c6f2dc2b540c39fc3b6c3a4

MESSAGE FRAGMENT 2:
üàá-UTF-8!!
c3bcc3a0c3a12d5554462d382121

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.2.3

- Up -

Case Description

Send a valid UTF-8 text message in fragments of 1 octet, resulting in frames ending on positions which are not code point ends.

MESSAGE:
Hello-µ@ßöäüàá-UTF-8!!
48656c6c6f2dc2b540c39fc3b6c3a4c3bcc3a0c3a12d5554462d382121

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.2.4

- Up -

Case Description

Send a valid UTF-8 text message in fragments of 1 octet, resulting in frames ending on positions which are not code point ends.

MESSAGE:
κόσμε
cebae1bdb9cf83cebcceb5

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.3.1

- Up -

Case Description

Send invalid UTF-8 text message unfragmented.

MESSAGE:
Îºá½¹ÏƒÎ¼Îµí €edited
cebae1bdb9cf83cebcceb5eda080656469746564

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.3.2

- Up -

Case Description

Send invalid UTF-8 text message in fragments of 1 octet, resulting in frames ending on positions which are not code point ends.

MESSAGE:
Îºá½¹ÏƒÎ¼Îµí €edited
cebae1bdb9cf83cebcceb5eda080656469746564

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.4.1

- Up -

Case Description

Send invalid UTF-8 text message in 3 fragments (frames). -First frame payload is valid, then wait, then 2nd frame which contains the payload making the sequence invalid, then wait, then 3rd frame with rest. -Note that PART1 and PART3 are valid UTF-8 in themselves, PART2 is a 0x11000 encoded as in the UTF-8 integer encoding scheme, but the codepoint is invalid (out of range). -

MESSAGE PARTS:
-PART1 = κόσμε (cebae1bdb9cf83cebcceb5)
-PART2 = ô€€ (f4908080)
-PART3 = edited (656469746564)
-

-

Case Expectation

The first frame is accepted, we expect to timeout on the first wait. The 2nd frame should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.4.2

- Up -

Case Description

Same as Case 6.4.1, but in 2nd frame, we send only up to and including the octet making the complete payload invalid. -

MESSAGE PARTS:
-PART1 = κόσμεô (cebae1bdb9cf83cebcceb5f4)
-PART2 = (90)
-PART3 = €€edited (8080656469746564)
-

-

Case Expectation

The first frame is accepted, we expect to timeout on the first wait. The 2nd frame should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.4.3

- Up -

Case Description

Same as Case 6.4.1, but we send message not in 3 frames, but in 3 chops of the same message frame. -

MESSAGE PARTS:
-PART1 = κόσμε (cebae1bdb9cf83cebcceb5)
-PART2 = ô€€ (f4908080)
-PART3 = edited (656469746564)
-

-

Case Expectation

The first chop is accepted, we expect to timeout on the first wait. The 2nd chop should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.4.4

- Up -

Case Description

Same as Case 6.4.2, but we send message not in 3 frames, but in 3 chops of the same message frame. -

MESSAGE PARTS:
-PART1 = κόσμεô (cebae1bdb9cf83cebcceb5f4)
-PART2 = (90)
-PART3 = ()
-

-

Case Expectation

The first chop is accepted, we expect to timeout on the first wait. The 2nd chop should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.5.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσμε
cebae1bdb9cf83cebcceb5

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
Î
ce

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κ
ceba

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
뼇
cebae1

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κá½
cebae1bd

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.5

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κό
cebae1bdb9

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κόÏ
cebae1bdb9cf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.7

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσ
cebae1bdb9cf83

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κόσÎ
cebae1bdb9cf83ce

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.9

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσμ
cebae1bdb9cf83cebc

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.10

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κόσμÎ
cebae1bdb9cf83cebcce

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.11

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσμε
cebae1bdb9cf83cebcceb5

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:

00

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
€
c280

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
à €
e0a080

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ð€€
f0908080

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.8.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
øˆ€€€
f888808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.8.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü„€€€€
fc8480808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.9.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:

7f

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.9.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ß¿
dfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.9.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ï¿¿
efbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.9.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¿
f48fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.10.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
÷¿¿¿
f7bfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.10.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
û¿¿¿¿
fbbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.10.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ý¿¿¿¿¿
fdbfbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.11.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
퟿
ed9fbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:

ee8080

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
�
efbfbd

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¿
f48fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ô€€
f4908080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:

80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
¿
bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿
80bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€
80bf80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€¿
80bf80bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€¿€
80bf80bf80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€¿€¿
80bf80bf80bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾
808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbe

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ
c020c120c220c320c420c520c620c720c820c920ca20cb20cc20cd20ce20cf20d020d120d220d320d420d520d620d720d820d920da20db20dc20dd20de20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à á â ã ä å æ ç è é ê ë ì í î
e020e120e220e320e420e520e620e720e820e920ea20eb20ec20ed20ee20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð ñ ò ó ô õ ö
f020f120f220f320f420f520f620

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø ù ú
f820f920fa20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü
fc20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À
c0

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à€
e080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð€€
f08080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø€€€
f8808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü€€€€
fc80808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ß
df

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ï¿
efbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
÷¿¿
f7bfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.9

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
û¿¿¿
fbbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.10

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ý¿¿¿¿
fdbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.15.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
Àà€ð€€ø€€€ü€€€€ßï¿÷¿¿û¿¿¿ý¿¿¿¿
c0e080f08080f8808080fc80808080dfefbff7bfbffbbfbfbffdbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.16.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
þ
fe

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.16.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ÿ
ff

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.16.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
þþÿÿ
fefeffff

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À¯
c0af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à€¯
e080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð€€¯
f08080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø€€€¯
f8808080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü€€€€¯
fc80808080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
Á¿
c1bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
àŸ¿
e09fbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð¿¿
f08fbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø‡¿¿¿
f887bfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
üƒ¿¿¿¿
fc83bfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À€
c080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à€€
e08080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð€€€
f0808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø€€€€
f880808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü€€€€€
fc8080808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í €
eda080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿
edadbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í®€
edae80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¯¿
edafbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í°€
edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¾€
edbe80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¿¿
edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
𐀀
eda080edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
𐏿
eda080edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿í°€
edadbfedb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿í¿¿
edadbfedbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
󰀀
edae80edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
󰏿
edae80edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
􏰀
edafbfedb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
􏿿
edafbfedbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.22.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
￾
efbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ï¿¿
efbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
🿾
f09fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
🿿
f09fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.5

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
𯿾
f0afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.6

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
𯿿
f0afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.7

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ð¿¿¾
f0bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.8

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ð¿¿¿
f0bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.9

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¾
f18fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.10

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¿
f18fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.11

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񟿾
f19fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.12

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񟿿
f19fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.13

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񯿾
f1afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.14

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񯿿
f1afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.15

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¿¾
f1bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.16

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¿¿
f1bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.17

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¾
f28fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.18

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¿
f28fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.19

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
򟿾
f29fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.20

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
òŸ¿¿
f29fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.21

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
򯿾
f2afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.22

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
򯿿
f2afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.23

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¿¾
f2bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.24

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¿¿
f2bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.25

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¾
f38fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.26

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¿
f38fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.27

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
󟿾
f39fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.28

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
óŸ¿¿
f39fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.29

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
󯿾
f3afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.30

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
󯿿
f3afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.31

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¿¾
f3bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.32

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¿¿
f3bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.33

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¾
f48fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.34

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¿
f48fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.23.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
�
efbfbd

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 7.1.1

- Up -

Case Description

Send a message followed by a close frame

-

Case Expectation

Echoed message followed by clean close with normal code.

-
- -

Case 7.1.2

- Up -

Case Description

Send two close frames

-

Case Expectation

Clean close with normal code. Second close frame ignored.

-
- -

Case 7.1.3

- Up -

Case Description

Send a ping after close message

-

Case Expectation

Clean close with normal code, no pong.

-
- -

Case 7.1.4

- Up -

Case Description

Send text message after sending a close frame.

-

Case Expectation

Clean close with normal code. Text message ignored.

-
- -

Case 7.1.5

- Up -

Case Description

Send message fragment1 followed by close then fragment

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.1.6

- Up -

Case Description

Send 256K message followed by close then a ping

-

Case Expectation

Case outcome depends on implimentation defined close behavior. Message and close frame are sent back to back. If the close frame is processed before the text message write is complete (as can happen in asyncronous processing models) the close frame is processed first and the text message may not be recieved or may only be partially recieved.

-
- -

Case 7.3.1

- Up -

Case Description

Send a close frame with payload length 0 (no close code, no close reason)

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.2

- Up -

Case Description

Send a close frame with payload length 1

-

Case Expectation

Clean close with protocol error or drop TCP.

-
- -

Case 7.3.3

- Up -

Case Description

Send a close frame with payload length 2 (regular close with a code)

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.4

- Up -

Case Description

Send a close frame with close code and close reason

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.5

- Up -

Case Description

Send a close frame with close code and close reason of maximum length (123)

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.6

- Up -

Case Description

Send a close frame with close code and close reason which is too long (124) - total frame payload 126 octets

-

Case Expectation

Clean close with protocol error code or dropped TCP connection.

-
- -

Case 7.5.1

- Up -

Case Description

Send a close frame with invalid UTF8 payload

-

Case Expectation

Clean close with protocol error or invalid utf8 code or dropped TCP.

-
- -

Case 7.7.1

- Up -

Case Description

Send close with valid close code 1000

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.2

- Up -

Case Description

Send close with valid close code 1001

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.3

- Up -

Case Description

Send close with valid close code 1002

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.4

- Up -

Case Description

Send close with valid close code 1003

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.5

- Up -

Case Description

Send close with valid close code 1007

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.6

- Up -

Case Description

Send close with valid close code 1008

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.7

- Up -

Case Description

Send close with valid close code 1009

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.8

- Up -

Case Description

Send close with valid close code 1010

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.9

- Up -

Case Description

Send close with valid close code 1011

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.10

- Up -

Case Description

Send close with valid close code 3000

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.11

- Up -

Case Description

Send close with valid close code 3999

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.12

- Up -

Case Description

Send close with valid close code 4000

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.13

- Up -

Case Description

Send close with valid close code 4999

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.9.1

- Up -

Case Description

Send close with invalid close code 0

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.2

- Up -

Case Description

Send close with invalid close code 999

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.3

- Up -

Case Description

Send close with invalid close code 1004

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.4

- Up -

Case Description

Send close with invalid close code 1005

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.5

- Up -

Case Description

Send close with invalid close code 1006

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.6

- Up -

Case Description

Send close with invalid close code 1012

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.7

- Up -

Case Description

Send close with invalid close code 1013

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.8

- Up -

Case Description

Send close with invalid close code 1014

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.9

- Up -

Case Description

Send close with invalid close code 1015

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.10

- Up -

Case Description

Send close with invalid close code 1016

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.11

- Up -

Case Description

Send close with invalid close code 1100

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.12

- Up -

Case Description

Send close with invalid close code 2000

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.13

- Up -

Case Description

Send close with invalid close code 2999

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.13.1

- Up -

Case Description

Send close with close code 5000

-

Case Expectation

Actual events are undefined by the spec.

-
- -

Case 7.13.2

- Up -

Case Description

Send close with close code 65536

-

Case Expectation

Actual events are undefined by the spec.

-
- -

Case 9.1.1

- Up -

Case Description

Send text message message with payload of length 64 * 2**10 (64k).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.2

- Up -

Case Description

Send text message message with payload of length 256 * 2**10 (256k).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.3

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.4

- Up -

Case Description

Send text message message with payload of length 4 * 2**20 (4M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.5

- Up -

Case Description

Send text message message with payload of length 8 * 2**20 (8M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.6

- Up -

Case Description

Send text message message with payload of length 16 * 2**20 (16M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.2.1

- Up -

Case Description

Send binary message message with payload of length 64 * 2**10 (64k).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.2

- Up -

Case Description

Send binary message message with payload of length 256 * 2**10 (256k).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.3

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.4

- Up -

Case Description

Send binary message message with payload of length 4 * 2**20 (4M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.5

- Up -

Case Description

Send binary message message with payload of length 8 * 2**20 (16M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.6

- Up -

Case Description

Send binary message message with payload of length 16 * 2**20 (16M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.3.1

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.2

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.3

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.4

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 4k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.5

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 16k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.6

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.7

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.8

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1M.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.9

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (8M). Sent out in fragments of 4M.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.4.1

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.2

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.3

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.4

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 4k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.5

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 16k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.6

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.7

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.8

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1M.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.9

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 4M.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.5.1

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 64 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.2

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 128 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.3

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 256 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.4

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 512 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.5

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 1024 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.6

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 2048 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.1

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 64 octets.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.6.2

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 128 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.3

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 256 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.4

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 512 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.5

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 1024 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.6

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 2048 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.7.1

- Up -

Case Description

Send 1000 text messages of payload size 0 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.7.2

- Up -

Case Description

Send 1000 text messages of payload size 16 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.7.3

- Up -

Case Description

Send 1000 text messages of payload size 64 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.7.4

- Up -

Case Description

Send 1000 text messages of payload size 256 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 120 secs.

-
- -

Case 9.7.5

- Up -

Case Description

Send 1000 text messages of payload size 1024 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 240 secs.

-
- -

Case 9.7.6

- Up -

Case Description

Send 1000 text messages of payload size 4096 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 480 secs.

-
- -

Case 9.8.1

- Up -

Case Description

Send 1000 binary messages of payload size 0 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.8.2

- Up -

Case Description

Send 1000 binary messages of payload size 16 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.8.3

- Up -

Case Description

Send 1000 binary messages of payload size 64 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.8.4

- Up -

Case Description

Send 1000 binary messages of payload size 256 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 120 secs.

-
- -

Case 9.8.5

- Up -

Case Description

Send 1000 binary messages of payload size 1024 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 240 secs.

-
- -

Case 9.8.6

- Up -

Case Description

Send 1000 binary messages of payload size 4096 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 480 secs.

-
- -

Case 10.1.1

- Up -

Case Description

Send text message with payload of length 65536 and autoFragmentSize = 1300.

-

Case Expectation

Receive echo'ed text message (with payload as sent and transmitted frame counts as expected). Clean close with normal code.

-
-

- - diff --git a/autobahn reports/servers/index.html b/autobahn reports/servers/index.html deleted file mode 100644 index a5d20b2b4..000000000 --- a/autobahn reports/servers/index.html +++ /dev/null @@ -1,3614 +0,0 @@ - - - - - - - - - -
Toggle Details
- -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

Summary report generated on 2012-02-04T15:47:22Z (UTC) by Autobahn WebSockets v0.4.10.

- - - - - - - - - - - - - - - - - - - - - - -
PassTest case was executed and passed successfully.
Non-StrictTest case was executed and passed non-strictly. - A non-strict behavior is one that does not adhere to a SHOULD-behavior as described in the protocol specification or - a well-defined, canonical behavior that appears to be desirable but left open in the protocol specification. - An implementation with non-strict behavior is still conformant to the protocol specification.
FailTest case was executed and failed. An implementation which fails a test case - other - than a performance/limits related one - is non-conforming to a MUST-behavior as described in the protocol specification.
InfoInformational test case which detects certain implementation behavior left unspecified by the spec - but nevertheless potentially interesting to implementors.
MissingTest case is missing, either because it was skipped via the test suite configuration - or deactivated, i.e. because the implementation does not implement the tested feature or breaks during running - the test case.
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 Framingtootallnate/websocket
1.1 Text Messages
Case 1.1.1PassNone
Case 1.1.2PassNone
Case 1.1.3PassNone
Case 1.1.4PassNone
Case 1.1.5PassNone
Case 1.1.6PassNone
Case 1.1.7PassNone
Case 1.1.8PassNone
1 Framingtootallnate/websocket
1.2 Binary Messages
Case 1.2.1PassNone
Case 1.2.2PassNone
Case 1.2.3PassNone
Case 1.2.4PassNone
Case 1.2.5PassNone
Case 1.2.6PassNone
Case 1.2.7PassNone
Case 1.2.8PassNone
2 Pings/Pongstootallnate/websocket
Case 2.1PassNone
Case 2.2PassNone
Case 2.3PassNone
Case 2.4PassNone
Case 2.5PassNone
Case 2.6PassNone
Case 2.7PassNone
Case 2.8PassNone
Case 2.9PassNone
Case 2.10PassNone
Case 2.11PassNone
3 Reserved Bitstootallnate/websocket
Case 3.1PassNone
Case 3.2Non-StrictNone
Case 3.3PassNone
Case 3.4PassNone
Case 3.5PassNone
Case 3.6PassNone
Case 3.7PassNone
4 Opcodestootallnate/websocket
4.1 Non-control Opcodes
Case 4.1.1PassNone
Case 4.1.2PassNone
Case 4.1.3Non-StrictNone
Case 4.1.4Non-StrictNone
Case 4.1.5PassNone
4 Opcodestootallnate/websocket
4.2 Control Opcodes
Case 4.2.1PassNone
Case 4.2.2PassNone
Case 4.2.3Non-StrictNone
Case 4.2.4Non-StrictNone
Case 4.2.5PassNone
5 Fragmentationtootallnate/websocket
Case 5.1PassNone
Case 5.2PassNone
Case 5.3PassNone
Case 5.4PassNone
Case 5.5PassNone
Case 5.6PassNone
Case 5.7PassNone
Case 5.8PassNone
Case 5.9PassNone
Case 5.10PassNone
Case 5.11PassNone
Case 5.12PassNone
Case 5.13PassNone
Case 5.14PassNone
Case 5.15PassNone
Case 5.16PassNone
Case 5.17PassNone
Case 5.18PassNone
Case 5.19PassNone
Case 5.20PassNone
6 UTF-8 Handlingtootallnate/websocket
6.1 Valid UTF-8 with zero payload fragments
Case 6.1.1PassNone
Case 6.1.2PassNone
Case 6.1.3PassNone
6 UTF-8 Handlingtootallnate/websocket
6.2 Valid UTF-8 unfragmented, fragmented on code-points and within code-points
Case 6.2.1PassNone
Case 6.2.2PassNone
Case 6.2.3PassNone
Case 6.2.4PassNone
6 UTF-8 Handlingtootallnate/websocket
6.3 Invalid UTF-8 differently fragmented
Case 6.3.1FailFail
Case 6.3.2FailFail
6 UTF-8 Handlingtootallnate/websocket
6.4 Fail-fast on invalid UTF-8
Case 6.4.1Non-StrictNone
Case 6.4.2Non-StrictNone
Case 6.4.3Non-StrictNone
Case 6.4.4Non-StrictNone
6 UTF-8 Handlingtootallnate/websocket
6.5 Some valid UTF-8 sequences
Case 6.5.1PassNone
6 UTF-8 Handlingtootallnate/websocket
6.6 All prefixes of a valid UTF-8 string that contains multi-byte code points
Case 6.6.1PassNone
Case 6.6.2PassNone
Case 6.6.3PassNone
Case 6.6.4PassNone
Case 6.6.5PassNone
Case 6.6.6PassNone
Case 6.6.7PassNone
Case 6.6.8PassNone
Case 6.6.9PassNone
Case 6.6.10PassNone
Case 6.6.11PassNone
6 UTF-8 Handlingtootallnate/websocket
6.7 First possible sequence of a certain length
Case 6.7.1PassNone
Case 6.7.2PassNone
Case 6.7.3PassNone
Case 6.7.4PassNone
6 UTF-8 Handlingtootallnate/websocket
6.8 First possible sequence length 5/6 (invalid codepoints)
Case 6.8.1PassNone
Case 6.8.2PassNone
6 UTF-8 Handlingtootallnate/websocket
6.9 Last possible sequence of a certain length
Case 6.9.1PassNone
Case 6.9.2PassNone
Case 6.9.3PassNone
Case 6.9.4PassNone
6 UTF-8 Handlingtootallnate/websocket
6.10 Last possible sequence length 4/5/6 (invalid codepoints)
Case 6.10.1PassNone
Case 6.10.2PassNone
Case 6.10.3PassNone
6 UTF-8 Handlingtootallnate/websocket
6.11 Other boundary conditions
Case 6.11.1PassNone
Case 6.11.2PassNone
Case 6.11.3PassNone
Case 6.11.4PassNone
Case 6.11.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.12 Unexpected continuation bytes
Case 6.12.1PassNone
Case 6.12.2PassNone
Case 6.12.3PassNone
Case 6.12.4PassNone
Case 6.12.5PassNone
Case 6.12.6PassNone
Case 6.12.7PassNone
Case 6.12.8PassNone
6 UTF-8 Handlingtootallnate/websocket
6.13 Lonely start characters
Case 6.13.1PassNone
Case 6.13.2PassNone
Case 6.13.3PassNone
Case 6.13.4PassNone
Case 6.13.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.14 Sequences with last continuation byte missing
Case 6.14.1PassNone
Case 6.14.2PassNone
Case 6.14.3PassNone
Case 6.14.4PassNone
Case 6.14.5PassNone
Case 6.14.6PassNone
Case 6.14.7PassNone
Case 6.14.8PassNone
Case 6.14.9PassNone
Case 6.14.10PassNone
6 UTF-8 Handlingtootallnate/websocket
6.15 Concatenation of incomplete sequences
Case 6.15.1PassNone
6 UTF-8 Handlingtootallnate/websocket
6.16 Impossible bytes
Case 6.16.1PassNone
Case 6.16.2PassNone
Case 6.16.3PassNone
6 UTF-8 Handlingtootallnate/websocket
6.17 Examples of an overlong ASCII character
Case 6.17.1PassNone
Case 6.17.2PassNone
Case 6.17.3PassNone
Case 6.17.4PassNone
Case 6.17.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.18 Maximum overlong sequences
Case 6.18.1PassNone
Case 6.18.2PassNone
Case 6.18.3PassNone
Case 6.18.4PassNone
Case 6.18.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.19 Overlong representation of the NUL character
Case 6.19.1PassNone
Case 6.19.2PassNone
Case 6.19.3PassNone
Case 6.19.4PassNone
Case 6.19.5PassNone
6 UTF-8 Handlingtootallnate/websocket
6.20 Single UTF-16 surrogates
Case 6.20.1FailFail
Case 6.20.2FailFail
Case 6.20.3FailFail
Case 6.20.4FailFail
Case 6.20.5FailFail
Case 6.20.6FailFail
Case 6.20.7FailFail
6 UTF-8 Handlingtootallnate/websocket
6.21 Paired UTF-16 surrogates
Case 6.21.1FailFail
Case 6.21.2FailFail
Case 6.21.3FailFail
Case 6.21.4FailFail
Case 6.21.5FailFail
Case 6.21.6FailFail
Case 6.21.7FailFail
Case 6.21.8FailFail
6 UTF-8 Handlingtootallnate/websocket
6.22 Non-character code points (valid UTF-8)
Case 6.22.1PassNone
Case 6.22.2PassNone
Case 6.22.3PassNone
Case 6.22.4PassNone
Case 6.22.5PassNone
Case 6.22.6PassNone
Case 6.22.7PassNone
Case 6.22.8PassNone
Case 6.22.9PassNone
Case 6.22.10PassNone
Case 6.22.11PassNone
Case 6.22.12PassNone
Case 6.22.13PassNone
Case 6.22.14PassNone
Case 6.22.15PassNone
Case 6.22.16PassNone
Case 6.22.17PassNone
Case 6.22.18PassNone
Case 6.22.19PassNone
Case 6.22.20PassNone
Case 6.22.21PassNone
Case 6.22.22PassNone
Case 6.22.23PassNone
Case 6.22.24PassNone
Case 6.22.25PassNone
Case 6.22.26PassNone
Case 6.22.27PassNone
Case 6.22.28PassNone
Case 6.22.29PassNone
Case 6.22.30PassNone
Case 6.22.31PassNone
Case 6.22.32PassNone
Case 6.22.33PassNone
Case 6.22.34PassNone
6 UTF-8 Handlingtootallnate/websocket
6.23 Unicode replacement character
Case 6.23.1PassNone
7 Close Handlingtootallnate/websocket
7.1 Basic close behavior (fuzzer initiated)
Case 7.1.1PassNone
Case 7.1.2PassNone
Case 7.1.3PassNone
Case 7.1.4PassNone
Case 7.1.5PassNone
Case 7.1.6InfoNone
7 Close Handlingtootallnate/websocket
7.3 Close frame structure: payload length (fuzzer initiated)
Case 7.3.1PassNone
Case 7.3.2PassNone
Case 7.3.3PassNone
Case 7.3.4PassNone
Case 7.3.5PassNone
Case 7.3.6PassNone
7 Close Handlingtootallnate/websocket
7.5 Close frame structure: payload value (fuzzer initiated)
Case 7.5.1PassNone
7 Close Handlingtootallnate/websocket
7.7 Close frame structure: valid close codes (fuzzer initiated)
Case 7.7.1PassNone
Case 7.7.2PassNone
Case 7.7.3PassNone
Case 7.7.4PassNone
Case 7.7.5PassNone
Case 7.7.6PassNone
Case 7.7.7PassNone
Case 7.7.8PassNone
Case 7.7.9PassNone
Case 7.7.10PassNone
Case 7.7.11PassNone
Case 7.7.12PassNone
Case 7.7.13PassNone
7 Close Handlingtootallnate/websocket
7.9 Close frame structure: invalid close codes (fuzzer initiated)
Case 7.9.1PassNone
Case 7.9.2PassNone
Case 7.9.3PassNone
Case 7.9.4PassNone
Case 7.9.5PassNone
Case 7.9.6PassNone
Case 7.9.7PassNone
Case 7.9.8PassNone
Case 7.9.9PassNone
Case 7.9.10PassNone
Case 7.9.11PassNone
Case 7.9.12PassNone
Case 7.9.13PassNone
7 Close Handlingtootallnate/websocket
7.13 Informational close information (fuzzer initiated)
Case 7.13.1InfoNone
Case 7.13.2InfoNone
9 Limits/Performancetootallnate/websocket
9.1 Text Message (increasing size)
Case 9.1.1Pass
67 ms
None
Case 9.1.2Pass
260 ms
None
Case 9.1.3Pass
1042 ms
None
Case 9.1.4Pass
4180 ms
None
Case 9.1.5Pass
8364 ms
None
Case 9.1.6Pass
16993 ms
None
9 Limits/Performancetootallnate/websocket
9.2 Binary Message (increasing size)
Case 9.2.1Pass
39 ms
None
Case 9.2.2Pass
85 ms
None
Case 9.2.3Pass
338 ms
None
Case 9.2.4Pass
1375 ms
None
Case 9.2.5Pass
2740 ms
None
Case 9.2.6Pass
5554 ms
None
9 Limits/Performancetootallnate/websocket
9.3 Fragmented Text Message (fixed size, increasing fragment size)
Case 9.3.1Pass
70578 ms
None
Case 9.3.2Pass
20991 ms
None
Case 9.3.3Pass
8471 ms
None
Case 9.3.4Pass
5286 ms
None
Case 9.3.5Pass
4403 ms
None
Case 9.3.6Pass
4160 ms
None
Case 9.3.7Pass
4123 ms
None
Case 9.3.8Pass
4096 ms
None
Case 9.3.9Pass
4074 ms
None
9 Limits/Performancetootallnate/websocket
9.4 Fragmented Binary Message (fixed size, increasing fragment size)
Case 9.4.1Pass
69384 ms
None
Case 9.4.2Pass
17962 ms
None
Case 9.4.3Pass
5637 ms
None
Case 9.4.4Pass
2497 ms
None
Case 9.4.5Pass
1597 ms
None
Case 9.4.6Pass
1359 ms
None
Case 9.4.7Pass
1299 ms
None
Case 9.4.8Pass
1296 ms
None
Case 9.4.9Pass
1273 ms
None
9 Limits/Performancetootallnate/websocket
9.5 Text Message (fixed size, increasing chop size)
Case 9.5.1Pass
17529 ms
None
Case 9.5.2Pass
9293 ms
None
Case 9.5.3Pass
5166 ms
None
Case 9.5.4Pass
3168 ms
None
Case 9.5.5Pass
2137 ms
None
Case 9.5.6Pass
1571 ms
None
9 Limits/Performancetootallnate/websocket
9.6 Binary Text Message (fixed size, increasing chop size)
Case 9.6.1Pass
16825 ms
None
Case 9.6.2Pass
8639 ms
None
Case 9.6.3Pass
4504 ms
None
Case 9.6.4Pass
2434 ms
None
Case 9.6.5Pass
1461 ms
None
Case 9.6.6Pass
909 ms
None
9 Limits/Performancetootallnate/websocket
9.7 Text Message Roundtrip Time (fixed number, increasing size)
Case 9.7.1Pass
267 ms
None
Case 9.7.2Pass
289 ms
None
Case 9.7.3Pass
321 ms
None
Case 9.7.4Pass
551 ms
None
Case 9.7.5Pass
1435 ms
None
Case 9.7.6Pass
4887 ms
None
9 Limits/Performancetootallnate/websocket
9.8 Binary Message Roundtrip Time (fixed number, increasing size)
Case 9.8.1Pass
227 ms
None
Case 9.8.2Pass
259 ms
None
Case 9.8.3Pass
255 ms
None
Case 9.8.4Pass
355 ms
None
Case 9.8.5Pass
636 ms
None
Case 9.8.6Pass
1940 ms
None
10 Autobahn Protocol Optionstootallnate/websocket
10.1 Auto-Fragmentation
Case 10.1.1PassNone
-

-
-
- -

Case 1.1.1

- Up -

Case Description

Send text message with payload 0.

-

Case Expectation

Receive echo'ed text message (with empty payload). Clean close with normal code.

-
- -

Case 1.1.2

- Up -

Case Description

Send text message message with payload of length 125.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.3

- Up -

Case Description

Send text message message with payload of length 126.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.4

- Up -

Case Description

Send text message message with payload of length 127.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.5

- Up -

Case Description

Send text message message with payload of length 128.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.6

- Up -

Case Description

Send text message message with payload of length 65535.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.7

- Up -

Case Description

Send text message message with payload of length 65536.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.1.8

- Up -

Case Description

Send text message message with payload of length 65536. Sent out data in chops of 997 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.1

- Up -

Case Description

Send binary message with payload 0.

-

Case Expectation

Receive echo'ed binary message (with empty payload). Clean close with normal code.

-
- -

Case 1.2.2

- Up -

Case Description

Send binary message message with payload of length 125.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.3

- Up -

Case Description

Send binary message message with payload of length 126.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.4

- Up -

Case Description

Send binary message message with payload of length 127.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.5

- Up -

Case Description

Send binary message message with payload of length 128.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.6

- Up -

Case Description

Send binary message message with payload of length 65535.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.7

- Up -

Case Description

Send binary message message with payload of length 65536.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 1.2.8

- Up -

Case Description

Send binary message message with payload of length 65536. Sent out data in chops of 997 octets.

-

Case Expectation

Receive echo'ed binary message (with payload as sent). Clean close with normal code.

-
- -

Case 2.1

- Up -

Case Description

Send ping without payload.

-

Case Expectation

Pong (with empty payload) is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.2

- Up -

Case Description

Send ping with small text payload.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.3

- Up -

Case Description

Send ping with small binary (non UTF-8) payload.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.4

- Up -

Case Description

Send ping with binary payload of 125 octets.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Clean close with normal code.

-
- -

Case 2.5

- Up -

Case Description

Send ping with binary payload of 126 octets.

-

Case Expectation

Connection is failed immediately (1002/Protocol Error), since control frames are only allowed to have payload up to and including 125 octets..

-
- -

Case 2.6

- Up -

Case Description

Send ping with binary payload of 125 octets, send in octet-wise chops.

-

Case Expectation

Pong with payload echo'ed is sent in reply to Ping. Implementations must be TCP clean. Clean close with normal code.

-
- -

Case 2.7

- Up -

Case Description

Send unsolicited pong without payload. Verify nothing is received. Clean close with normal code.

-

Case Expectation

Nothing.

-
- -

Case 2.8

- Up -

Case Description

Send unsolicited pong with payload. Verify nothing is received. Clean close with normal code.

-

Case Expectation

Nothing.

-
- -

Case 2.9

- Up -

Case Description

Send unsolicited pong with payload. Send ping with payload. Verify pong for ping is received.

-

Case Expectation

Nothing in reply to own Pong, but Pong with payload echo'ed in reply to Ping. Clean close with normal code.

-
- -

Case 2.10

- Up -

Case Description

Send 10 Pings with payload.

-

Case Expectation

Pongs for our Pings with all the payloads. Note: This is not required by the Spec .. but we check for this behaviour anyway. Clean close with normal code.

-
- -

Case 2.11

- Up -

Case Description

Send 10 Pings with payload. Send out octets in octet-wise chops.

-

Case Expectation

Pongs for our Pings with all the payloads. Note: This is not required by the Spec .. but we check for this behaviour anyway. Clean close with normal code.

-
- -

Case 3.1

- Up -

Case Description

Send small text message with RSV = 1.

-

Case Expectation

The connection is failed immediately (1002/protocol error), since RSV must be 0, when no extension defining RSV meaning has been negoiated.

-
- -

Case 3.2

- Up -

Case Description

Send small text message, then send again with RSV = 2, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since RSV must be 0, when no extension defining RSV meaning has been negoiated. The Pong is not received.

-
- -

Case 3.3

- Up -

Case Description

Send small text message, then send again with RSV = 3, then send Ping. Octets are sent in frame-wise chops. Octets are sent in octet-wise chops.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since RSV must be 0, when no extension defining RSV meaning has been negoiated. The Pong is not received.

-
- -

Case 3.4

- Up -

Case Description

Send small text message, then send again with RSV = 4, then send Ping. Octets are sent in octet-wise chops.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since RSV must be 0, when no extension defining RSV meaning has been negoiated. The Pong is not received.

-
- -

Case 3.5

- Up -

Case Description

Send small binary message with RSV = 5.

-

Case Expectation

The connection is failed immediately, since RSV must be 0.

-
- -

Case 3.6

- Up -

Case Description

Send Ping with RSV = 6.

-

Case Expectation

The connection is failed immediately, since RSV must be 0.

-
- -

Case 3.7

- Up -

Case Description

Send Close with RSV = 7.

-

Case Expectation

The connection is failed immediately, since RSV must be 0.

-
- -

Case 4.1.1

- Up -

Case Description

Send frame with reserved non-control Opcode = 3.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.1.2

- Up -

Case Description

Send frame with reserved non-control Opcode = 4 and non-empty payload.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.1.3

- Up -

Case Description

Send small text message, then send frame with reserved non-control Opcode = 5, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.1.4

- Up -

Case Description

Send small text message, then send frame with reserved non-control Opcode = 6 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.1.5

- Up -

Case Description

Send small text message, then send frame with reserved non-control Opcode = 7 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.2.1

- Up -

Case Description

Send frame with reserved control Opcode = 11.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.2.2

- Up -

Case Description

Send frame with reserved control Opcode = 12 and non-empty payload.

-

Case Expectation

The connection is failed immediately.

-
- -

Case 4.2.3

- Up -

Case Description

Send small text message, then send frame with reserved control Opcode = 13, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.2.4

- Up -

Case Description

Send small text message, then send frame with reserved control Opcode = 14 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 4.2.5

- Up -

Case Description

Send small text message, then send frame with reserved control Opcode = 15 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

-
- -

Case 5.1

- Up -

Case Description

Send Ping fragmented into 2 fragments.

-

Case Expectation

Connection is failed immediately, since control message MUST NOT be fragmented.

-
- -

Case 5.2

- Up -

Case Description

Send Pong fragmented into 2 fragments.

-

Case Expectation

Connection is failed immediately, since control message MUST NOT be fragmented.

-
- -

Case 5.3

- Up -

Case Description

Send text Message fragmented into 2 fragments.

-

Case Expectation

Message is processed and echo'ed back to us.

-
- -

Case 5.4

- Up -

Case Description

Send text Message fragmented into 2 fragments, octets are sent in frame-wise chops.

-

Case Expectation

Message is processed and echo'ed back to us.

-
- -

Case 5.5

- Up -

Case Description

Send text Message fragmented into 2 fragments, octets are sent in octet-wise chops.

-

Case Expectation

Message is processed and echo'ed back to us.

-
- -

Case 5.6

- Up -

Case Description

Send text Message fragmented into 2 fragments, one ping with payload in-between.

-

Case Expectation

A pong is received, then the message is echo'ed back to us.

-
- -

Case 5.7

- Up -

Case Description

Send text Message fragmented into 2 fragments, one ping with payload in-between. Octets are sent in frame-wise chops.

-

Case Expectation

A pong is received, then the message is echo'ed back to us.

-
- -

Case 5.8

- Up -

Case Description

Send text Message fragmented into 2 fragments, one ping with payload in-between. Octets are sent in octet-wise chops.

-

Case Expectation

A pong is received, then the message is echo'ed back to us.

-
- -

Case 5.9

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = true, where there is nothing to continue, sent in one chop.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.10

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = true, where there is nothing to continue, sent in per-frame chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.11

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = true, where there is nothing to continue, sent in octet-wise chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.12

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = false, where there is nothing to continue, sent in one chop.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.13

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = false, where there is nothing to continue, sent in per-frame chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.14

- Up -

Case Description

Send unfragmented Text Message after Continuation Frame with FIN = false, where there is nothing to continue, sent in octet-wise chops.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.15

- Up -

Case Description

Send text Message fragmented into 2 fragments, then Continuation Frame with FIN = false where there is nothing to continue, then unfragmented Text Message, all sent in one chop.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.16

- Up -

Case Description

Repeated 2x: Continuation Frame with FIN = false (where there is nothing to continue), then text Message fragmented into 2 fragments.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.17

- Up -

Case Description

Repeated 2x: Continuation Frame with FIN = true (where there is nothing to continue), then text Message fragmented into 2 fragments.

-

Case Expectation

The connection is failed immediately, since there is no message to continue.

-
- -

Case 5.18

- Up -

Case Description

Send text Message fragmented into 2 fragments, with both frame opcodes set to text, sent in one chop.

-

Case Expectation

The connection is failed immediately, since all data frames after the initial data frame must have opcode 0.

-
- -

Case 5.19

- Up -

Case Description

A fragmented text message is sent in multiple frames. After - sending the first 2 frames of the text message, a Ping is sent. Then we wait 1s, - then we send 2 more text fragments, another Ping and then the final text fragment. - Everything is legal.

-

Case Expectation

The peer immediately answers the first Ping before - it has received the last text message fragment. The peer pong's back the Ping's - payload exactly, and echo's the payload of the fragmented message back to us.

-
- -

Case 5.20

- Up -

Case Description

Same as Case 5.19, but send all frames with SYNC = True. - Note, this does not change the octets sent in any way, only how the stream - is chopped up on the wire.

-

Case Expectation

Same as Case 5.19. Implementations must be agnostic to how - octet stream is chopped up on wire (must be TCP clean).

-
- -

Case 6.1.1

- Up -

Case Description

Send text message of length 0.

-

Case Expectation

A message is echo'ed back to us (with empty payload).

-
- -

Case 6.1.2

- Up -

Case Description

Send fragmented text message, 3 fragments each of length 0.

-

Case Expectation

A message is echo'ed back to us (with empty payload).

-
- -

Case 6.1.3

- Up -

Case Description

Send fragmented text message, 3 fragments, first and last of length 0, middle non-empty.

-

Case Expectation

A message is echo'ed back to us (with payload = payload of middle fragment).

-
- -

Case 6.2.1

- Up -

Case Description

Send a valid UTF-8 text message in one fragment.

MESSAGE:
Hello-µ@ßöäüàá-UTF-8!!
48656c6c6f2dc2b540c39fc3b6c3a4c3bcc3a0c3a12d5554462d382121

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.2.2

- Up -

Case Description

Send a valid UTF-8 text message in two fragments, fragmented on UTF-8 code point boundary.

MESSAGE FRAGMENT 1:
Hello-µ@ßöä
48656c6c6f2dc2b540c39fc3b6c3a4

MESSAGE FRAGMENT 2:
üàá-UTF-8!!
c3bcc3a0c3a12d5554462d382121

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.2.3

- Up -

Case Description

Send a valid UTF-8 text message in fragments of 1 octet, resulting in frames ending on positions which are not code point ends.

MESSAGE:
Hello-µ@ßöäüàá-UTF-8!!
48656c6c6f2dc2b540c39fc3b6c3a4c3bcc3a0c3a12d5554462d382121

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.2.4

- Up -

Case Description

Send a valid UTF-8 text message in fragments of 1 octet, resulting in frames ending on positions which are not code point ends.

MESSAGE:
κόσμε
cebae1bdb9cf83cebcceb5

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.3.1

- Up -

Case Description

Send invalid UTF-8 text message unfragmented.

MESSAGE:
Îºá½¹ÏƒÎ¼Îµí €edited
cebae1bdb9cf83cebcceb5eda080656469746564

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.3.2

- Up -

Case Description

Send invalid UTF-8 text message in fragments of 1 octet, resulting in frames ending on positions which are not code point ends.

MESSAGE:
Îºá½¹ÏƒÎ¼Îµí €edited
cebae1bdb9cf83cebcceb5eda080656469746564

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.4.1

- Up -

Case Description

Send invalid UTF-8 text message in 3 fragments (frames). -First frame payload is valid, then wait, then 2nd frame which contains the payload making the sequence invalid, then wait, then 3rd frame with rest. -Note that PART1 and PART3 are valid UTF-8 in themselves, PART2 is a 0x11000 encoded as in the UTF-8 integer encoding scheme, but the codepoint is invalid (out of range). -

MESSAGE PARTS:
-PART1 = κόσμε (cebae1bdb9cf83cebcceb5)
-PART2 = ô€€ (f4908080)
-PART3 = edited (656469746564)
-

-

Case Expectation

The first frame is accepted, we expect to timeout on the first wait. The 2nd frame should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.4.2

- Up -

Case Description

Same as Case 6.4.1, but in 2nd frame, we send only up to and including the octet making the complete payload invalid. -

MESSAGE PARTS:
-PART1 = κόσμεô (cebae1bdb9cf83cebcceb5f4)
-PART2 = (90)
-PART3 = €€edited (8080656469746564)
-

-

Case Expectation

The first frame is accepted, we expect to timeout on the first wait. The 2nd frame should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.4.3

- Up -

Case Description

Same as Case 6.4.1, but we send message not in 3 frames, but in 3 chops of the same message frame. -

MESSAGE PARTS:
-PART1 = κόσμε (cebae1bdb9cf83cebcceb5)
-PART2 = ô€€ (f4908080)
-PART3 = edited (656469746564)
-

-

Case Expectation

The first chop is accepted, we expect to timeout on the first wait. The 2nd chop should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.4.4

- Up -

Case Description

Same as Case 6.4.2, but we send message not in 3 frames, but in 3 chops of the same message frame. -

MESSAGE PARTS:
-PART1 = κόσμεô (cebae1bdb9cf83cebcceb5f4)
-PART2 = (90)
-PART3 = ()
-

-

Case Expectation

The first chop is accepted, we expect to timeout on the first wait. The 2nd chop should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

-
- -

Case 6.5.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσμε
cebae1bdb9cf83cebcceb5

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
Î
ce

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κ
ceba

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
뼇
cebae1

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κá½
cebae1bd

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.5

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κό
cebae1bdb9

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κόÏ
cebae1bdb9cf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.7

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσ
cebae1bdb9cf83

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κόσÎ
cebae1bdb9cf83ce

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.9

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσμ
cebae1bdb9cf83cebc

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.6.10

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
κόσμÎ
cebae1bdb9cf83cebcce

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.6.11

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσμε
cebae1bdb9cf83cebcceb5

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:

00

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
€
c280

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
à €
e0a080

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.7.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ð€€
f0908080

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.8.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
øˆ€€€
f888808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.8.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü„€€€€
fc8480808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.9.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:

7f

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.9.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ß¿
dfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.9.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ï¿¿
efbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.9.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¿
f48fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.10.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
÷¿¿¿
f7bfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.10.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
û¿¿¿¿
fbbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.10.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ý¿¿¿¿¿
fdbfbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.11.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
퟿
ed9fbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:

ee8080

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
�
efbfbd

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¿
f48fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.11.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ô€€
f4908080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:

80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
¿
bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿
80bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€
80bf80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€¿
80bf80bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€¿€
80bf80bf80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€¿€¿€¿
80bf80bf80bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.12.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾
808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbe

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ
c020c120c220c320c420c520c620c720c820c920ca20cb20cc20cd20ce20cf20d020d120d220d320d420d520d620d720d820d920da20db20dc20dd20de20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à á â ã ä å æ ç è é ê ë ì í î
e020e120e220e320e420e520e620e720e820e920ea20eb20ec20ed20ee20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð ñ ò ó ô õ ö
f020f120f220f320f420f520f620

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø ù ú
f820f920fa20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.13.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü
fc20

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À
c0

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à€
e080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð€€
f08080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø€€€
f8808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü€€€€
fc80808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ß
df

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ï¿
efbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
÷¿¿
f7bfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.9

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
û¿¿¿
fbbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.14.10

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ý¿¿¿¿
fdbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.15.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
Àà€ð€€ø€€€ü€€€€ßï¿÷¿¿û¿¿¿ý¿¿¿¿
c0e080f08080f8808080fc80808080dfefbff7bfbffbbfbfbffdbfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.16.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
þ
fe

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.16.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ÿ
ff

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.16.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
þþÿÿ
fefeffff

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À¯
c0af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à€¯
e080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð€€¯
f08080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø€€€¯
f8808080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.17.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü€€€€¯
fc80808080af

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
Á¿
c1bf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
àŸ¿
e09fbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð¿¿
f08fbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø‡¿¿¿
f887bfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.18.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
üƒ¿¿¿¿
fc83bfbfbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
À€
c080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
à€€
e08080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ð€€€
f0808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ø€€€€
f880808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.19.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
ü€€€€€
fc8080808080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í €
eda080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿
edadbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í®€
edae80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¯¿
edafbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í°€
edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¾€
edbe80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.20.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¿¿
edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.1

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
𐀀
eda080edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.2

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
𐏿
eda080edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.3

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿í°€
edadbfedb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.4

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿í¿¿
edadbfedbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.5

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
󰀀
edae80edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.6

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
󰏿
edae80edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.7

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
􏰀
edafbfedb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.21.8

- Up -

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
􏿿
edafbfedbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

-
- -

Case 6.22.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
￾
efbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.2

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ï¿¿
efbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.3

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
🿾
f09fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.4

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
🿿
f09fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.5

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
𯿾
f0afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.6

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
𯿿
f0afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.7

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ð¿¿¾
f0bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.8

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ð¿¿¿
f0bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.9

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¾
f18fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.10

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¿
f18fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.11

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񟿾
f19fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.12

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񟿿
f19fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.13

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񯿾
f1afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.14

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
񯿿
f1afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.15

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¿¾
f1bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.16

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ñ¿¿¿
f1bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.17

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¾
f28fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.18

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¿
f28fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.19

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
򟿾
f29fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.20

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
òŸ¿¿
f29fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.21

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
򯿾
f2afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.22

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
򯿿
f2afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.23

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¿¾
f2bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.24

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ò¿¿¿
f2bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.25

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¾
f38fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.26

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¿
f38fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.27

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
󟿾
f39fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.28

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
óŸ¿¿
f39fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.29

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
󯿾
f3afbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.30

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
󯿿
f3afbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.31

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¿¾
f3bfbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.32

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ó¿¿¿
f3bfbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.33

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¾
f48fbfbe

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.22.34

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
ô¿¿
f48fbfbf

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 6.23.1

- Up -

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
�
efbfbd

-

Case Expectation

The message is echo'ed back to us.

-
- -

Case 7.1.1

- Up -

Case Description

Send a message followed by a close frame

-

Case Expectation

Echoed message followed by clean close with normal code.

-
- -

Case 7.1.2

- Up -

Case Description

Send two close frames

-

Case Expectation

Clean close with normal code. Second close frame ignored.

-
- -

Case 7.1.3

- Up -

Case Description

Send a ping after close message

-

Case Expectation

Clean close with normal code, no pong.

-
- -

Case 7.1.4

- Up -

Case Description

Send text message after sending a close frame.

-

Case Expectation

Clean close with normal code. Text message ignored.

-
- -

Case 7.1.5

- Up -

Case Description

Send message fragment1 followed by close then fragment

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.1.6

- Up -

Case Description

Send 256K message followed by close then a ping

-

Case Expectation

Case outcome depends on implimentation defined close behavior. Message and close frame are sent back to back. If the close frame is processed before the text message write is complete (as can happen in asyncronous processing models) the close frame is processed first and the text message may not be recieved or may only be partially recieved.

-
- -

Case 7.3.1

- Up -

Case Description

Send a close frame with payload length 0 (no close code, no close reason)

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.2

- Up -

Case Description

Send a close frame with payload length 1

-

Case Expectation

Clean close with protocol error or drop TCP.

-
- -

Case 7.3.3

- Up -

Case Description

Send a close frame with payload length 2 (regular close with a code)

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.4

- Up -

Case Description

Send a close frame with close code and close reason

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.5

- Up -

Case Description

Send a close frame with close code and close reason of maximum length (123)

-

Case Expectation

Clean close with normal code.

-
- -

Case 7.3.6

- Up -

Case Description

Send a close frame with close code and close reason which is too long (124) - total frame payload 126 octets

-

Case Expectation

Clean close with protocol error code or dropped TCP connection.

-
- -

Case 7.5.1

- Up -

Case Description

Send a close frame with invalid UTF8 payload

-

Case Expectation

Clean close with protocol error or invalid utf8 code or dropped TCP.

-
- -

Case 7.7.1

- Up -

Case Description

Send close with valid close code 1000

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.2

- Up -

Case Description

Send close with valid close code 1001

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.3

- Up -

Case Description

Send close with valid close code 1002

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.4

- Up -

Case Description

Send close with valid close code 1003

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.5

- Up -

Case Description

Send close with valid close code 1007

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.6

- Up -

Case Description

Send close with valid close code 1008

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.7

- Up -

Case Description

Send close with valid close code 1009

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.8

- Up -

Case Description

Send close with valid close code 1010

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.9

- Up -

Case Description

Send close with valid close code 1011

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.10

- Up -

Case Description

Send close with valid close code 3000

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.11

- Up -

Case Description

Send close with valid close code 3999

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.12

- Up -

Case Description

Send close with valid close code 4000

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.7.13

- Up -

Case Description

Send close with valid close code 4999

-

Case Expectation

Clean close with normal or echoed code

-
- -

Case 7.9.1

- Up -

Case Description

Send close with invalid close code 0

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.2

- Up -

Case Description

Send close with invalid close code 999

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.3

- Up -

Case Description

Send close with invalid close code 1004

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.4

- Up -

Case Description

Send close with invalid close code 1005

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.5

- Up -

Case Description

Send close with invalid close code 1006

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.6

- Up -

Case Description

Send close with invalid close code 1012

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.7

- Up -

Case Description

Send close with invalid close code 1013

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.8

- Up -

Case Description

Send close with invalid close code 1014

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.9

- Up -

Case Description

Send close with invalid close code 1015

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.10

- Up -

Case Description

Send close with invalid close code 1016

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.11

- Up -

Case Description

Send close with invalid close code 1100

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.12

- Up -

Case Description

Send close with invalid close code 2000

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.9.13

- Up -

Case Description

Send close with invalid close code 2999

-

Case Expectation

Clean close with protocol error code or drop TCP

-
- -

Case 7.13.1

- Up -

Case Description

Send close with close code 5000

-

Case Expectation

Actual events are undefined by the spec.

-
- -

Case 7.13.2

- Up -

Case Description

Send close with close code 65536

-

Case Expectation

Actual events are undefined by the spec.

-
- -

Case 9.1.1

- Up -

Case Description

Send text message message with payload of length 64 * 2**10 (64k).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.2

- Up -

Case Description

Send text message message with payload of length 256 * 2**10 (256k).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.3

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.4

- Up -

Case Description

Send text message message with payload of length 4 * 2**20 (4M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.5

- Up -

Case Description

Send text message message with payload of length 8 * 2**20 (8M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.1.6

- Up -

Case Description

Send text message message with payload of length 16 * 2**20 (16M).

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.2.1

- Up -

Case Description

Send binary message message with payload of length 64 * 2**10 (64k).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.2

- Up -

Case Description

Send binary message message with payload of length 256 * 2**10 (256k).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.3

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.4

- Up -

Case Description

Send binary message message with payload of length 4 * 2**20 (4M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.5

- Up -

Case Description

Send binary message message with payload of length 8 * 2**20 (16M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.2.6

- Up -

Case Description

Send binary message message with payload of length 16 * 2**20 (16M).

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.3.1

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.2

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.3

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.4

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 4k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.5

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 16k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.6

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.7

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256k.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.8

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1M.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.3.9

- Up -

Case Description

Send fragmented text message message with message payload of length 4 * 2**20 (8M). Sent out in fragments of 4M.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.4.1

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.2

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.3

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.4

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 4k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.5

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 16k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.6

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 64k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.7

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 256k.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.8

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 1M.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.4.9

- Up -

Case Description

Send fragmented binary message message with message payload of length 4 * 2**20 (4M). Sent out in fragments of 4M.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.5.1

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 64 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.2

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 128 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.3

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 256 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.4

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 512 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.5

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 1024 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.5.6

- Up -

Case Description

Send text message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 2048 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.1

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 64 octets.

-

Case Expectation

Receive echo'ed binary message (with payload as sent).

-
- -

Case 9.6.2

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 128 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.3

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 256 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.4

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 512 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.5

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 1024 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.6.6

- Up -

Case Description

Send binary message message with payload of length 1 * 2**20 (1M). Sent out data in chops of 2048 octets.

-

Case Expectation

Receive echo'ed text message (with payload as sent).

-
- -

Case 9.7.1

- Up -

Case Description

Send 1000 text messages of payload size 0 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.7.2

- Up -

Case Description

Send 1000 text messages of payload size 16 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.7.3

- Up -

Case Description

Send 1000 text messages of payload size 64 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.7.4

- Up -

Case Description

Send 1000 text messages of payload size 256 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 120 secs.

-
- -

Case 9.7.5

- Up -

Case Description

Send 1000 text messages of payload size 1024 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 240 secs.

-
- -

Case 9.7.6

- Up -

Case Description

Send 1000 text messages of payload size 4096 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed text messages (with payload as sent). Timeout case after 480 secs.

-
- -

Case 9.8.1

- Up -

Case Description

Send 1000 binary messages of payload size 0 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.8.2

- Up -

Case Description

Send 1000 binary messages of payload size 16 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.8.3

- Up -

Case Description

Send 1000 binary messages of payload size 64 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 60 secs.

-
- -

Case 9.8.4

- Up -

Case Description

Send 1000 binary messages of payload size 256 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 120 secs.

-
- -

Case 9.8.5

- Up -

Case Description

Send 1000 binary messages of payload size 1024 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 240 secs.

-
- -

Case 9.8.6

- Up -

Case Description

Send 1000 binary messages of payload size 4096 to measure implementation/network RTT (round trip time) / latency.

-

Case Expectation

Receive echo'ed binary messages (with payload as sent). Timeout case after 480 secs.

-
- -

Case 10.1.1

- Up -

Case Description

Send text message with payload of length 65536 and autoFragmentSize = 1300.

-

Case Expectation

Receive echo'ed text message (with payload as sent and transmitted frame counts as expected). Clean close with normal code.

-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_3_2.html b/autobahn reports/servers/tootallnate_websocket_case_3_2.html deleted file mode 100644 index 81b697dde..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_3_2.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 3.2 : Non-Strict - 2 ms @ 2012-02-04T15:41:06Z

-

Case Description

Send small text message, then send again with RSV = 2, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since RSV must be 0, when no extension defining RSV meaning has been negoiated. The Pong is not received.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [], 'OK': [('message', 'Hello, world!', False)]}

- Observed:
[] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: naQpeQXM16oTsQGgFhzkCw==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: GWrmDJGkZekAGDtxltB9SFScv/0=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - -
Chop SizeCountOctets
616
818
19238
2011201
Total5253
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - - -
OpcodeCount
12
81
91
Total4
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a206e615170
-
               6551584d31366f547351476746687a6b43773d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20475772
-
               6d444a476b5a656b41474474786c74423953465363762f303d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=c8e7cd39, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
003 TX OCTETS: 818dc8e7cd398082a155a7cbed4ea795a15de9
-
004 TX FRAME : OPCODE=1, FIN=True, RSV=2, MASK=48cf9b10, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
005 TX OCTETS: a18d48cf9b1000aaf77c27e3bb6727bdf77469
-
006 TX FRAME : OPCODE=9, FIN=True, RSV=0, MASK=ba7b6257, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
007 TX OCTETS: 8980ba7b6257
-
008 FAIL CONNECTION AFTER 1.000000 sec
-
009 RX OCTETS: 8800
-
010 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
011 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=c2125d8a, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
012 TX OCTETS: 8882c2125d8ac1fa
-
013 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_4_1_3.html b/autobahn reports/servers/tootallnate_websocket_case_4_1_3.html deleted file mode 100644 index ed037118d..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_4_1_3.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 4.1.3 : Non-Strict - 2 ms @ 2012-02-04T15:41:06Z

-

Case Description

Send small text message, then send frame with reserved non-control Opcode = 5, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [], 'OK': [('message', 'Hello, world!', False)]}

- Observed:
[] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: xsPC4lQvjb4PhpJeBNWHdQ==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: ZT0DfgjT9h2dF3tlZwQbiVc8r5s=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - -
Chop SizeCountOctets
6212
818
19119
2011201
Total5240
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - - - -
OpcodeCount
11
51
81
91
Total4
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2078735043
-
               346c51766a62345068704a65424e574864513d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a205a5430
-
               4466676a54396832644633746c5a775162695663387235733d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=c591fc05, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
003 TX OCTETS: 818dc591fc058df49069aabddc72aae39061e4
-
004 TX FRAME : OPCODE=5, FIN=True, RSV=0, MASK=245c9b85, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
005 TX OCTETS: 8580245c9b85
-
006 TX FRAME : OPCODE=9, FIN=True, RSV=0, MASK=235abec4, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
007 TX OCTETS: 8980235abec4
-
008 FAIL CONNECTION AFTER 1.000000 sec
-
009 RX OCTETS: 8800
-
010 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
011 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=3b961406, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
012 TX OCTETS: 88823b961406387e
-
013 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_4_1_4.html b/autobahn reports/servers/tootallnate_websocket_case_4_1_4.html deleted file mode 100644 index 534afc19b..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_4_1_4.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 4.1.4 : Non-Strict - 2 ms @ 2012-02-04T15:41:06Z

-

Case Description

Send small text message, then send frame with reserved non-control Opcode = 6 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [], 'OK': [('message', 'Hello, world!', False)]}

- Observed:
[] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: lWjk0P7OM1q+JBUPL0HfZA==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: d7k1A19qGfNKwuf0DJJ9pJTFpII=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - -
Chop SizeCountOctets
616
818
19238
2011201
Total5253
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - - - -
OpcodeCount
11
61
81
91
Total4
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a206c576a6b
-
               3050374f4d31712b4a4255504c3048665a413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a2064376b
-
               314131397147664e4b77756630444a4a39704a54467049493d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=45843e64, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
003 TX OCTETS: 818d45843e640de152082aa81e132af6520064
-
004 TX FRAME : OPCODE=6, FIN=True, RSV=0, MASK=fa380a4b, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
005 TX OCTETS: 868dfa380a4bb25d662795142a3c954a662fdb
-
006 TX FRAME : OPCODE=9, FIN=True, RSV=0, MASK=cfe1af5c, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
007 TX OCTETS: 8980cfe1af5c
-
008 FAIL CONNECTION AFTER 1.000000 sec
-
009 RX OCTETS: 8800
-
010 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
011 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=4f85959a, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
012 TX OCTETS: 88824f85959a4c6d
-
013 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_4_2_3.html b/autobahn reports/servers/tootallnate_websocket_case_4_2_3.html deleted file mode 100644 index 815e80255..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_4_2_3.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 4.2.3 : Non-Strict - 3 ms @ 2012-02-04T15:41:06Z

-

Case Description

Send small text message, then send frame with reserved control Opcode = 13, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [], 'OK': [('message', 'Hello, world!', False)]}

- Observed:
[] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: QWLCYu7pAj1LS5HIqlz7mg==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: ctI9BeFJRgdrhJO7B0QsoaPVOkI=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - -
Chop SizeCountOctets
6212
818
19119
2011201
Total5240
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - - - -
OpcodeCount
11
81
91
131
Total4
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2051574c43
-
               59753770416a314c53354849716c7a376d673d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20637449
-
               394265464a52676472684a4f37423051736f6150564f6b493d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=24435521, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
003 TX OCTETS: 818d244355216c26394d4b6f75564b31394505
-
004 TX FRAME : OPCODE=13, FIN=True, RSV=0, MASK=b81daa6e, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
005 TX OCTETS: 8d80b81daa6e
-
006 TX FRAME : OPCODE=9, FIN=True, RSV=0, MASK=a52d50b5, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
007 TX OCTETS: 8980a52d50b5
-
008 FAIL CONNECTION AFTER 1.000000 sec
-
009 RX OCTETS: 8800
-
010 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
011 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=1564e876, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
012 TX OCTETS: 88821564e876168c
-
013 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_4_2_4.html b/autobahn reports/servers/tootallnate_websocket_case_4_2_4.html deleted file mode 100644 index 212d2a924..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_4_2_4.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 4.2.4 : Non-Strict - 3 ms @ 2012-02-04T15:41:06Z

-

Case Description

Send small text message, then send frame with reserved control Opcode = 14 and non-empty payload, then send Ping.

-

Case Expectation

Echo for first message is received, but then connection is failed immediately, since reserved opcode frame is used. A Pong is not received.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [], 'OK': [('message', 'Hello, world!', False)]}

- Observed:
[] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: Kh3b3ltcf0ADlsGo2EnkTg==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: 1v44L9ZzUJ6KHZJ5yJYvz+wLNC4=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - -
Chop SizeCountOctets
616
818
19238
2011201
Total5253
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - - - -
OpcodeCount
11
81
91
141
Total4
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a204b683362
-
               336c7463663041446c73476f32456e6b54673d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20317634
-
               344c395a7a554a364b485a4a35794a59767a2b774c4e43343d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=4a1e0f77, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
003 TX OCTETS: 818d4a1e0f77027b631b25322f00256c63136b
-
004 TX FRAME : OPCODE=14, FIN=True, RSV=0, MASK=8a729523, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Hello, world!
-
005 TX OCTETS: 8e8d8a729523c217f94fe55eb554e500f947ab
-
006 TX FRAME : OPCODE=9, FIN=True, RSV=0, MASK=158f23ed, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
007 TX OCTETS: 8980158f23ed
-
008 FAIL CONNECTION AFTER 1.000000 sec
-
009 RX OCTETS: 8800
-
010 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
011 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=9ff83713, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
012 TX OCTETS: 88829ff837139c10
-
013 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_20_1.html b/autobahn reports/servers/tootallnate_websocket_case_6_20_1.html deleted file mode 100644 index b368498d2..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_20_1.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.20.1 : Fail - 501 ms @ 2012-02-04T15:41:19Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í €
eda080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '?', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: 8hQi20KtwNAl024fziMiZA==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: 2vQQWjYeEC/rYsn25QkOUP1J64E=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
313
1291129
Total3134
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
919
18118
2011201
Total3228
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2038685169
-
               32304b74774e416c303234667a694d695a413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20327651
-
               51576a596545432f7259736e3235516b4f5550314a3634453d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=09392f03, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í €
-
003 TX OCTETS: 818309392f03e499af
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 81013f
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ?
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=1a762475, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c1a762475199f631a731843555b01450c
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_20_2.html b/autobahn reports/servers/tootallnate_websocket_case_6_20_2.html deleted file mode 100644 index 85a012542..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_20_2.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.20.2 : Fail - 501 ms @ 2012-02-04T15:41:19Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿
edadbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '?', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: TIQj7T90U3MBd7UDV/Tkeg==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: mKV6+d9BjSDvtA484tge96+03HE=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
313
1291129
Total3134
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
919
18118
2011201
Total3228
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a205449516a
-
               3754393055334d4264375544562f546b65673d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a206d4b56
-
               362b6439426a534476744134383474676539362b303348453d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=5711da46, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í­¿
-
003 TX OCTETS: 81835711da46babc65
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 81013f
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ?
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=d65c7a61, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888cd65c7a61d5b53d0ebf321d41972b1b18
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_20_3.html b/autobahn reports/servers/tootallnate_websocket_case_6_20_3.html deleted file mode 100644 index 4ae15cf28..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_20_3.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.20.3 : Fail - 501 ms @ 2012-02-04T15:41:20Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í®€
edae80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '?', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: 0CmjM4vLTi5KG77RquVjKQ==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: rsX/MnJlDY6UxbWeADBpCfev0IQ=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
313
1291129
Total3134
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
919
18118
2011201
Total3228
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2030436d6a
-
               4d34764c5469354b473737527175566a4b513d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20727358
-
               2f4d6e4a6c445936557862576541444270436665763049513d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=ccfdb4e5, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í®€
-
003 TX OCTETS: 8183ccfdb4e5215334
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 81013f
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ?
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=459bc411, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c459bc4114672837e2cf5a33104eca568
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_20_4.html b/autobahn reports/servers/tootallnate_websocket_case_6_20_4.html deleted file mode 100644 index f555f5ce8..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_20_4.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.20.4 : Fail - 501 ms @ 2012-02-04T15:41:20Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¯¿
edafbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '?', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: 9Xx5xE9r30LfukV3JZQxMg==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: IsjbPBLW/m9/EBoONc42PJANrK0=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
313
1291129
Total3134
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
919
18118
2011201
Total3228
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2039587835
-
               7845397233304c66756b56334a5a51784d673d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a2049736a
-
               6250424c572f6d392f45426f4f4e633432504a414e724b303d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=a58665e4, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í¯¿
-
003 TX OCTETS: 8183a58665e44829da
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 81013f
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ?
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=3ec8dc0c, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c3ec8dc0c3d219b6357a6bb2c7fbfbd75
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_20_5.html b/autobahn reports/servers/tootallnate_websocket_case_6_20_5.html deleted file mode 100644 index bdea9156b..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_20_5.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.20.5 : Fail - 501 ms @ 2012-02-04T15:41:21Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í°€
edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '?', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: kaPj4eOJvtYO/p1+SUWjFA==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: gjAUZ7QN+QSE+ENjYD8MxlmR9fg=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
313
1291129
Total3134
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
919
18118
2011201
Total3228
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a206b61506a
-
               34654f4a7674594f2f70312b5355576a46413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20676a41
-
               555a37514e2b5153452b454e6a5944384d786c6d523966673d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=a90dd396, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í°€
-
003 TX OCTETS: 8183a90dd39644bd53
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 81013f
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ?
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=e0ae2699, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888ce0ae2699e34761f689c041b9a1d947e0
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_20_6.html b/autobahn reports/servers/tootallnate_websocket_case_6_20_6.html deleted file mode 100644 index 9b219d476..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_20_6.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.20.6 : Fail - 501 ms @ 2012-02-04T15:41:21Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¾€
edbe80

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '?', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: D3AO5HGDbIPBkfq4kMmnpA==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: hv3czFZ5FFyETGd0ABBqDf9iiMs=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
313
1291129
Total3134
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
919
18118
2011201
Total3228
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a204433414f
-
               35484744624950426b6671346b4d6d6e70413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20687633
-
               637a465a3546467945544764304142427144663969694d733d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=5bd63f0e, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í¾€
-
003 TX OCTETS: 81835bd63f0eb668bf
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 81013f
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ?
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=022b8ad0, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c022b8ad001c2cdbf6b45edf0435ceba9
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_20_7.html b/autobahn reports/servers/tootallnate_websocket_case_6_20_7.html deleted file mode 100644 index f36f88589..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_20_7.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.20.7 : Fail - 501 ms @ 2012-02-04T15:41:22Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í¿¿
edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '?', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: W6Be3rM7Egj4hNIscD5zEA==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: G36lsKHfg04ueUxN92iO/nJvKO8=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
313
1291129
Total3134
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
919
18118
2011201
Total3228
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2057364265
-
               33724d3745676a34684e49736344357a45413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20473336
-
               6c734b4866673034756555784e3932694f2f6e4a764b4f383d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=af65e8a8, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í¿¿
-
003 TX OCTETS: 8183af65e8a842da57
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 81013f
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ?
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=87dcfe76, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c87dcfe768435b919eeb29956c6ab9f0f
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_1.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_1.html deleted file mode 100644 index b23b374b9..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_1.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.1 : Fail - 501 ms @ 2012-02-04T15:41:22Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
𐀀
eda080edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf0\x90\x80\x80', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: 4+A0RTBdoXG1pq8BzP6v7A==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: hOGfIW+mXTQpFxEAAzhJQZBq3D0=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a20342b4130
-
               525442646f584731707138427a50367637413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20684f47
-
               6649572b6d5854517046784541417a684a515a42713344303d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=fa43fe25, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               𐀀
-
003 TX OCTETS: 8186fa43fe2517e37ec84ac3
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f0908080
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ð€€
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=9d22e55b, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c9d22e55b9ecba234f44c827bdc558422
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_2.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_2.html deleted file mode 100644 index 1df9c5686..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_2.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.2 : Fail - 501 ms @ 2012-02-04T15:41:23Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
𐏿
eda080edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf0\x90\x8f\xbf', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: iPuOK+BgWhbmEfm05SYBXA==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: nFtyv6PfaFkNa7HnveKzhe3IZ30=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a206950754f
-
               4b2b42675768626d45666d303553594258413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a206e4674
-
               797636506661466b4e6137486e76654b7a686533495a33303d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=3cf02dbc, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               𐏿
-
003 TX OCTETS: 81863cf02dbcd150ad51834f
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f0908fbf
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ð¿
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=28c01a4b, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c28c01a4b2b295d2441ae7d6b69b77b32
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_3.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_3.html deleted file mode 100644 index 604ab44f1..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_3.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.3 : Fail - 501 ms @ 2012-02-04T15:41:23Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿í°€
edadbfedb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf3\xaf\xb0\x80', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: IxlOTYbZXdgzf0DqE51BTQ==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: /BBFWqSURVgKaSzwpkh/xBflPdw=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2049786c4f
-
               5459625a5864677a663044714535314254513d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a202f4242
-
               46577153555256674b61537a77706b682f7842666c5064773d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=826ee366, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í­¿í°€
-
003 TX OCTETS: 8186826ee3666fc35c8b32ee
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f3afb080
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ó¯°€
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=bebc7f7d, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888cbebc7f7dbd553812d7d2185dffcb1e04
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_4.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_4.html deleted file mode 100644 index 4e24ef1ac..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_4.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.4 : Fail - 501 ms @ 2012-02-04T15:41:24Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
í­¿í¿¿
edadbfedbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf3\xaf\xbf\xbf', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: 2dVkikWX/+l/pkvKSrgYMg==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: FZu8BS6bWe/A9bdToW/oxTah8fI=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a203264566b
-
               696b57582f2b6c2f706b764b537267594d673d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20465a75
-
               384253366257652f41396264546f572f6f785461683866493d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=0a2a18c5, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í­¿í¿¿
-
003 TX OCTETS: 81860a2a18c5e787a728b595
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f3afbfbf
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               󯿿
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=16433ff0, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c16433ff015aa789f7f2d58d057345e89
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_5.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_5.html deleted file mode 100644 index 1dde15cf6..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_5.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.5 : Fail - 502 ms @ 2012-02-04T15:41:24Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
󰀀
edae80edb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf3\xb0\x80\x80', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: PM0Ykka0trj5Ks54acrZRw==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: 0rB4RXL5G/swTTfmBlmWgyUkAZQ=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a20504d3059
-
               6b6b613074726a354b7335346163725a52773d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20307242
-
               3452584c35472f73775454666d426c6d576779556b415a513d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=a4035bc2, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               󰀀
-
003 TX OCTETS: 8186a4035bc249addb2f1483
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f3b08080
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ó°€€
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=04cc48c4, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c04cc48c407250fab6da22fe445bb29bd
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_6.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_6.html deleted file mode 100644 index 50ce3e2d0..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_6.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.6 : Fail - 501 ms @ 2012-02-04T15:41:25Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
󰏿
edae80edbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf3\xb0\x8f\xbf', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: 3HjHLxTtDIUsMmTglsvCEQ==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: jlA618sXEEsPiOOzZdRjjkUAls8=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2033486a48
-
               4c785474444955734d6d54676c73764345513d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a206a6c41
-
               363138735845457350694f4f7a5a64526a6a6b55416c73383d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=76c7ad31, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               󰏿
-
003 TX OCTETS: 818676c7ad319b692ddcc978
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f3b08fbf
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ó°¿
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=e1eb5d93, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888ce1eb5d93e2021afc88853ab3a09c3cea
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_7.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_7.html deleted file mode 100644 index ddde6cbfb..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_7.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.7 : Fail - 501 ms @ 2012-02-04T15:41:25Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
􏰀
edafbfedb080

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf4\x8f\xb0\x80', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: ZIp0mbBtxEyXUFyOCJ+3+Q==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: DwOv/co2P4JILRERO9r1utPeUz4=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a205a497030
-
               6d624274784579585546794f434a2b332b513d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a2044774f
-
               762f636f3250344a494c5245524f39723175745065557a343d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=2ae4c89f, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               􏰀
-
003 TX OCTETS: 81862ae4c89fc74b77729a64
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f48fb080
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ô°€
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=367f674f, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c367f674f359620205f11006f77080636
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_21_8.html b/autobahn reports/servers/tootallnate_websocket_case_6_21_8.html deleted file mode 100644 index dee22d7cd..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_21_8.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.21.8 : Fail - 501 ms @ 2012-02-04T15:41:26Z

-

Case Description

Send a text message with payload which is not valid UTF-8 in one fragment.

MESSAGE:
􏿿
edafbfedbfbf

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xf4\x8f\xbf\xbf', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: OaUcFV4MSdP7nxBXK+S38Q==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: j0hDBbytdKrxduaM2lyuEGp5b+M=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
616
1291129
Total3137
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
12112
18118
2011201
Total3231
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a204f615563
-
               4656344d536450376e7842584b2b533338513d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a206a3068
-
               4442627974644b72786475614d326c797545477035622b4d3d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=7c269b4e, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               􏿿
-
003 TX OCTETS: 81867c269b4e918924a3c399
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 8104f48fbfbf
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               ô¿¿
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=9603c3bf, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c9603c3bf95ea84d0ff6da49fd774a2c6
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_3_1.html b/autobahn reports/servers/tootallnate_websocket_case_6_3_1.html deleted file mode 100644 index d7a1a8064..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_3_1.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.3.1 : Fail - 1001 ms @ 2012-02-04T15:41:08Z

-

Case Description

Send invalid UTF-8 text message unfragmented.

MESSAGE:
Îºá½¹ÏƒÎ¼Îµí €edited
cebae1bdb9cf83cebcceb5eda080656469746564

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5?edited', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: giRxaADMiudnciYu2X3Ntw==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: VbnTiF6FgXdncLIxXEj+z/bK0y8=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
20120
1291129
Total3151
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
18118
26126
2011201
Total3245
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2067695278
-
               6141444d6975646e636959753258334e74773d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a2056626e
-
               54694636466758646e634c497858456a2b7a2f624b3079383d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=35445993, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Îºá½¹ÏƒÎ¼Îµí €edited
-
003 TX OCTETS: 819435445993fbfeb82e8c8bda5d898aec7e95c43cf75c303cf7
-
004 FAIL CONNECTION AFTER 1.000000 sec
-
005 RX OCTETS: 8112cebae1bdb9cf83cebcceb53f656469746564
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               κόσμε?edited
-
007 FAILING CONNECTION
-
008 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=79a473a8, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
009 TX OCTETS: 888c79a473a87a4d34c710ca148838d312d1
-
010 RX OCTETS: 8800
-
011 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
012 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_3_2.html b/autobahn reports/servers/tootallnate_websocket_case_6_3_2.html deleted file mode 100644 index ff7dfa5f6..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_3_2.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.3.2 : Fail - 1002 ms @ 2012-02-04T15:41:09Z

-

Case Description

Send invalid UTF-8 text message in fragments of 1 octet, resulting in frames ending on positions which are not code point ends.

MESSAGE:
Îºá½¹ÏƒÎ¼Îµí €edited
cebae1bdb9cf83cebcceb5eda080656469746564

-

Case Expectation

The connection is failed immediately, since the payload is not valid UTF-8.

- -

- Case Outcome

Actual events differ from any expected.

- Expected:
{'OK': []}

- Observed:
[('message', '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5?edited', False)] -

-

Case Closing Behavior

The connection was failed by the wrong endpoint (FAILED)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: +0fzXkyvkSjPhQlQQX66GA==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: LgO0/Am1g9xEfcTU2myHtnWvixQ=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeTrueTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1001The close code I sent in close frame (if any).
localCloseReasonGoing AwayThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
20120
1291129
Total3151
-

Octets Transmitted by Chop Size

- - - - - - - -
Chop SizeCountOctets
616
720140
18118
2011201
Total23365
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - - -
OpcodeCount
020
11
81
Total22
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a202b30667a
-
               586b79766b536a5068516c515158363647413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a204c674f
-
               302f416d316739784566635455326d7948746e57766978513d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=False, RSV=0, MASK=b2f15302, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Î
-
003 TX OCTETS: 0181b2f153027c
-
004 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=c90d6517, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               º
-
005 TX OCTETS: 0081c90d651773
-
006 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=cd667264, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               á
-
007 TX OCTETS: 0081cd6672642c
-
008 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=024afe11, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               ½
-
009 TX OCTETS: 0081024afe11bf
-
010 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=80b6c518, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               ¹
-
011 TX OCTETS: 008180b6c51839
-
012 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=62a7724e, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Ï
-
013 TX OCTETS: 008162a7724ead
-
014 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=42f77b2b, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               ƒ
-
015 TX OCTETS: 008142f77b2bc1
-
016 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=c1f0a0f1, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Î
-
017 TX OCTETS: 0081c1f0a0f10f
-
018 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=7f9e2838, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               ¼
-
019 TX OCTETS: 00817f9e2838c3
-
020 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=06f47c2c, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               Î
-
021 TX OCTETS: 008106f47c2cc8
-
022 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=e139a1e1, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               µ
-
023 TX OCTETS: 0081e139a1e154
-
024 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=d00820e1, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               í
-
025 TX OCTETS: 0081d00820e13d
-
026 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=a93ed31b, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
                
-
027 TX OCTETS: 0081a93ed31b09
-
028 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=86fe9fa7, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
029 TX OCTETS: 008186fe9fa706
-
030 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=da4f747e, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               e
-
031 TX OCTETS: 0081da4f747ebf
-
032 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=0906c2df, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               d
-
033 TX OCTETS: 00810906c2df6d
-
034 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=9c8128e5, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               i
-
035 TX OCTETS: 00819c8128e5f5
-
036 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=c0b043ed, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               t
-
037 TX OCTETS: 0081c0b043edb4
-
038 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=1723209b, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               e
-
039 TX OCTETS: 00811723209b72
-
040 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=a1194c70, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               d
-
041 TX OCTETS: 0081a1194c70c5
-
042 TX FRAME : OPCODE=0, FIN=True, RSV=0, MASK=73e98929, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
043 TX OCTETS: 808073e98929
-
044 FAIL CONNECTION AFTER 1.000000 sec
-
045 RX OCTETS: 8112cebae1bdb9cf83cebcceb53f656469746564
-
046 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               κόσμε?edited
-
047 FAILING CONNECTION
-
048 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=52a40872, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               éGoing Away
-
049 TX OCTETS: 888c52a40872514d4f1d3bca6f5213d3690b
-
050 RX OCTETS: 8800
-
051 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
052 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_4_1.html b/autobahn reports/servers/tootallnate_websocket_case_6_4_1.html deleted file mode 100644 index a7168b714..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_4_1.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.4.1 : Non-Strict - 2004 ms @ 2012-02-04T15:41:10Z

-

Case Description

Send invalid UTF-8 text message in 3 fragments (frames). -First frame payload is valid, then wait, then 2nd frame which contains the payload making the sequence invalid, then wait, then 3rd frame with rest. -Note that PART1 and PART3 are valid UTF-8 in themselves, PART2 is a 0x11000 encoded as in the UTF-8 integer encoding scheme, but the codepoint is invalid (out of range). -

MESSAGE PARTS:
-PART1 = κόσμε (cebae1bdb9cf83cebcceb5)
-PART2 = ô€€ (f4908080)
-PART3 = edited (656469746564)
-

-

Case Expectation

The first frame is accepted, we expect to timeout on the first wait. The 2nd frame should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [('timeout', 'A'), ('timeout', 'B')], 'OK': [('timeout', 'A')]}

- Observed:
[('timeout', 'A'), ('timeout', 'B')] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: UpAkZ//RWLrHfexyOMj3mw==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: HUMfuAwHoYZqlf78+bKZQrSw5t0=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - - -
Chop SizeCountOctets
818
10110
12112
17117
2011201
Total5248
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - - -
OpcodeCount
02
11
81
Total4
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a205570416b
-
               5a2f2f52574c7248666578794f4d6a336d773d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a2048554d
-
               66754177486f595a716c6637382b624b5a517253773574303d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=False, RSV=0, MASK=7ae1bfb5, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               κόσμε
-
003 TX OCTETS: 018b7ae1bfb5b45b5e08c32e3c7bc62f0a
-
004 DELAY 1.000000 sec for TAG A
-
005 DELAY TIMEOUT on TAG A
-
006 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=98cbbec9, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               ô€€
-
007 TX OCTETS: 008498cbbec96c5b3e49
-
008 DELAY 1.000000 sec for TAG B
-
009 DELAY TIMEOUT on TAG B
-
010 TX FRAME : OPCODE=0, FIN=True, RSV=0, MASK=61ebbee3, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               edited
-
011 TX OCTETS: 808661ebbee3048fd797048f
-
012 FAIL CONNECTION AFTER 1.000000 sec
-
013 RX OCTETS: 8800
-
014 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
015 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=6bde347c, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
016 TX OCTETS: 88826bde347c6836
-
017 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_4_2.html b/autobahn reports/servers/tootallnate_websocket_case_6_4_2.html deleted file mode 100644 index 8f4a7f7b7..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_4_2.html +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.4.2 : Non-Strict - 2002 ms @ 2012-02-04T15:41:12Z

-

Case Description

Same as Case 6.4.1, but in 2nd frame, we send only up to and including the octet making the complete payload invalid. -

MESSAGE PARTS:
-PART1 = κόσμεô (cebae1bdb9cf83cebcceb5f4)
-PART2 = (90)
-PART3 = €€edited (8080656469746564)
-

-

Case Expectation

The first frame is accepted, we expect to timeout on the first wait. The 2nd frame should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [('timeout', 'A'), ('timeout', 'B')], 'OK': [('timeout', 'A')]}

- Observed:
[('timeout', 'A'), ('timeout', 'B')] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: Otomp9wsvzxBkXQi+T/5PQ==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: ATAg9VNP6aeymyNC0M0XC/eIdaU=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - - -
Chop SizeCountOctets
717
818
14114
18118
2011201
Total5248
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - - -
OpcodeCount
02
11
81
Total4
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a204f746f6d
-
               70397773767a78426b5851692b542f3550513d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20415441
-
               6739564e50366165796d794e43304d3058432f65496461553d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=False, RSV=0, MASK=a71060dd, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               κόσμεô
-
003 TX OCTETS: 018ca71060dd69aa81601edfe3131bded529
-
004 DELAY 1.000000 sec for TAG A
-
005 DELAY TIMEOUT on TAG A
-
006 TX FRAME : OPCODE=0, FIN=False, RSV=0, MASK=0dd9f64a, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               
-
007 TX OCTETS: 00810dd9f64a9d
-
008 DELAY 1.000000 sec for TAG B
-
009 DELAY TIMEOUT on TAG B
-
010 TX FRAME : OPCODE=0, FIN=True, RSV=0, MASK=ac34c7f6, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               €€edited
-
011 TX OCTETS: 8088ac34c7f62cb4a292c540a292
-
012 FAIL CONNECTION AFTER 1.000000 sec
-
013 RX OCTETS: 8800
-
014 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
015 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=a38e00e8, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
016 TX OCTETS: 8882a38e00e8a066
-
017 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_4_3.html b/autobahn reports/servers/tootallnate_websocket_case_6_4_3.html deleted file mode 100644 index 9ffeeeb2b..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_4_3.html +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.4.3 : Non-Strict - 2003 ms @ 2012-02-04T15:41:14Z

-

Case Description

Same as Case 6.4.1, but we send message not in 3 frames, but in 3 chops of the same message frame. -

MESSAGE PARTS:
-PART1 = κόσμε (cebae1bdb9cf83cebcceb5)
-PART2 = ô€€ (f4908080)
-PART3 = edited (656469746564)
-

-

Case Expectation

The first chop is accepted, we expect to timeout on the first wait. The 2nd chop should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [('timeout', 'A'), ('timeout', 'B')], 'OK': [('timeout', 'A')]}

- Observed:
[('timeout', 'A'), ('timeout', 'B')] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: m117Mgw+RaqCkrbu2OKKcg==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: gsC/JxGAgNUyZuw4sE8CAkazaoY=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - - -
Chop SizeCountOctets
414
6318
818
11111
2011201
Total7242
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
01
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a206d313137
-
               4d67772b526171436b726275324f4b4b63673d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20677343
-
               2f4a784741674e55795a75773473453843416b617a616f593d0d0a0d0a
-
002 TX OCTETS: 0195fffcbd31
-
003 TX OCTETS: 31465c8c46333eff433208
-
004 DELAY 1.000000 sec for TAG A
-
005 DELAY TIMEOUT on TAG A
-
006 TX OCTETS: c56f7c3d
-
007 DELAY 1.000000 sec for TAG B
-
008 DELAY TIMEOUT on TAG B
-
009 TX OCTETS: 549b95c9549b
-
010 TX FRAME : OPCODE=0, FIN=True, RSV=0, MASK=3da3495d, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
011 TX OCTETS: 80803da3495d
-
012 FAIL CONNECTION AFTER 1.000000 sec
-
013 RX OCTETS: 8800
-
014 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
015 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=c041f88e, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
016 TX OCTETS: 8882c041f88ec3a9
-
017 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_4_4.html b/autobahn reports/servers/tootallnate_websocket_case_6_4_4.html deleted file mode 100644 index e5344a36a..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_4_4.html +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.4.4 : Non-Strict - 2003 ms @ 2012-02-04T15:41:16Z

-

Case Description

Same as Case 6.4.2, but we send message not in 3 frames, but in 3 chops of the same message frame. -

MESSAGE PARTS:
-PART1 = κόσμεô (cebae1bdb9cf83cebcceb5f4)
-PART2 = (90)
-PART3 = ()
-

-

Case Expectation

The first chop is accepted, we expect to timeout on the first wait. The 2nd chop should be rejected immediately (fail fast on UTF-8). If we timeout, we expect the connection is failed at least then, since the complete message payload is not valid UTF-8.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'NON-STRICT': [('timeout', 'A'), ('timeout', 'B')], 'OK': [('timeout', 'A')]}

- Observed:
[('timeout', 'A'), ('timeout', 'B')] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: XEU6Kj9j1CXrVXerZqPZug==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: m+kDAJTxrTpxSNSgA+UFnbv9xr8=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeFalseTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - -
Chop SizeCountOctets
212
1291129
Total2131
-

Octets Transmitted by Chop Size

- - - - - - - - -
Chop SizeCountOctets
111
6212
8216
12112
2011201
Total7242
-

Frames Received by Opcode

- - - - -
OpcodeCount
81
Total1
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
01
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a2058455536
-
               4b6a396a31435872565865725a71505a75673d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a206d2b6b
-
               44414a547872547078534e5367412b55466e6276397872383d0d0a0d0a
-
002 TX OCTETS: 019564bd3c28
-
003 TX OCTETS: aa07dd95dd72bfe6d87389dc
-
004 DELAY 1.000000 sec for TAG A
-
005 DELAY TIMEOUT on TAG A
-
006 TX OCTETS: f4
-
007 DELAY 1.000000 sec for TAG B
-
008 DELAY TIMEOUT on TAG B
-
009 TX OCTETS: 3dbc4d00d4484d00
-
010 TX FRAME : OPCODE=0, FIN=True, RSV=0, MASK=3a12500f, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
011 TX OCTETS: 80803a12500f
-
012 FAIL CONNECTION AFTER 1.000000 sec
-
013 RX OCTETS: 8800
-
014 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
015 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=b230610d, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
016 TX OCTETS: 8882b230610db1d8
-
017 TCP DROPPED BY PEER
-
-

- - diff --git a/autobahn reports/servers/tootallnate_websocket_case_6_5_1.html b/autobahn reports/servers/tootallnate_websocket_case_6_5_1.html deleted file mode 100644 index a75d90b7f..000000000 --- a/autobahn reports/servers/tootallnate_websocket_case_6_5_1.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - -
-
WebSockets Protocol Test Report
-
Autobahn WebSockets
-
-

tootallnate/websocket - Case 6.5.1 : Pass - 2 ms @ 2012-02-04T15:41:18Z

-

Case Description

Send a text message with payload which is valid UTF-8 in one fragment.

MESSAGE:
κόσμε
cebae1bdb9cf83cebcceb5

-

Case Expectation

The message is echo'ed back to us.

- -

- Case Outcome

Actual events match at least one expected.

- Expected:
{'OK': [('message', '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5', False)]}

- Observed:
[('message', '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5', False)] -

-

Case Closing Behavior

Connection was properly closed (OK)

-

-

Opening Handshake

-
GET / HTTP/1.1

-User-Agent: AutobahnWebSocketsTestSuite/0.4.10

-Host: localhost:9003

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Key: Ntl0ifPncXw3kcnMyqYI6A==

-Sec-WebSocket-Version: 13
-
HTTP/1.1 101 Switching Protocols

-Upgrade: websocket

-Connection: Upgrade

-Sec-WebSocket-Accept: EOTzOwYD8bhNnxS8IX/Rcx+8Ess=
-

-

Closing Behavior

- - - - - - - - - - - - - - -
KeyValueDescription
isServerFalseTrue, iff I (the fuzzer) am a server, and the peer is a client.
closedByMeTrueTrue, iff I have initiated closing handshake (that is, did send close first).
failedByMeFalseTrue, iff I have failed the WS connection (i.e. due to protocol error). Failing can be either by initiating closing handshake or brutal drop TCP.
droppedByMeFalseTrue, iff I dropped the TCP connection.
wasCleanTrueTrue, iff full WebSockets closing handshake was performed (close frame sent and received) _and_ the server dropped the TCP (which is its responsibility).
wasNotCleanReasonNoneWhen wasClean == False, the reason what happened.
wasServerConnectionDropTimeoutFalseWhen we are a client, and we expected the server to drop the TCP, but that didn't happen in time, this gets True.
wasCloseHandshakeTimeoutFalseWhen we initiated a closing handshake, but the peer did not respond in time, this gets True.
localCloseCode1000The close code I sent in close frame (if any).
localCloseReasonNoneThe close reason I sent in close frame (if any).
remoteCloseCodeNoneThe close code the peer sent me in close frame (if any).
remoteCloseReasonNoneThe close reason the peer sent me in close frame (if any).


-

Wire Statistics

-

Octets Received by Chop Size

- - - - - - -
Chop SizeCountOctets
212
13113
1291129
Total3144
-

Octets Transmitted by Chop Size

- - - - - - -
Chop SizeCountOctets
818
17117
2011201
Total3226
-

Frames Received by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

Frames Transmitted by Opcode

- - - - - -
OpcodeCount
11
81
Total2
-

-

Wire Log

-
-
000 TX OCTETS: 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e576562536f636b65747354657374
-
               53756974652f302e342e31300d0a486f73743a206c6f63616c686f73743a393030330d0a557067726164653a20776562736f
-
               636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4b65793a204e746c30
-
               6966506e635877336b636e4d7971594936413d3d0d0a5365632d576562536f636b65742d56657273696f6e3a2031330d0a0d
-
               0a
-
001 RX OCTETS: 485454502f312e312031303120537769746368696e672050726f746f636f6c730d0a557067726164653a20776562736f636b
-
               65740d0a436f6e6e656374696f6e3a20557067726164650d0a5365632d576562536f636b65742d4163636570743a20454f54
-
               7a4f7759443862684e6e78533849582f5263782b384573733d0d0a0d0a
-
002 TX FRAME : OPCODE=1, FIN=True, RSV=0, MASK=a3eccd2d, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
               κόσμε
-
003 TX OCTETS: 818ba3eccd2d6d562c901a234ee31f2278
-
004 FAIL CONNECTION AFTER 0.500000 sec
-
005 RX OCTETS: 810bcebae1bdb9cf83cebcceb5
-
006 RX FRAME : OPCODE=1, FIN=True, RSV=0, MASKED=False, MASK=None
-
               κόσμε
-
007 TX FRAME : OPCODE=8, FIN=True, RSV=0, MASK=77c74274, PAYLOAD-REPEAT-LEN=None, CHOPSIZE=None, SYNC=False
-
-
008 TX OCTETS: 888277c74274742f
-
009 RX OCTETS: 8800
-
010 RX FRAME : OPCODE=8, FIN=True, RSV=0, MASKED=False, MASK=None
-
011 TCP DROPPED BY PEER
-
-

- - diff --git a/build.gradle b/build.gradle deleted file mode 100644 index a87d144f7..000000000 --- a/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -apply plugin: 'java' -apply plugin: 'idea' -apply plugin: 'maven' - - -repositories { - mavenLocal() - mavenCentral() -} - -group = 'org.java_websocket' -version = '1.2.1-SNAPSHOT' -sourceCompatibility = 1.6 -targetCompatibility = 1.6 - -configurations { - deployerJars -} - -configure(install.repositories.mavenInstaller) { - pom.version = project.version - pom.groupId = "org.java_websocket" - pom.artifactId = 'Java-WebSocket' -} - -dependencies { - deployerJars "org.apache.maven.wagon:wagon-webdav:1.0-beta-2" -} - - -//deploy to maven repository -//uploadArchives { -// repositories.mavenDeployer { -// configuration = configurations.deployerJars -// repository(url: repositoryUrl) { -// authentication(userName: repositoryUsername, password: repositoryPassword) -// } -// } -//} - -task wrapper(type: Wrapper) { - gradleVersion = '1.4' -} - diff --git a/dist/java_websocket.jar b/dist/java_websocket.jar index bb5caeb4e80a53b60a83868128ac5fde26d7ac64..3a93c3e46a49b2e2949747d03bc95f3b1e79fdad 100644 GIT binary patch delta 85852 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

7u}DGS@<~(7htfUlf9e5oPWjXucx| zm*Udl30a7u_Td=h5SVACB^Pu;>PgcVr{zs0px&Zgs}3aUcMKoI148+ z=~zD6f3!u_E!TMzZEdJ+Z6Y*W4i@z3Uh}e+ZS9&gIK#lc)(|Q_dwI6KN;~mceg^Bo zNTT|Tz(_wY*&t!F_G!=JqRLzRKI*`f0!+Iab!QLswvG1jR0lYT(jeC{H&O_l=@G`0NyD#uOTpPzKfvI&U$ zlhU7q$MtIQ%>isq{DlqXK}%q<$|F7@KO??uXEdmojOv7c&+3H2&ZR;6G7NT~3PQ3m z3<8K3ZEJ&65EM*GdKnZrS0=F`art_701A^`E70>Bl{8Pjk9cVC)ny&X`hJB z;3WCv=@WpZPzhBfL&q@95MUyr=qmPeQJ|*GGmQ+(;E^q{R3HlvP}*_9>zLd9}h0b2?5a`PaFVNf;+3K>R%~ISO-R40^OnjU zL)UsRWzKoI=#wJ(j)m!F0V68=4mV<=xjeu^?j4{wN%|swZr+p%E%x>iD3RFw|J1% zC16;eKwNWQG4hb5>>q_-0tD}%1PUP9lq^-cLuth#yMk*~o*&hEmx7){DegiXylcUQ zZ^c^Z&LcpMM((8j7uCv+RkTDF|0BJyd}6OG#G?F}c~H#`edt?V`yikNHm>C!qZqjp zYCg1Ge$&2`cOfTqEl)dS5;p`(y&>G9+#k0C}>{ zKt)~44X~_hqWMextV+WQn-sMXonhw}#ErJKfu-bo5e9l0J^aWKkbzAClbb8WXT{;z zy=5b`r>$~-^Du07wkp0Zq2J+0`VR5Dbih5NG~c>4Mms*E^ih%63r zh?IGHzI~4A)R;;Ht>Hs}oKq4*YVCpY7k0)eD`tdo9$@3_JbBZv@-+BIAdA6?Y7N$z zno{!e!nyLtEWn|Z6X6kKWOvf1>tvEd^i%p1j94Oqvs66%W{Fj4V@52_^3RH6O-V%! z`@-+Vbx6kJhQi0#M#IW!R7BSE9g8BGB`tzTZQ{h5sjWtpPMgx_g?FbxV$&6x?|`?c zJb?pNghveqG*?~g(zu0TVCY+Lm)KDtE2h6bgb`*B=>Q4nFBpb-%Be#Y(NFo$%`ySj zh2t~ATI!O)%ZLlc3tmZ;-Le4jB{yf-0j%rCMXz30MQEOcV(>X#V#A`mE`Y(%!6v&; zFnz)Za$jIz28BGwt>PnN$=ev<8$;)v@Uf|PZ~DdfF{U?7MrlYEn8D|}$%}KQ1EcvR zsJypx@BAoaCeDcHF!pbQ#%vvgr8KAI+2^+0--!VVos)-UO&zDJvCcv{+Yw=iuDp zVv(#ynrd=dS}GkqFel0qzMPrhuzv2Y$Z3+$dJBLNoHDf9LwN@Q z@u{z=ERBE?)QFH!S_5+`T1uYj(OCywr-O!^J-tr$t8;Sl?aIih{%;t;KbDArA8(jv zteE$7LAB6~=JY;;m^z;)||=wp zGUrE46tV}{9I1$A+brYffBdvr{#pv z7Jv8Vh0k`LGW{F`+G&jc^^_W)!=Jb`+v6fqoaY=!dCQ<=-*LFJDbPxta7Sp2$#qR* zzWrkltQ=Rg@~6dUL!;;}=N(Z*SN=@!ysO`*(*h`Isr!|CCX^^PPl9>=2-8zo;x4%U z+v~``oRj_$TO6kru9>Q?ri!ldeD|`-sXR>5**^hMq*GXsu7W7qo!E`ag`xH!gp7h_ zKj14nK9;6NS0Uz>$z+=`xdIL?L`TnWQig2=q`R|+4(?bY?MH6we06abJKtszgML%n zC(4{>{~EcHhMI5uT0aX8D{tgBI~WC_dfR%whD%DigjxF!V$Gi1a0E^Ks zHxmwyKSG3$JqOodRP>izBP08q#gZyZLE`OUYd@X{Hi&k0bzS1^c@Qm;?pBGB_cGW3 z9u{i~hP-v$xCfzJ5l#@^NSR_rGdx3@YWLMX_Tzh8;53-YJ65N(=j(STQ_x6$KneFd zX^{OK0D`fB{7qH$Vz>j5CW<|yebU=fTfERnW|Pt+wCs0Du9G~!l?K~Dm$o&qchXbj zaFyzy{8FGMSnJxar@OBI9_u$z1cS@~>SXUDdiCSd=~6yE|ENz35;WZk+#8!$XDrtQ zs4I7RNuTbS6{RrYV<+0IVav+|1uy=a$T><^m#SBspQF6DMp~R5HDUN%zDuH1@d%YuX z<01olo$;nMGB3<~E2rIW8&v+^LKcsVS(le;j+!})dx)|S7M;q{9m|0^a%ayeNciH4 z^ELwyJO~9YZH%NMpA?-TJdy+-OivtZkz2y&dR~Zjsq4B6K?l;41mCn>f@gPna)k5S zv$>>jl1B|^?y}X*&(~q@=t|DR~%l~%RLvpzucnBkccyn zLZ{O>3~`<>QU>h*Dazl%L`Yc9>aUd8kvYXc2@A)(D)M z6KHEd9vSGQc6+HL0XSnw>GN`0XvMQ=c@YaDKN@4h3x;1H2ID`5EdjlLJS5kCPKI$+Y=(>oRZ|2@!jc!`>$3e7yi^v5G2xt&M~ByWNc7c>WPdm0e$qf8Vgx`fvL#P}8B7(|slw^M^h9}O${?@>eYlY1 zD8ikBmFL5ig)-z*tbtYQ$>E-$tcj)NyJ~@LGt|AhMNGEHHu6wS<|xGnLf4@*;Fsoj zzW#_e%;w{yK=DNsdFz7AvQTK~<*}<(fUA6nIU)u1h?X-%jASDM^2!MKJJE5o$rxZJ zo9y8j<##|vRbRptm4U)g?YHl+x%QIv&4m~IMP`j1)>*3qIe^PXbW5_pH9KyZS6Zhs zVT=jEi`#0+8nP?8+hp@&louKvxY%&Z4CeN{O#ZEB*aTJN^NX^rp0Z`Owv(+0M=#`s zS0a?hl7_;JFe*O>Sll%42>1hUx&4z$%nwT5p#Zkb!nR0--4AhyRX8xdZnMzbCL8B` zUYmO%la_x@tmH>QPVBY>cd5e461aqJ535w{OUz809b2M(VDTpwJ`;(DG{%Pjtj zJLabJUn?knsj3GXpH4-0n^AaHPjlHL@LZ6fK7YOhXZfjOpsz$(JXO&_hRf83MD<6A zUE|Eh1nSd)SX^suwW?ldSfT9}hKRxr_4a z!6w_^lvw2Cf;*m5Q*p!@YD9n|)a2;+8-=$$Z%VV0c>*}gJK4LcBvejnebTr|Nv5p4 zp}`*~H)U)UU;^pztn~e0JU?mGe1_p^q_VTJV`foe(Pbk@GF|1Ew78mna%$2OZTSjh z{=chC@1!cq!6>E9S6lZP^)FiG{(LvEc!{~)HJ)0|Im^B z;HFJ6=!6R2{?PHDz(X2xmkh6#C0dU)?yP&+*jH!`G=s{C&}Vkyp8Cl%Ue^$#95uK0 zQ;xaC$`VW?h*C3#K%So?JJ>4>z?j8udd&RB3ZmD)=sX<@3dSheGUv;(Zmg(rvPCx2 zN#XKg1`~<{*ALdI*U*w=jZbDPJw7gt+FUrenrL26PCt~|DAv3}HuTd`@9z?CL5|Pr zV_g9ZaB#%m_`rWFltWv`-sVz-eq;3V;P)=p8OY^JZbpjh6TBpD%p9eCIy{D@Z}YU) z79i|U#khQ3LQ;A?*js_Osw@&XWm_VoHl~0B73GIcx5Gy;J^u<(A%M^Et){ShJx{}R z_1Z3w)l}OoNa#5z>$v#VStsFq+bemOCfNTFSit$c5U6O~OWCxOqy;>SVjmZ1VW%x$pWQnhmS?QtxQJ`yUt@)Vjv+0UyB(&V+8a3^Vvz+{3z4PPu( z0kD>Ps;U5VxOtPC;P>8R%HGrA)365!x@{E~T7K|~XYcl`T=0YA+v^`*DPJIncPN1k zX{QbkupQGCl_%_OGla-gouJxVVvV;L9i!`fIbX05o&Dku3~968@oVoLNU3$1Uwy6* z#LM%N9SH(QaHptU(E^9Gz!PVwtLqQ&Hz)&HgB$g?M28aKZO#MX7q;)@o#%$T5J%_F}Z7&Tmx!zX-slwpl{ zT<(@zNN~jWh&!dB=osLYN?Ebo2Jr1wS#05>9~_-m+2A834~tVAJtVm#6)4!f8KGWd zrIND1QWT;6@!{r7aNOTglegdM565i5^A)>Wb^!Jac{=NI!vIxfGFx8actmAd8&h)Y zm<)O4Ff{tB&s$Ith(JQM0xoJA3f_myR!Ao%O z24+rhaQtU|fhd<+wXDPv^l;)vXL+8woF z?>9B~9weR6d>`1Q${1x9LCAKlEqAhEf+!SD0V-Gw(naD5kmNTuXZXEUsGv;BP@5d< zoRhMckt5CF>2v*S)yWUivf{QQw~0Zz=4O~cv_2CVu9>A3f0Kh|&C8_HJ}rB(MYU-XR!qDT zUngJHD80-JbTMV!VIEtPy)Pep0=5KkT+eS=3E}1t(f%*4&MCUGsN2?YDzX|NKPA6r`v&Jc`Aq`ad7&EdLLGo$p-V5UbhXu_@d-0 z-bOkZrl`qIj8K$jS&2N|2g)|jV41$;7)yH?PI(Zpd@J{2yU=}v@oIu;vse9Mm1Y*$ zzdbj4LNx@O0_sek%bg|V*qVTT$E`V4+$)}}KsQ|sk&=c8vf9YOoZgCS(L)S2BXxqV z8)R?u$N2{9fw4MA%$f13w>gR`i-SJh>8=3d<2F?$zQuB3DUO?$(~NE-~QME z6vF{PlCUxD_==nI@H>Y)1nbz4G+@irR=|@-%#B6t)$^q-YS}<;d$)bo6Txmrwt?W_ zzNTMhW&ibq8Gs>b&C(tGr1v8D71yjkoqWIS#RTY2ro_-IgSauVB*YEEj4d}OtSq$7 znxr6+C@ZXgMa31TnD|cBj@Vcj^kIIeb-4rZxSTJl!*sk+O$$t=Lr2*_B5VsHGe%__ z?dF4KeByQ_DBt0vgen=3D<1R=!EJ;q(=`sJa&FXHv#J)ai z6dN1!O=wPUe?oP|T_^!ONMJjh+{!9SE^9%~swEI?6)UbxRM`P^ddf}nvp7f@dl#V> zYEEQ$J8nIh;rrjLI8oIJfDp!Gj{ra~U!TMZbYxfRnLCc)zjXa3+gz9()aIK?aieCT za=ZNWT|zB)$jbv&kC62fs4ps>aHR+2>j0rH$f;*D`zF3%maW3y=4_-}=BNIkQGk>~ zFG3tH?^kgvwDYCY8R|kUm>fE)7&EM?#3bs;VNQuE9bydiQQKAKmYsvA08+q)iIM#( zrZ#%e-@9`ODXpm529x|klF9?bSiN^l%*e7#pOCY*Ve~}rkjMva<`{sXua!p*<^`P7|C_)3l}!BJMAM%I>uC9e+h;Rr43#bs z`o_tRj^L)}XjL@b49BL_x}jh%W*bpc@y}+Qq{r6CMQi@fVq5s34C7}dSZ%>N<(v)b zDR#|9WWv26%ndbA5>xG$|MPg}bko^II_JrecU+ut^L(@dTwJe9TOj~u%X$^M8_wAc zGU$*eZRFbO;|NZqDp1d!Or?_4^CgCK@4VWQF0>S#m|Uq*)o} zRg{l^{V;BvXxY$o&MRF~zG(fuSi0S}+t+lCR?EVagr4FHOc?;(_9d(FfdzLsZNUl< zFnZ0FPpdX3&)B5>Vh2q00CHHjXAHm4B^`aI{$Uyy5BuG%LY38yZQWCQPM2FRs+$n3 zNNW9K&_M1Wtj@gRZ<`52RqD;zTos)p7ZN4IFu|bU z;bk&|4VRk=c^n#ar%muxhHg#thbULZ&Yd$)bC{zV6Dclt;sgk_mWrCl$7A!KtB_|# z+p|`2Vyu)Y4M|nXpc}R)|EAsDDk}bhX)!@>aYt|Qa}cSg)r-3zWpp(6 z#f}AX%z<;vVXFag{G+C!Hh3&wmX(;?z1_xXv#3_g$=Xy6n=w*?C;!z1|0dB~Uob=j zO&|xl2$mKwK@NyojvAWf1WoH1X%?6AE-uplFi^OeCqmX4tU}>5L)xR&St6y2-xp>41r4igC(?vxNJeK96SDO+*qUB6IUz9 zE)@8WEbrIM2Nv>C?gz4^nSbhI3iPuli#CwFCoV+Qrm+B}OyN{ZwkCIG8HM5*Wfg0j zED7;?QWs*9s=c;(=4wDPLnHfF=cOobXK-ztB}j^L{D?{=#1llC06&7G|<1nVE!YZ8UN2g{qZZ`M#jCQ3+ zMY&8>39E}nIkFNi-e3%rk+3gDGMy-K!;w%5de7F-XzVrn!h=QU$c)=?|*__zC7B*i?p8 zq9qTVnn9VO!d)4<`b}fa&iM(mGyY})+nS}eiH;9tSuWICE!4Gble;U6LzyFrTQjs< ze=QAoTR*d5d86R8l>A9B!W%sk;}iX?KsVs*7M}?O*9R=tbK`S(x`#0oZ^1Of@1E!b z#-gjJEz{EzFYm|Md3YXZt^lRwLHJb2YwDX9$eF%! zi;A|Pr52-ch_Y50(@?VHbQvdzQl@oN|e60kJbmWbM6!B#vDW%@jdgE)Sew5aGq7+F+}@n705@O}W#BsQ zUrPjoTpxG-`yNJ|ZSF+Wi<$b1j^WqZY4c`&m>S|%M;cJSNq-A56vD1`8_JC+GKjWU zp-d0mS`*@;8Q-St^uWfK_W_m@^rl$1kky8+N7LG>KzDcaoQu+$t_Qr?$*Zgfu&6qq zJLH;=)T=w-IvJ%)ulKq9=ovsS(??8?E2tc5EK_#FiSBemTk!QowIxzuH_Xl`(gE?5Gsaxj4nRGb?V^Av;YUCWe;B zz%*{|esePpi2DnX6~V2emDJk|lW}!@G=10^^WCFwk}`=M`$VhyT`oe?Hbc?o|93*j z_{Je2V)K@mUZ~o%AtpE9gGDtFb!?rRiM7fjv&aM{8IlK(z>1K5HF8aFf6#U$<8X*1 zg#v2Z5}$e*Uy7e=TyrmXDUF>?|J%93n>IA0 zN`QX1JY*$D_;aIf&2AoRZBrXtsTykW6ZGM9P@OS#}*@&UE6QmmDICOUdC-c*ldMgN}^*A^gl+^vfp;se~Rf9vqc zoUh|}9iXmC(9b(v>+V1_@M?5(TS6YPJ^6h9f0Z%f0|6!e95ny!G3(?b1k4x7 z5b%~g2JR@Dv%~AOhf|`KfrFxNh^K7~Eigi{lvZ{h^&#Bk52OqK+cP}cx=-U`$=16j z021Y>t2Hy)7S+qaN#)AZFUpSqJM-Vo=l9IaUl&fE@aI4F*jGvu31w!3$4oBuyaVw| zI#O(tgNQGDK9fKrn{yu@(V#;w05Aj_;RK6}g`#|uDH4IQYglC4=A}3evs@NZfx91_ ztty4>g?|wG-3tdZ+hs4Yvf~y>f3d?ngtgWd3;xMu7@Y>2Dl2~}93SC}^~tU0&QhI5 z;h0>FROTK|QE$5{Ku!k%`K{~xH55dqp9^en(`VW=STWc*DSa$xp z?g`gv_n*rJ^xw>@c-97XVA)DG1`D)_!`y%~bMbJwlo*77 z#oX=Z9%e)(=Oh$i5WbMUeHpqq@^?-my593~pGnc>4V=72Ms=sIeBLj!?6ff<9j zm^m4VgnA1}$pI$XLF7VW;^cAO^NmbQ*T zUwtt5g%%u5R>sdDSvJ--f9+z4YK^&E?2`?ox!Md=WQKQt^L3X6%Ta&u2&|JlIv}pSPME`75ug^evlE>pgL{aX9t`)FT=RG57utfT`H@((CH#r zFB1{o=2*VN!hkQAV-g>^$0vI&uO0arELvZI4LOV=aL+?KI{g4xcqoWu45 zPW^K`Pgj8rq^v07@{X|#yUdtIf`PoDmO~a5`>PVc%LhXid1ay%7o>{~Q9+~A@<1GB zZQRhi%>XdyL2|)7G=^wS`xXC?B9QA24e7I!8LM|V(MdPt?NORho$|sB_ViMWF}Xn+ z*6cw%g9$iAO4p&$YYTR`=@}=!5msSYC;}R<_;QIB++Q*GVLRy#Ud4ueUB0Jqh3fi1 zktD(yb3R8ax>9Y(-knVwcxP`^Y*@;(>&{O1u>i|uS?j1)*jJ5;zdu#FjOMfu84c6E zXn7^0EBv#FWHfH%6eEn&&@y=nI*EBizi%fNfYr(Cqnol;c=rfqzkoy8Puy;>MvLbm z#l5}7h%QgWu#wkhqy+rMXI61E19>8WOE`j=INwKD1WQ#4M%ek0lmomh2osdUiiXL^ z#Wi_>O)|gslG5Cx2Y3&b#i8WQwoC&AejP+Wy9T8&2o51WG9#mhOO^zaDc`v&_z}hJ zKM+K*)MgQ37#S4Z68!%)jtgPCQ}**9di*(<{!`=lfXE0Y=stc#k#BQWCg`FYAapk3 zmIGLUUO`$~S~88`l$HxYwzJKjz;ZA$du_c#&}%>A_viBaEf}KFN&hnwVSuM&C22Lx zV8EzfeP=926^cqtRkDeP6x4oV(%6dNu~yae(E$l5t#o4e5un4-R7-p$37L9=G zrWo`CgUtPbK??t8Js1Er6GKNkBP$apH3thP6J>J;69eP_*{y{tHfkths6OOS*6N~> zm~Xn^62BP|$r9EuXcNIIX2lZ<j^$2DqY#2 zlx3%8GkjVduQQLgTAy24+N;0aZ;|=&1;vnueuZM;?T?%TQU=-oW+ z@c3X3MyD*>OSt>YF@=GX`7Hg#3YSD>MRf+Dw@_cQ7wKofu40BA$7@eaGZ;za0j#^} ze;L^FB0naX@u1Gt;A*wZsbf4^o=^roaR=(u>1fe2N*6BtIsY9hX z?=DZY31!s+>daE7(oWaMt~ia#xPuNn7#`c~q!iX~16TET$d=K3W|_3;1WLvUbS2C5 z1kY&BAn8XN%A8v8t!<#P4LT|uu&XYy0x1+x1=;;lIacy36-{1i$y^FATUmpV`-cb@ zVC6k{518)UL_@jz1N{uK9?CFYl3EOD{>6(S&Ql`*hKpY!_Km#q8mQowIjZs}{({or zqHQeLhZ~`(!2OQWt1U9f+-Kh~s-#o#0C*~&`w5KNU*$g$q3p_Z_Q$;LoSDBBnS`p+BxdKn zD`A~HKK0}KN>1toW2d+g1QA_<->DLUSTZl3GQ~6*sb{Spj!<%d6$c5SlJUIzB)lo7 zAPg!PatUSfS$nEB>flyfZh=>VIk3mD!Wggts19RJ-;Yo@IWku%V@_9Ow1P--hqEs* zgmc8so@O)VaRL=3CLPVkp)|Qr$+<(J-WH<$cS&l51v~lP;DnJBreiy@<9~~(2B`9+ zzr(~{I0|RSq4i>r219|m;ONCoCBowsGfB`Wgp}F_v4;d=S-yuv!Zk8=AY966Pw)x> zj0tYdFkf*v`)MMQxahO2_SF*xZrNm=bZkhUzPvldwl8eeag01e60;SLIM8bY;&uhM5V8$!_pij%CbH-fyc*#q?CFT@g!p`)H zqNaAeRo}4W4%MYwS zPXHt+Ip9|qC7~7wG87mJI*FneY5c+HxaTb$SVN^IT4Uu>VR+tB=PbIGfW(0MtmSN( zPDQ0uqh_V*rD0{I^SfsEcPon>GZs0i*EU19>+#fv=hyK@{idT`*4wo|0?MrP4^al- zasxFtG5azAWO63~+%b`8s_RR?A8%~k#Y%B}1ENdWDT2)aA2TI&P$-(FX^~{vLCc^2 zO3If_JbidqE1RbDTNf$kuQme%&2Qbq;~=2O<3sFf_!&}OnKaSeRnitK<15X`g%=p$GQ?ECxO@DN892v4dSDJ2KTC@WFV0*8)V|B9^N6|n ze*Ix98NVY3aZM(+7$|GB(I2V2d%-+G-43GB!6Q3?^ zQ?JEoz4@1O;5ACC^%1p~S4nptlH}^Wa>rNfF1Ft$Z-{NW?K#Z|(Q=Ut^(TKk7rbB~u^8i9DdLYmIp z2FWBsp+eDXEbFsmy;d5}+{TY4^9j5)-iiHe@!>o4p7PLUz7Vo3EEpOPtB>8jwUQCi zXw4LNzQ0>gTSQ_Tpqa|7bjzsZ^SPQ^nR`|eTcNwI&K^B#CcNIS;D37Zrry!1Da!6# z3|t1hSm5EDse_bi<70-+<7*__lY=fx+FKr9I)V!~Ty~zPQ)(RlM#};)JjEJ(iU?Ak z`$N`FgTLOCS*q{bYx(*wcfU*aApN2d^LJ87Rbue3d0=c3 z_{d1+T*XoQ0uPfC7^6QjyHDnnsbNA)^^nn1t~Y@TyXNm5{@t`dL0icFI+}5hxyDkE z^U9F0qMC}gEl4t|%L9slS!0_DuCgLO+8N|fGT3m+?LKvsD^^1)+KBU%p@h)F{ZV_` zv=TT9!E_RchhDQD?)&~(dk5eNCEk^(`DG@P#Q{w?4cdv$pNH#eNHvn;tZ@Yyss=__ z@ZsiLO5(*Yq2Fk_Vb-AmB2MdnEEn2K;0$ek@9m7Rj+6D(pd(=c=7ILgq~I}nOa?iD zC;Yj{jOc2`D^D?7@kWi8?;3W)A*;PS)jS^YzWKID9+1d#t2f1|1JM%XTp^1IjFNVg z7&$?*n?AsIb?JBVE1t=aq#>0a@uHB`+bRc76!8mg{X=jLo#c}};3uXeF%@1^6<&My zXp$wd*W>(!X0aCmEd(WpI7uZImAS?tR7U;CH_^p;_Nx7|$YEpXVj1Fw?xRly2h3u` z7WPxACpk94Kt$XSLIG{;#cOL39LgYgRZ)X7i3<|YR;P@dgZ=Fb%iJ1!ck&ItXOY(O zc!T3YIwI(_YJCf5jlJ6GMAte@&gvyqbKM+@9y7q#;7K_EHP@KFTvOwgPi~Eq>c|(; zTro%POt`sf79WVJfhz2R(d+4Pxdpkm(FXTJh2d7|=}WY_^{9U@FJ)cCli{R;I09=+ zI!h~9kwfL%D=I!>e&N?q=^;iNbKcD~Flw2lO+%6Fp#(;U%+o5EvTN8x4X~{bIm+l` z18(w?28AvGnKeN3RQ*hkm^R_ToV62{IZoJncamY&uMsBFI9O1IOGIiy$-pL+AAG;| zcMY4w6N80(2M!QRh9*$zgJVms^!Kw3H1wVb2?V*3!pmgMXf0rmYFY842gNL1)!q=v zv4+@wK6nbXOMY_-#r2UR_>%{aT?H-~u)~q~@B=;oyVdH1Fgh{R<%YGkFMD@HKn@eF zVYV5|q=jlw&)6)B!6Ma#{Q>M1nqbI{pQ(E2%}ql{VAA)&N((*YD#50RzxBga_K@=1 z?7eGCPA6G-uwYyC;;DhHDWt7>r?}Dzc^2!v4nyvUI*E7=VhQWm)7zy9(eXk)PP6vh zhnx5Sew~9AYQr4V5cT?vXIN4~CF6K3xU%e`PuZ-V`6^5^ZhWXqGbWLFa1!9{#?f?I){y%Z%I~T z=Ot0{eW+vRl`75xs_vN@<-cm@!yRcC#os0X7E<9sllfkl6ts%6DItY>bmBmvNp3AP zRJP1)GAFQvD|`!cAboYI!}#M1JEfOIl3PMzsm|tOD=rs6(HedEM>lS;f0gg1Ap2>lb7}EG;sPvSXI1Yj}>>yR2Y1QUnvUs6GVaQW0i3M<8m zTTm*L4bZ?*NVZ3~nQ?^jQ`v+MN=?@#Tbf4JOB&6NJdG0H?{jYQv!6Mkcw@ZUbFhR) z@Xeljtc^M?2*i~Vj}a|7B?n0vrB4Hb=E)_6{^qk{OC=3OD)%u)BZFTVmDPAi9}kOk zf11A(&q)^r{}tsHHZPk|?9G|a&zlwl-(k`?HhLiK8&1>?kg1(g0&|TJL#w<8#=_=v zBDDAjn38iylstOv#>mweS%wwmMDc{LTR6&fh=Crw#6Wl+PDGq)q|4!N8Io z$>;wed3vWVlLd|3&}3#8a{c~loSMG1WBsa}n!bnO>>kN?_K_gP;(M6oKUUDrnSU;U zeDCXN7(Cr?Sd(%3!c!yKbf!S&?4GFJY4}TdE#T#9gn)HCMI)uSD_(vu`JwD2MT>n- z{~H0H^E*p#@%6XD7(s!%P8vJlX`e5;5hVZ_(naG4;54yf9k2qk^Y?XTg#9zyWV+fM>?~<;P^P&3H}BkCXFJUplFR( zm>bg4_cS*dghV&^ROSdJxA1DNA(zUkRG1nBVGtL(gScB1Ztqit*a1Co9r7u^AMN}l z3}P~to1y>Ls)UAWh#vRAOMwMkIb!4TZwmKZtdBg>z&;g!GiROL%+`)p&Qb}IgmQHl zS^6ck{mj81{0_MH8w7ZOmQd_X&+D>)`^2y5U~Iry=Rj^4bilxlB9zu@S&&RQ4vwsy zDd*$NqnS5HENfngxu{b%YgNaWzJE%i9x+zjKES1f3stske4K2hQNI0TN(%G-OTU$K z3Bz;aU&)xso&M8E5H4Qf0#0;=i3g%*iYbecGYKh+QigXIxBvq~MtgD!w$HE>wOk(pE@oX9@MOlsAJ4C3pdXZ6wbUtKM z20CfQcyswB!cj3-yw4eDF~?=g-J$dl#@V^_yo|c~yv(0h14 zi_T=^F`B_pc>NHtK5*A2w2MmCF+Mdx-`d7ABt(79qPLY30jmHzIx2Iv#d8U7*&va5 za0lTX!-=awQowh~ix9k(Z<_r<{8h zDv0|2`V;wp@hJ&b`F1%EElVlc`Bf@=!wczno!36=LtrP>%Lh8$p)bN`!uG77N?>xW zYRt!vBkvD@kth~vfax@JWZo3wBUS7q5O7nCdDe`fp-gAKoq$qRb}%J)-LM}Ym2-x! zTF5Z(Kb)}zr{K}h2?E*jr|@+r_N`}1f_;ibKj=J2CKpP}*ujUsDBRHJJDpS)+|nI$ zeGmg@c~%q{L`hhe%dZ{j`%ILR&w79vewbbP?1csZmv2ak^ppo$aTFbwb72)S9h{A$TBSw1#T&g#JCN31Jry#Y%_Xiv!I& zznu(3c{AVhDREY0p>;dZrH<{@<+SV(2uoyciV;P^mdRud%~KX-f~+rPt0$Q6FEZ-+ zA%+cud6uH4ymqo;MMvmzdL+YTRzEbOIXDB9=xrSNqiPAC_bC+l{%z+!Nm?diAfsv0 zAnnYiUOy zSGryvV?Q;w4<1DIVUE>xMJKYReF$lAs^*;v4@e#R1q%G*0I_Gd#m^4tCQ=CKJ0c6< z0L+)UL<<1&HrY)@*vX(k^!!xbitw=|kP#Dq-hqMepmOURumRs|a_D|7v@EW3l;xX5 z1OYIp^yf!i=BK*RoD^yZIBxy*JasGQ@?>B-%9s(_Klfjfluamhl07SIZBI0Mn(sIw ze4hOffNu+y^%>DaaHLx)2AU_3}l3oZHKq*8BZwD}jL5Id&DL zg;sG^s5$SrCFDx=a+zzwb%}PBfR^q8Y zFyhTLp>4K5V6R1nfv`eX^83~GDuf%^prS1k~0Dy7v0sD!o>g78$$I$Z! z)Cs%m6S=P2&&?yqhpc?ZYaGR+Br{7TD~3qSho~YUtd538 zOJ4F>HH8i9^K}`mcA>5pc)2U!Q3-Bh0m!71p1U#`o96bsu!vW)9?-|%BIkdP)Uk$8 zJnqkc(Tf%x@Jp;8n1*l%_LnYX?%cXO67sDbBcBkNtCBUJ@|PB^+<*@+URMV~J@~th z(p)3WM&JCoCuMtG*BOvZjd9>OD>_?#Df3|^Ml=tAXdJt-15-#u z1H9a>==KyXE0_0i4k8Aq?nXM^!`6k*W*~rJ;xX|BsIzoH%}rIpg(1*a*~>R+%!t4y zDPXIQRgGr$35j~;yj0L5$T+&G^$S@q6hP28t`+>yR|c7oHJy#-N_YD>xB8P;cc=Ur zUXg=g0n#ZPe`?~kL$d;a0z?b$s*vt4pN!vROYK6b%@8QGcZ5P8(vc?c87!@1dM9t? z^3e=tLy6!+U0^7`xx;RK5P!m-$XA*Cqrzko`|R=3z$yXK))Qbr>9~@I7y}um+W`Qr z4;MCIDRw~c$y~>hUlI7mObJ!*|JdJ|Kkbteqd!f1Y=20n*IWRHn(a6%R@M6^k#5}j z!Dw#*b-ul+C<37(Io!pl>8U8*lU<#_Gk;!VlYeg*3=6XCX8_-~Z3BgGNq|!Ovgd;< z!$Jv6A`4|YOR$J{_E)a)r|*|VZdJWJ%)}%+dWBa&o5v~ca@7#<97nQf?bVKg{yk-l zJ8I9rZ$)n20sugZJ1gkW%Z*<8ULMD6Vj~gMG%reu^Y?a)3JOob^dvk48Lcd=Y(*TS z5#gHp*fBBno?+UE*bFLtE@9XdHNM;;x1a2eM1ya1!@PcD z;$4BEhB<>_Zf8i~L#$-v+`D>f`2(*2^F&`CZ{c)@v?Ab~ZB#kMc&&!~m7u^#VHvQ4 zN`7V?2kbVyHdIeVFVL#>gdcxi72BV@`=^>Bz#bjpjBsicUuchYyM-tX4PVz zT=FwL^-Z;jmyAuRq=uR2(AuPpqTri$Q68NdBc3E4HjOnZ|1+$}GG3THXq`J|h!6c| zHdm)ukQbnss^>vazGK|V-OzKUOneKJek?zd+fzWn946>h;hwO8RmD00(;;d5K}%s!~Lsl{l1s>jb@rrA9&8~Oo_znTx# z1AQEvZegUXCB}^RfoA&W?Qtn-I6wIQsBvp+A`md*Rp-m}>&$>~2>}T)?g&iq&JSwV zT%|8?D!w2C&k>RlMnwXrmzh)Im@@Jx1+;r+h(USSy_X>*2Wdl;OD`n;G>JWAj1H zV=fs^kV8!V(^;0DL>-4InwUy zH7y={2w)b<(CprW*oy2liGD6!9K(N4Y%|dsY*qQ1H-fqh>KcLDggNOV%JElKy)`0v zYIq#H>e#+MrSZ!>VfZ_L{ajFeK#kz>XS(H-fG?%1XPTwO11udq;%KEoo<3!O#a%xM zk}293GmU4eD=oE3R6YXZ>ZDN0H7+SohVPzNvq>w^AB7UM5v)f+#w(Jv(qvvOu&zh$ z-k$u6bEWB4x`UTKvhxstKsOVk;f4jXO-?%5>R$aB<%(qA07-*)m&^OcvJYKaw3U z0n0jUxJ&I_*&}Q2y#!D{(+bQPDdKLiiCjU$IIGv-(x@Axw1^J46iK%GgNDlzs@7`4 zBXHuYKo^P-YnrcgPNsW%hRYV~UZKEX-SRRv8U@`y-7q!IfYV4WCXMF@8(p`Oig zFD1|i(KOm)kR&SA#PfYx3WFHm1PBLs6hu=Y^G4zz3php=W9rF#{-0S)B_p=m0zV~} z_0x`Fjh}TQj;Axk0O-hJ|KKh`VPM9?e3!x+8x<{q>BJl55dFciWhlA%C8P-^fM}}d zrRr#(>{O&J=ZhkzKNV!ID+c&2*Jf6YZLc<>9j7ib|EKx}s|b+UP&@bqhyFz*fS{!t zuHPBR=I$hoxSa~AuQWu!`hVDVD{xaLWB!BO_?Zgu+6qu@Zmnc02`(zt5b;NVSo1Y# zpKESQW%22a=CiC6==QE!O^q6qyAUWMmG){Ah$51&{2g@-bl~RLeb=RJHsX`gnf&|@ zN2u3`BK9NNp>*Xsrsy@y)^gFHx=;gdi}^&@5X|ef ziHY8aML~-#xbvf8;yENt@fxAB=}8qM1C4@?PO~H=BvezrHnJi@4fb@ktz3O5Ds0#- z&k&vn%^<-1poogaZB2BW^kh)jK~T2Rxv0@5uNm-!ARn|GuXYk)d)1ZA8JSLFe9BYu z5V8?ik^>n72ZN)DG)6_-8!f^O^htJSXgsJWs-L~v=J$@`4vS#%%vpdgVC96>MgLI8>kL?f=*u*sd2Tkr07^*2#f@$o{L${#RjXREJX6UUud+OG#y) z;3maHTrv+8twY!6|D};+5>Nv~WMPc1kpoWE^pN7-6Cad1n~nt>mC51qG~lww0TXIO z6P{n>thFkuE=W9DX~mu%eUDl<wepD zD%0-k15lnEQW7=oDN$S=h+4QTa(}G*2J_};{-wyuhdQYjdQ>fP&z|?HHTy9FvquoV zB`19Es{7{o2Fdgs4gDFP@@mGAI3vgNz@W=1ZAbY~txJvJFg4dr^>D2VJ)`mi2$TAj z_&&@}eAv!=O%?p!FZ}JaDE2MIhk;Y=p29t`0vLx!z;Ig$)o^)TnG8d;U+l*xz^Gg9 z=dI22Xeo(FzENbNe6kOHd4r+qFU+G-a!U;!?`+7#GxQ4Y8}C$}1}3Q9NrbLebZbn; zex)<)7#bJQ4QILK477Vxg!xq7eZ=4LrMG)fps~BN59~`cgbGuBJpl?HFl-FA0>dfk z0BD%2o$u3WQ>0ZwZ~yQ~YS6doRh#;iy@JhMehIizYhUkX>aGpK-9TI;%j5@NBjdP) z3&i(LLN`-(1dnbbOBFnPYI3Jx&rF?cl1OAqzzy%Wts>7WQt=ep)6B==il}Ky`4^P@ z(7s1IWiBfz+WUqDdJKy8?8RERHWtW_0hOn9oi;K$?{fGT)-cTv8QcpV)4NMmw&cU1 zrsTz`A*aySLf42M(#=g|6JKldYkw{eVz$yHg{MwV*YZ8=k}oPTgt<~BNkZM$Ld=j; z7j%_y5~yheJK9;WB!qj5hoa;N%p-qzHybF6b88;qxVW2eq8sAu%xKEW_@daZM`x7T%KBsv#i7C5FUS&jCmW?xHFYaJ8bd zFg5`#9CqZ!NfL|BKl97Q>0C56X1VHiMbQ?kxaCs`+AicWpSaw>^XS6Nv5XyN~KJ2N3|op37)BA^F`=#fWe)cjQ8i_c?t6VtXYr`H48Bo#>q}LisC;;19^8& zQc7*^vh0qm(#_i$V#x)~yUHoU`7XB}!iGWkatzwh=n{7Qqp1t9EyWK3nVXqRr_|k> zYjeE)(uIKx?I>ms9QwyLcu^;#4Y7#+S`8tX2c&F;v}h^#FcJ z^Za31E)}{W>01TX42+=?furV z(Tl7}R_sbr;EcI`uVDx_1Aeti*^MAe2V)f-hFSDD&y_{fH1&GPJI zx7Vzki4!KZd6LslM z|6?AZ#h?t$ZK0A1*=5(#^shV(fb#h67Fpj~;uVS(*+-tyU4^V+24KDfMLhWSbVNM+ zX(U@fP{V_QnYdT#xdQt zG$@Z{-&A#cKV32=PUJNwC-$IDjCU00OP^IbO^v|P(#B3>yXHQe%pmLa@GMl65RUFR zcsWQ<9ma5jz`0C50Gth2S8O`X3$hT*WWwZY3sY(?RTp34|6Zp#Vn8#!j&J=PiwiZZ zWI>0IRGskpsvi$0P(XRNVws)ySX=_dz8(NIU3zUcy zfnaGWX_qXQ8rf9S$~3oon&0EHq-E{@NoCeK#0^IoUb!6K44{c+B6-slx_FipvPNH5 z!7f5dj7w0Yk`aR5u5`d@F5l?Qq$W7*LBD$8a#7De_SP02d;)4o!9%yKT~S^2H@R(g4vJ@B%v15P-~5TSHage`de3tnR{cAI9-$L5V39$;K9$9B@Wr> zCV$|YlL!_N+S9eur5_TijDOJ52enI$Nq#>5$SqQpY=`i>e zsi-o%`YJ_r0`~y%s*ouq7_$bDJa&EbO!=XkxIKKWb~?`LXEuv#fnygjIN%)+=v}$l z^9cFk51R&#p7$Q@e?TSjQB}FH|C~bg)gVcbgFyVSF(AXt zZx%lh2cJV?lQHkld;^uwTR4XmR>~^QRCEXj7!{rfiCB0bB3?{U4XU>3_!n}AHB!Vu zma;T~GFCm`UH{D5V;vpre)o&9y~VYxPmZNBlO2ra16Ii#sj=I8W>m;AoymNs>Qq4| z`lz>cf!q;TwTQQb=nJMAT{%Sh0Lhh}7(k*OwZXdV>C7*M*JfMp_Vf@=0rs|sQDICD zpyObj9_;o1ae*s44hD=-T2?2s%bd679tP_lLBhi(LL_CBf#>7he2Z&fgS%U7j_ZhwbIdU@AQ{=P+9rn#A5T*0w;~fX%t^{Mfo_{z2 zIogTfJ@`CmOp&BzfDEdl;rDq^`<7A)qqGwE3Dl{Ye$lo_UKi6c4P|FerSK^dXt8Qd zH!KJ%&u)6>J0+96p!$vv~i5#Vxediuy8R9@x&!Sl()@p z)n}{TuY1)&IjvJ+9Of*G+f8+*bW`|`z0%KveiSJ92FcGyba=JP~n6!N;73I6M5rtMR; zOlAe9^QZY&tL`o7_$QkmBd40Y>(d~ta#A6h%ioR;VrzgM0EXqX3r_=2 zb(7YpFA)Z~#F0)!f`S+WEzAR?Q&2&12M19Fv`h9jBUZ1&{69fj?gsp`6H%#R24NnC*X3pJiPO``jZhAJ6}-EDWXG62;As^ z3%gAnd`^%F56!46Mai5CEw|I3yTRYfi2}8v*rXxeHWxxuq}?3v_nc`P3{Cqi+pZmh z^BixfTVf$@XFUGUvXFrX7|#IlOh@<@9F$Z^;FiBGa8zKi){}ZLfYD{AJ{2(c|wMhN}|y zM9Jck0!Z|m7DN^cn3qE8HM_c!iRjqRvhrSsfT#Z3wy?p^Hl9fZu0@zYy^X9ebXC!2wx9 z(7L8&^;}RQe!1^>fna`f%KLz00#c{unnx4Z05k;`fe8q+`7y0Hb@=(ix#L(b&;1Wb z6FdS$9{^Myb)IvaSrpemqHBAXV3-)6I9`bF>ipxA{gvGUIp4X+MhEJ@%-+arH5rb3 zT2ZNTv&HvjfEiwq>`~%V)F&uz<=~H8i87ZM0*GyH$#S7D%|AYVO%V#2fOE`EHp#Gi zkUub4EoD=>g0r4!Swuk}_YWE&rf;~`0}tS>?;3x;3~jxDJN5DyOm5YJ z?x8;5KxNmn3KL&8zGxFQ2wr?Vqrap6uKjI28&|%82B4{Q^1Bj?YZJ<;{Mx1}yGEkf zZ&2E)_lUy|@GX3-qO!bzY8g7M8V5c;lUTdVS6$r1Tx4wC2p`N0$qrDx5{il z+6}a)NZzHd>gCz^wQbky-HPX95rlxygK~LeOwq9diePaQ3;zw)Ryd% z>Lc>z4&X2=H+XRnUvo(DLF;lI*{Ytc?uVZYVZ=CfcblwRfT`IC=LeezNWNC14F}ed z#lrj>VtI`DTd$*6?6?p@Ae@|H+2~dLX~>sVOm(Q`fXCq0r6O(?Qa3d(DQoY9 zNH=duVGYs#?Kx_;D<9bG1iJCZKSN`6f)IWU4p;;31I=%s+CfbpKD7nlp!0j_$E}gw zVmhlAi1cxNP5tHkb^UUU6z_XLME>`b0!n3$@^=V+STT)L%N8DV3z_hFqA$zN)EJMU zH>jiw?W=Z+i%A=fuQMn4iFqeZl^W3wCMb?91Pb_HR1SN{1S#O>LM3sG$1Gnl`>Q|L z@&H{T0*EkNx1kdb%}~^T&HAd@-FM)--;nHvEsWFCU~{);+~$yNgI} z4@fT$f3>R>-0tgZo|1RQe*okX>fcs1pW`Q;qDl{(qIQI39})Du3dyTNYHm=Sq@Sq) z4a2b_h|0i$V86KSks__|FLnVtq9c=>yXKQb9OCKnhjsP|FaIv6v(r?a)y?g` zvF1}QX2}lG?ZlNY{7+f*_4YcZGR6R{%aj}x_J8lscOdcx@Ed{55l4``Mcd$&gMbDU z$A4W;hf2!aBJCcM&^~+Jt{GSD9S-DO8iPXweh<;50bSV?MXVG>2|fg~*^UY?2ssS% z1cu3I1~~O=?ILb}Cs3JHb-SQpy0V6sGxyJ@hJ1o9uFc#R$C&Dx7zZL%Uj%gN4#w(k zXR;3@%WWJ2ODYO>#2DsA_cj^ks1&=|1UeZM58N&8Qc2YO&ER@eV4wihhaXsq_(Z21 zr3ex=09PRWs5uL-={sHK+sPZBpPuo}|A{)W30sS`{{&E8emYp(KWzoFWMXMx?D%&F zG(gio8-`z@VN%d@f&u(=t*TR|Y4p~YBQBJC*Y=11gad!ll)eOkn0BBPq}1?Pw_ZHm z?03=GdflKaf@Z)f6|9JRMctcaMvYNiAU0Cu$%8QwlZ_sUSHD7vK_QWTM zx10DXf*FMT%q>rRVIyt6vRc^DN?Q9jTmWp~oS-)3qgJn~R|NATXBTj-#?}XZ^`lX) z?^@{ytpF~yR!`EI%PbSZOE~Z{Z=R!LO@Hm#`_s#|W?_ zrNq;G3xO#7?s4-obs`$^MB;gdg2n+EgsGm~dkjMKxwIHhCcR~bi7h<-w3E^r-M>lfWI?-MeOVov}mSwX!Qvf!#SovvphdR z^n=1xsr{8r0x20uh@^B)kjdmUFTvGgW_2f-ZkV1Ht=GxrkM&U7S;p zR9j6pIRNK%BAIA<=v9Zn8->dQ3!Rg)cYaa?ole3!Bx)+@Cl!t=zFYH-Q(J99v2{T* z(KF3uTGb;b`KaQez zRm7=7yG@Prz_ct;p%#%W_k~g8sJ4y(TH`k(ON(|F$pZ zQk}Zw#cf}EFGlX&rnpPC+pN_%N5h+usNK3aW$X6T=7DVA+^{`$NhI4lB=`y^3Fs2t zt<5Hu)0*B#jah3GmaunCQ15Qxl#I+?b2D@bMd2=PRf~`hgX}13(%$7Q80(_@A^}M4 zo)zCrqgN7 zyE(q_=}4?j9DuyRg$8U%vfnTS19}KRLpVJk0kfm-cY?w2jK8a(S-{qX{b}m#){k0X{;Eh`*iPY;M4b z)*BfpiZF3yZS{KeVHyj@G5Px>m{>=`m~3&1r1%39sx1P$`lWq=?L9{J()6d~+b@S= zI3JO6ruZm&HnCS>%hGXZH(_@CE(0;qFb4z%Ta>K_g(=m&~2GZ0GZXptyspo#}K}&tCFjl>`f3VD(^&!3>?hqK3X3V&=nxsU4Ht` zq#jqNR?T9%(hRXBF|`4PlB!$Ms)x9IfQD*x@$4GbooKf(#Y!B4mV0nF6c_cQDwxTk|#=)Vw|OvlZ0d- z5T47+N5ZBJBoGW6WF|H&pSab!uoiMcV`S(AgD0>h0MJ0dt^_YL12TE*WA_BaR8&bK zS!|$0QAr52q6Nz!-;s8@+vVJVn}79T^CUh}xfW1ngMbn`Bwq~o$B!0KDbb##7k0%8 zluw%mw%?5;M9jsY4(m+b^4SjFGg#!pBZPqG&D$*vE5QC}NR^dhAiipj5w~1lQLP21 z!h1*)fYWgM`%NOG@$cZefrYp#0n#IQh5#*d$F|F_s1EHWi(r0?*}X4f^3of1gjM=0 zbE?x^tEHiH64T7(1NH1gcHJT!?X3 zEoHwyOB$v2+4cu_(Az($Y7ZIx&wpKVu0_v&LQ@D;TNfLx43n?-2UY^F)n9?rnYwd7 za7DcAL&A!05R+r?)D5M(M#dgk6nAUNJ_z`W<|-aC#ztNYlY8iL-RF6!0DoesKf=by zUlfz&fAGbns(b_4RQyxVtgp;T5IFoaa%vIi4KgEjaXV7=Qp;E@% z0rtv~{ksMlW_;r;RE*uwe|M~}Jvk?;{^XkmHN~aL08x^8F@yA3h!qi|K!*fS1taD~ z)(n-hR(!}Bo@)2cwY+jB_YiORq~@mXfvsM87mT5+e)07LiC7clD1n(!{vchG0loYt z8GJ7+HQS=BeHOR^@_FRl5-%U|V>LGw0ID9bn!g`h-x`OxHxlV zYLvl9P~MLFn3uMOID=}ZBkiL4{o`F+W#$5PNKV1XpEE!8ANxK^Rr!j=c$)vnZ~Usb z`+n&hLw`~HmrVls_kr+JoiX0Z$PWYPW!C7g6_cTIq9%0Y=ue!TLC{t)f5k=8QZ^YF z#_Eaf6wsad-v{wGWP(mgjIfYDUr`z>lNQfc{w-!KR+!-}SYhjUu-2H0X#j1p*@wL- zf`mU7McOa|4bA;d`qu0q{m5JDvTlim`q}F5YrXV;URraml-pVfpND zS}@SiplJU5o~eDnybKSWE{w7l`q|~9mQIvps;tE~oCa?E)M?P*?&IJza6}E#Z~~u$ z{3TfdJ#PeLL=^N-mS0D#dH_J^5-yZ?Z_Jm18manFE&SDJpwBQ zId_%x(fgaRS`oRiq`Ss4{wg07H_~Iq+S_mHu`}uvx^j_f-WPQwY&r`)KoPufQ*(PQ5Bw*aLzL37{%oVbODRPh!g(Yw+#BbrAm55Ty3u42Ljc4(GK znru>4MmUY^fg9ed>~FP}iZc8Iy!EACk-ia^Tg`T?iY_d`#BH&-)k(nLE|Oj*=Rx=A z&iJuU4x~L@$oxnlbVKI=F4>1!{%J84NBJN}xmbTzK+ImFtByLGRJ&)UtaeNl>UE+j z;kWUzQ@SFl>Xzv>A^<%XQf-vkC2|{GNa4iQY16p`_C^;5ZiytsWxdKC z2BJk0sStjZ2m}&%*CzW*S5H;B*~&J`&Gxx)!vNn&fCBgY{7?*(jHRt!Lco!H&s=oo zI+hgDp*ktd&ol!37m~s*^k~-QUZkNLQi;*vdZ*#V_8j8L7NBny(KcNduS4p$drnB@)y?hOqtt2E9&|uvJ+)r{_7qS_8@t%H-CMkYOg}&IWzIV~Y0^ z2k>DVvEnftT3}Vqu&uDimh|?(y1u2otb`ig^brgtC$$D4ruN+@S3GwJ=+ONvKsH6* z!~Y49jdsj3jTYm%w(IPL&xwt>qHPO@A5O*IA#|t2VbT)0Pf_mS_(jQZ>YC_zN6^H^ zKO$yNqyiM+`dA8X33}piROIxBQ?axq^z%CuxDUE*5xP(tX#bKQ7p+erD7~I-$klI) z61V@WLz6wGbaGAL0!-9l%`?t3R!SAZhQ%3Ou*IMx%?mn%i%Hd9(?m^`gtLU!TjX?m z!?|I^zCO?SQjqVtr(G?#Wy!$LAZ8cVxg>Q%p8;g_3ysr$m_Z`603f}rOuhry;*7j- zLeEpnA2|h6T~6W6@zeQlxYYyYfQ*XO=&goae8<9G-GTeu%^xQFLC19Lrsz*TmdP; zc!0&&6iZ$|@>53P6xzR{dz5XZmIohQ;*5T#JG-f#)OZ16}k8P+0KT|Pb3 z{v@-yfUz13RJa^586E6R$o~A5IH?CCDci}3vt6j%c1ncPc8T`5ou+3fN>Dk;Egzt; zoP$ut73-AC0qYI(!|yDM}_UN`CrCG)DZ?0AP8O904? z4HseBMOtW^UA8?`CedZIv*CUvd!r?mqagke4h6)Q8@Q`zBIEL-R!ZA>1wz@{&~>_l{hxirDo9Vc8HYMHU)13EJ@By@5ltvqF^ z91TytKZTtcBW#|xb+zDyI}mc}doP12B*W_KIDyJbO^@*W#T(v)rZrOhfC3P!TIdIJ zNtufO?H!w6I;%u50Ol2v6RgbSo7j!&?$>bTSFEc7OH5HV8cI3I1WcwRO{>ddUe)S( zy6Q8InPFY&EN!5-VLboHn7~7mpbMA*Y71w!WyvU@&@ONj>BJ*y93isvdv85 zxe;e#D3mbYc*ByctCw?kaMx;Sg70Z3etkR(AeY?00E?;LacEodCNrB1X4$-pIwPF! zZ{>kG6~*-`UZkDA(7W@&?@2ug75jHGM~tp0d<9j`A*6QC$TButD*-UZ!&0+U!6Vep z(AA18I*eN~vgC{nPj#I|qA<4fQYEMT1wtpjD7m=j=}1l?m_#T-1?GR`PgorA>LLOM zpJ&IiH!MP7kEAgzJV8+e!T3!ml5O1HI$%sQ9Bh+^KTD0!OCmoVLNF~LfPLnPbgYH} z+ozsdTodM~oT%rVVFi$;brMrETr=hs#pkXNPf^WQanCqARNw*Hm(g0KCc+DC$M5?m z8I|3CV!VT50BnwQm0}bF^m6`SOyQj1N5elGZK9X8@A;tosZkmB*FMh_q)Fy29nTgz zKYc~3BzHbDgr~(&B(Ohg<6-gCdP?C>y3>4(l)i1F&8hXHnigOU*)6~~px8Am(-VQ1 zjWmFtkuV3;SiTQtYVY0B<_os+OtbdB3J=jjE^C()GPVbZI$hz5o^d+pN&A6%0463t zv#z7qlkupUOm zUQgdY7y!Rb9|)Mf7M7$BC{0DI1R%%@i#%?A&_##d7egM~|IwnGi(_{IBR49Q{OUHK zc+s;EeNbX~g7T)^8(nE;@pcYh)G=~iAKnr#K$U!e19OmZ7 zg=3K*+w)5OE*>t~MWR-kk&AFqQn`c3#Cs9J4vDM|ofXC7Q(yr})5)CwqOT;T1bF8_JVDb?;&F zj=VC4ta&K&d3B2QV1&{^#`QxicwzJpEn|iwLPEj)|!z0hMy&gMV5O5nzLAl#3x8y2pguX7k>K*m%DsHDsIJ1I9`uYS~f-ZA!;VDedc9x z&s|**XTpw~IdlxCl&g4dt@PRy?O5{CDYbAXzoc};DRzCIc;Y*syQrVhDQI70dG}4a za%@xez2rlUd$ogy_BJmYSTuYXKK{*quq?W!v^&}1)1lF+ZxDAarO3w=yUPKg+YEq?V z83Fs04h0w1EYo%QHFY(t^hgoS%+#fXDpKVobgalL$D5xR{O?gUR$Bg>#|l8i=Hri& z$pIgd5gXL*uR>R}%M(59fOvT4LbAa8H_3bsi>|~vZrJ`vQ{vow9Y;0XMlTs>azp#^}bnmvi1u>%bhL;?*yM;9Q&>0*2Hwa zA7X?45m3*h;1{>}3qKC)sz(K7a!b0{o!dOz@TQzL-Lfzv5!h1jN;+ZYyn8?K+@oHlnS0Q3VJi zQM%4(>{puP1CB8kutXw8x^;a6Sa=O879V_A;`u1+2baHGHF@SMccsAsoNn%~o6S%i z7x-Ker3dJ0QHWCn{~Mq-nX)8Phne4K+CXTqVHbYA>1CxN81uqndqcyNv$6c)&fhAr z%UGF&U=5L~fBIei1a<);?E(WfvubfOAMQ)ND_cgEOMw!M&tV?W(RLQ0+KaE(w7n{u zFsv_u?(D8g&xl3Ti?$aeb2&|VX9`&)L3cq3J!@*_yA*ezN(29^ik(zW{$I48J!k zDo7r!%z3Y8{s1bUAB*?_zVE;Ue-1JB(!%m#5_M06l|qs#Wkus-_SA6Z(-iZ@W1zqq zV6&x5Y~SDk82zIQXu>4NNniuPftHccXX^t11-#<6~0@7WXz@F82+ z-dYDa@I?nI{QKr(=k+{vwiFxBBhU!c>~ia{k&*}by%k($q#_|vp&?tEzpZ~nQQb{j zV+=z8Uj+;$Euv)_$5~rQ)#9b&2xAk}t)+W>VP1_*FyEz?YJEsuA5RwpwI1LCpnNm; zZqeFioC08IhG89nseh6m(AYHiZRczvE=qVbS0}1!s+cC4?cZL8=O?rM4Zd*X^5n&f zrPwlL&`6Y8TDvOHeU}^E8@|;J#LZfVk}&cC)5IsfAc~M)+~BOEs`+37zK2ZJ`$YLob2CVgvNz=!{rs=5cxPn4hZt*BoM<81+%`W z7Li=nuzy=5s%_~G6U@3JJfiB5J}5Y^S-ZrWXCm7p(2;nS&WWF_$XRD++@a1g%#mlP zZ@St=FP)H9b+>O7gHz4STLi|xJr!bDJ54Lb>ae}x>e9y`aKD@jfXm}bG>)S5d+=_N zfVGhmcfr2l!+rf<#{2(lfG}Lv@w5L10*b`{>20#a$XFx*W9B4DuMp(!3<0Dh8(|oQ zg@AKhngN`Q5Rt{u=oN|P%0+cUgV2Sc{G}y)6YYwYc7;k6sv-!Z8V`cD_4R<(`r3Q# zv+wfP*2KjH657v@Yx4PUlKXr4{WG>@`s+D<1SpI6&37dt6uK4xo|@x8IEEKP*U4I69`3*M>}ZFxI19Xakf9U55{m4WRsJGokKOq$fN7O?;+NA-1*W8e}7Y% z^$`d^y&GBonh;1oeywhDue$0Z%ch??$=>-=5@`Qgivs_8!_!Smu1_)Oep3*5P4$uk zPkrml=_kp?A2$i_`-13qF(lvlVoB&1lIwj7^Xdzb>ZAA7_!HXcq3H)8U3_i2_!ML7 zdE9dke&PKhz|MIsLQht;7d`H&tN?O-B>0*cBs84OK-S4%|` zyx;&e#bFhfwDrfx6j!IVCs&)Zi}i)Y9r=ZtQ$hl^R~tz=-obz@W*1tN7`Vr@jIzWh zw*VndRxS$*VlN>Bw|BWqttvLl5aOoG-5^bJg&AbL2rIL>oq)&06!ylEsC+HX7ULGa zxG*sHQ?sffQM@MF1TzWdruIk)vEO9Bg<}C3OO*oQvXodci)=9&UdB!i3hb@6Df#5c z?Q96M9ZeP#Y(zWLJC@Uq+Fv0KEH-*1amtFTAGBL0xVl^a$@FRg* zMe@x3P8TvqKUTT3cAm@|LSbwccP#(W|5y=rADW~O9m@^SCc|p{tXM}2mj)_t;L<)Pe2pHujf(tVk&vqP* z)fnYMoDL}+v>DRYh-!_ziXgXI*`xsUIB{Es;R}1MhN7ZsZ0pqWZqpyY(!UG5M5Hf} zR+uIWnH@G8a1#)trFl#Ga5Y5{8~4|2Odfgf?gj?sY_%V>Xp!J-i7t;8Y_eS>ePd7G zyvT?HItAY&>bE|ikl4uv;^SO#apw^|!O1kxVo4`x#c2MLBhhuY+p0@}fd&BnP1I%~ zu~!%==OA%htLEIdrN~nh_y;g_I5jtv@;;_~o6}^L(3;r=E8iG$L^7~S5Hnz=hoH%d zocM3PDKHga$|-21Z>H7@Y>!_Y^|CO~sx(Cp5+DET2s`TtCzRBEs~_^uR^iJ57=2+y zmpW-IKZs-k4@T+|bF3XRZk+=}Tu0;V*hGz>Hdzajgb^!wKFFtGvh*2UqxfERvavz2 zafy@EvZz+jLJOU&`!}_GwXCyT_}m#V!x_xxpPGkI6)9Fn_6lv)@==Sh#!J+MxAf&{ zEI}VrYCDq(R90)H@RaJ1J5+RjmjrpHFC&=}C8QP_0SPYYB%WiV4nP8&yY=x;>e7~6 zFn9AER1nLlB19N(<1^BV!&b}Fh(F5HsE^7DL?+Zl%WTlXm_%t*hKTA!5Y7MY$tcp* zGT@?gBq}oV6m;bKN7h-GH0prwIbr)9hMVxbyiN#*UoGEbiL6xWq!!AJ znsyALsish^!Ima?z+^rDGMhb}%*MI!J;yadFLLWwDi3)%22j!cOuiLMBYqnZQ&&~p z5(+1pS_XK>N3=?0>>KTckou~?uXRe3A5)P_-4^`DMl8@{`RfCK&Z6~}EngwY085Fp zYm;rw+Fg$VGmdv!E<>3uh>#vs;<~#U3~p))@}=JIq|!Rn1Yqf0%HgPpX0B95NQ-v# zw#_r;yJBOq(MXFu@;X`-hmOhnBr1$VHBF?3M+m}F76_wei!ky9d#h|v8`h)0Yj|aW z!>Ga5iNvAL7DoVR_n1^&BJoroq=aozeK4~)!2~qNrz&$$G}vj^TT4rNS5OQc$0{t~ zV}mA-c)cW+g)uA3%@fKo+c5UE`@Kj^x)?P3&B}7A8c@wkkC`c7ON?~Ep@gzjlh6#S zsYef1S!)wD$|{oR7l3II;n+0bAp_PZ%j1?Nw6?iwTvz}PY)x!GS_SWYi?E@&`ZZiC zkUmnl40EyxGqNUKt{kMXLEd7=p5XaqM(){y*)%sfuD%_9UQ__4jXBDRZFi@7o>_=Y zeYq3_bqSnyZMNUm;MQ4vCJPaRpoW5TI6Cy0|MsXe$JAL8 zF6@MfSL-9F!uv|rfO|%lJcO@4jWO99b;(=zJbn+K!>oSW7)n1 zO)mhEb!RP@U=p>p%G@cg4z5i3Tf5wLlibav)ur{NneM{ivd&UlZc3=rbwS!{uz@3r zIt-kpKOI;_HS0XomixRto{E8RJcfCNY=GLNE?iZR^ws&h0Wv;N69;MELg@;PAnhe+KU> z@L~wh>P?iD;|bsDq2LTwe*WVRTZPckdqtacMf-Hh3=!6Usvfel?gH^<7()hG-faTF zP5Z_0e$YWn=sEMy-OC+ZGo(5Sb^%qvv)}2 z>35#P$o#c`1A{ZT(V@T+;JN-m8p`-hVJ;2E^>-_9vbN=^6lU8WC<9aq1EZcrMMM zo}IudJvAj65+3?MY*}iSZ7mkyUH5m;(w^bcb~avlJ0Kr6KYG%uZ-+i}ziss1BVk7a z1EK+o99GTxOj0v- zV9N^H$}^9du69s1T6xYcuMzlL%v#WG#4$b&cWhJhvZr;JFAMDpmI7dd%#t~J5;v%c z;_y4WIM%Q24_|sn$q`k4+g63+a;QXEtp7IyJrTKZozCmsE-WfCJlE6{NLQ;Lea>E~ z;r^blhRlH1lT?rO#*sZ&l&p9KMhDNk%Q*{qP3uMl@il7buk!{`eZiShmx*Thuc%vTQlr8_w7nVcS zttT6%zD0xU&F>)m*Smf^$bqW~sP=dsXNq7=p`_rp>PZ(BuREJ>a}r)t5}vkXuC^#_ zjyQcsnuZ;r7q?|IAJG$)5t~Hg6^T~j;JNGI=p)O1^x%lB$Ui_8%L6XUT^GwahTTBo z3q{PXu?M*OKBw2-y^m9gPjPIP-GDend<5~vvVHyy*fWTJ?`6t0e<+a>q|+lDIn)X> zm$?#pTmNlgY{Pf>LNF48+X7{>V_RWihFVr{gsroa9$!>-A?8sn^VBD-Xm0)=9szX# z12Il=J5e$h(ILQiiX{FbT{+yPH1jvRmL@1gBXfS|y~|!h!ytyObD9y(sDxLr-P}7# zl|`bK=^-=|cNlFV@>(ILx$|a&&lR`%wBr<$vhHvvl<_PNZOIPbO6mYxoiYPFY zgXQK`=Pu(zoQk+>?-;jbLbGG6Vnu2CcT7X22iZVt`m6r+e2U}o+~jqO)97T10G{3$ z^c27Uub2mG9AYo>+PIagY??1;%sp@1H@p=$zJCZrk&!qU6P)31OdCVjn;&>1jCHNu z7yp+<^gs738z{uZSVSNoCi4Gt&)UjD2ZY3nh$|uqOc?hI_!B@WNPr-X3L{Iv{yi`| zN`RFy8%~!buxf%=ta#MaM%90mT+~981~JOFb9c3F(e0>uw~$`nY_@Y>-@NSJZu)k< zo-jcoBe{L9_-Nfe&$`ckex2Is=<(f0L9E)Dr{fYZ&tj3`S34o6qiRIscip{T22g!Q zNBW8JtDm4l`|c2-e^yljEFq|T!@fbku2J5+(LGPp?_QfCzXHA#&Atx`wrBXMAL!|* z@&U=yJ)_6ls&DX^-^#_`N~b+wCjih7fawze`m;x>$5k=iz~e+XSklyOZd@nNDL>QJ zMtybHEcnvj995@Yxmg#wLl-3vz)WRLHH`@Q!%lT|MDz~o}^Pg7s>>eAUN`(x* zKXeZ8f8X#S)F{9U8sksMXg$F&SSL8Mt7Ap7D3NUuVLcD*Z0 zo#tBAuDJn64?c;a;Umk9zFQ^91rM-NX_efaq+26rX}Lj#ws%#GnrdxJuW`9!vqM}_ zYb&0Vyms#BR}b%+rto1+G>*lK!5}2t8f9U}2q%pO=EahNJ9&pK3Do^9BMN0qVR_<< zSon*)PLRxgT+den9=5n25bxil4li}yKkH!iOWDv<6g{zu5e+1`AjM(90vqds8EHK@ zh+rhpt4LZt$TWMau^7BxvV@ejP6QwjcD-f)Kx*9QD@KJNb>giwDv$`$jtxqD>?EU;)TuPKFeJKcC)OT~r_hL4^xZW7f3+WRpklC=g{~K{aBH z7H!$H1iwd{K&LYNOOgLkm0aP#AlO9Tj5Xk3?f4K__R1V+pdHrvj7>z+kQu;JkOi0$ ze}&wlJ0Iuy_11#`mel(-MqBY%5(;2Gfl_84(vjo`g@pT1;GRZ{so;XJ2$KDXT~RsA zs74EIl4`mMrL=M*!@ym)^nS$lq0M;8 zrC^ndIl|oSZ<(W7f!(jj%b2h<{??h}%jP$P0`7D*>d!!%jY+A2{aB&6#jZIX4vxA7 z4B+w3Eo=69>vUzqqnit?dy#NvNuMiJ`b3kL7cVf@Wk~SjZ{so+4$rG2r76iy^n9X0 z_KCIw6w6z%2(kAIlJ)elym4$6%sM~t=(ILjHudXbx!<$S%ueVr%Am)npTy)_Q1Ni+ zg*mW3TX>LO&An)K!)@`wts_M~jlVu(T_5QMyGFnNr0@R0QCgYtfPXH?k?~_L`X!F= z&Wg9gfN*l}k()GTMQ>!d{5W2*yhk+=~A{K4Gm&y9YvE8r2o;}gGV!&f`K(dIV)@5GTO0;bjE!HxR3%yO%0ub5< z$Y;6BZ>N)jqT5C7nxe6MhVW0eSo*}-FTcQbEALKQ z_@HlB%?cY?i}yR}e$i|b`z=y8c(ZoLUN64@cjsCPrr1zQnNgudiAptqP<`YL=kELQ zlsuE4g8+B3wiGm5*&xxUQ|L)IfBpRpK!8+}wEFP$)7Te(Q4EHs{AeAPzZsA~MMmt1 z5}8Xnko42oEoJ#4;*UPQXbcwHHzz=Nc&HqnzP-ol5xBPS(J<35aA)<4H`q=+!N%&D z&^OcKB+g}1)|x`C37fjwtFibf|N8<-47MS{KEOF0k3QLHsw4$LIA6>RqW;1Ph>m5N zoBr5{KoI>*ZqK_p#{wk(oaX!sNAAqaZ$GWV=aUYs+yiz*-}z^EW?&(^cdVSo25&W{ z#R-W4*}v$V@rm%38AQD$= zIalt>TB z1T`vhEY*_2f>E zWKM`7(_dL)<%HY&_PLK{(#;#MkIC9kd!pM)kvt&2o`S^tYXAi%EZ(v7V8}*Ms$zNa z((sSzBt??*N4rSziV$Q1U@3PGj`}>T1{*Kr8e(OSthj2>FDG)}OV3Fh#eFQGr!$H6 z9y~U}Lek33O>S=ewfs9BV~k5lFg){x`Q1jjTE~+o7$@6?#yEw z19h;ZbGfb66PCvuUvCk!3=^v9MSNI^(w7gw_Ze>eW2Ol?C>`k!2I zpPgwEQusi}##+AmH(_gMu(#y*IlI_hovdy2x#;1=?}&chncRnOmYlRK~t zD_DB-SbTw8{gVNC#qMjEN!5Vdsj@=b`Ntbgdzn3HtKOS$<{4`X5Q>E);|j@UlFT_luS|;gl7#of33-`AnlW zN`2vSeUloA5l(=;g7E$@q^$V50C!9OlS@s=Oqt_phvhzOjH9Y8FS05xSUf0wOtZ~5 zU62DlD>-b;R8!zzREScW^V0(JttsIyLt9u5{NmaGD2U4|@Zy4({JqoKc!5;$A@>cz z;c%SQbz!G05PGB8B>wgYTkT4#A z+*=3S0P8ZlpqX-`Zz8*X8 z+4M99FzWEsJEw5Np@FGUl**fVb)ACMtE#A7(!HQ_;}ynD<~yc9HSSQOUINvwc(@pz zQ(k&ExXjw)%sG@#L?2i)AC1nZ2--|kncH`cnSCA7y3JB-H%Rhvom$`Uc^Ocb>4zA{ z^U6}wOtK|BAA^0w(YX#TbeZM2>fk$$ucX!o$RF=_K&@H&!>}tsvG%oR8V=Fc&Y;%* zQ@hZSv~7&8&PRh*qP`rmN~;d6(Esi2GB?k`EyI06;X12b`-1=L4t9yZFuR1;zL2wb zT|hrC)NzEN^8nEc#asQ?7sAs|_7l`Jodv;lWxUlK;257rF;M zUa@q{e1CLuLFt@w^Gsg|)3IEge?jP^t4|k4dzyr}8BwO`SJg>**9k^YaRW zviKYfH(Jg_KOw{EP&``Vh7zIq+oj$b0D_W+nuZB^&`x3v#`{Eq+Bd8U!Gsy8DU>J- zfA)atUj^_Lm@@Y9yxWOxqhe&(8Ex#Ztn95-lkDw|Ti`19+sO~9#@tLq?7;P>l(rM*AYet5R;Zw zSwL-2laQhSS)5sdKTaT4h~dSj!#pCziI~AA>|bplS8FxdiXDlXj8g%J>%c^bDLlzz z^Ykw8P*dk8EFgss@;0FbCl)vcxyjx8=_bnNoZ$0e^ziYo7<6w^U5P(I0G z%w2KIPr|zltqlbM&OLc5LI^~|7Gkd}hE=+{>WTUlIb*WOf?;IK;qG6VP-dV}p67Bi zBhdM`UWRj7RUC5I^Ya>+OfLgpq*(TLy z!#nD7gNv%#1CHh78#u-K{iOqH7{M0`kX-uB4TgvK4bcCJ*1p`oR;YoaaL6T-gp) zxNgt%QNufq!v(Sns|Jp`9IX--A#a(4j9yWZsDv0RWFH+#-lhbfVNouL&@&n6#Tt{YdsL6(Wd~t&q;tx@T?j526HFGrnz$NZ0c(N{!zzD`g=%w4 zYD$r};A_dhmu2lyqt+d>xU@eDf-d(^olVXuEwiwr3*Wf4htgZearbkoY@mf~Vh$4|m><8hXhBZ7gh!aOO zgH3gz#%%r$ZN)<}1MIm`qY`RugY=ve4)~gZ{<*F+^E!n;!EPObn&2XE(v z@!ML;aw*{bN?mqUSBsu~tom|4!J~0^7jE5JlHxgYnRwgEZ%d{)=`&t%*I?3utTxF4 z-@)S?y4iTCzSt@1S?9vy5E-x3e4)5xRn`svCb>LMSAQ921Yq$9&Vrmh;g1^S7GaRx z8ZVsl8@0>jmleT@APX{Zi#Q8c5<#-z_rDNKk^U`Bonya^c|+5c+YZ_5{!{*hH~7u0 z5^+8I`@wg{10VWLx^)O1(U)In_*GKwgEvKW%Q%m8%z3}~LDma>>|O2c)avp>GKQ-s z+Iz6+8|D7_1kiE%(LkJy;R~6Djlq}U5uj6YGD=)>T$EmMxBdP{g61LWm#q z!-U`KmIuUl8>P2_Ba2&FWMvF&ysJ)WucwssBYf1%wX&K?5h}^gF`#q-n7-_tZWdX( zBToLY0Hvmr#{d0CN7@ZE)aCGg-uTRVpW(=q>VE<+%Q(j`D(c;LAzkc$L``@L||4mC&spbIH`4Mv(;;Qd}|K};B)*b}$KkxEKR6P!U zc7S1i66`n=8Jj2)=^D@hatjJ5!#&b4!DEnrrv62J3y4x9P+@Hv$V?E7riBFW*i2^c za;ZqySaSDfusa!&IU4G`gWLH4<@P4uW^pg}u1H2@I@?cwc5lBX`n|s1BKx~~z*V<9 zI7AQpz=Ckla5o$rlnvNaB`FG1q~;Vx=rc1x_Syu>^7mO19hVXSit^F9KJT}C1Lo%y zy@UG>*V;{bl_~_N#jmNewqP8D#$z zdB;kBJyJ0M)*3nhxhKSSLn~Cl^dRG4reZ>^PwoC4h2E0lw!u7RT@L=NVvsbb6JHrY zDns@nT&lyY(MWcV8hZ|z1GoVY-*xN(@81V&N$EVM^<8AK>W>*i+%?&r936>2d&iKh zXpDm2!~)g>Bqb*A(_bBER_hC+fQ=^CVk6p2Vx@R#~>DglBA{PnmlJy6H zP);3&4J5jwsM6Xfw+KvXUyXsd`Z~rUE`%e5ZdD3$*sD3nEZ(RJglaA%_S}6dPP)8s z+9#|HEByU|POR6nkQN4ouiZ9JZ=VX}ba&U))|!w1hvWmBj;V0+(+B83eZc$E2Qq-A zYFY}&u$A(~Cf4dj5n~3jkTr>h+md8$=3YqamJTy_%g4G-qT7Cm8^x$w#0BS&MFOFM zt*ms;(SiI{4VUi*UI^qT3U`Ax=EbOab~ODC20||VhKh*_v|%oG7|}L zC&BxvX$5JsN{5ZB5AJ(R5Z;-$o%Rn0uHYsqll8%c>1=yf^Q$(>nj2&&-3%}`eKPQ` zp10-4y9-xXy>|an{@9kdlImu0psWwmiPb(g~Lv-SX0M?!?(A?5jlj$p1vDzx7}l$Gv$^zP>@ zcXar9i`k2HBr8)C*INXqOjaU0!C)ecC~>7Gf*`fcO?%B;D;%<0a2*`sUEaSLBcY-{ zozWt{ggek1^H8(~FlDGLh8FHTVFwi+j?dvZYqTcf*kw(n@*Jr_PC?GP(_^fjGW}P3 z`XV^qy|diuMQoL?--9xSw%OjQv>C0sW-YJXIaq^ZA;K&mxVhqy6J;Gr7V*EAm zwq0HCKB>F9avT9*9;&LxYcNQDpNs_?JQWAVLj1*GiC;t$LP9GxSwab?Y)U;A(07=1 z`{cjkTZEOLR)AZ?NI5=3`B^56))vMc2ZW_+GLJ*Pjl3izp;P@-Wq;s4Ljle2dbw*TQ> z8oQX9h~xDekon3af+6>iTmrd8o)7y>TtG}P@1 zT^a*`qH$NUgQ~4N!Spb>tDj19(zNQ=H=?ook0$rG_EBkLRNV7^(A0R5m%DE|0za#{ z1aaBg(P(o8Yhdhl&xn_w+=O|3DT3aW!|SExljYzbY?d7MJ5hQCzM>$(jIyN4(QBwj z7$@(zhmz;+aGr-OCp_lYXQKK{q`j8}FIhG&hT(wmmu)Xuy`67`^P&EKTl{~2gJd17 zi2pgmAoYzfh@U<${DBbuuvf?NQu!2tp;NCFfWZOL36l2n0vI7Z;leWWq_jcB7Yfi& z(z4@V;fcobQKZYrt8!~uH0+rFA6M@f9ck2U3wP47ZQEwYM#r{oJE_>VZL4G3cG5w` zw$sVYIqy058~3X*s(w5_YwTyPx#pUC&BA1ZqBZ&t4up>%e$Y{Ch}l#=`+_Wx!S(ES zyw_dVoKeS*^ONd7>Y=r1wp0y8z+(i*O}AUFkcc<}#7H9+=^~rt*naK8_}_&Jt{b&j zhrGpZqfcmqe&1M#1D`UGljMu@6!r~E;oY!#SDAb7s_mc3<~I z8)u6BQefWR0s#-uGI0$?!*Hn}|FXqf@G%6*xo)AY25@iWLW_l(;>7<8VAD*D_e0Xa zx|zZvr{+xLr_5hE^Dr}gD;&);72)MZzalQO%qp{F6a4*0&HbrpP!d<{R`9;*mWhB@ z#Sqoj&xz^k_Q)Z)MOyCtk zGYjbI7XW!$`5)CF_SM($NSXHh#S0S-{JW5B6*1ka|L$R2M`D$tRMA#32NY*vGbL2?d0!RC~y!+g0!V|6Mr^_1`O}y$@eB zJ-!nw*$}^nVgGw*Fq5vjp#h0>nsgBQ_4IJD4%y;kERh8PXyN!54#-#{R*+%ZhU9gJ z@QG@gH8vJmrOyw3y^9!0%_V8g!^H{QhuJp`#}Dcc#`5x~t3Kzatew`H94zF7Y}cJl z_x!B)Q#?ig-T_~4{Qg2+o59XpgyJZe18X5s#6H3+zlC%VL_~gt%K)Gj4TJN;n1gJv znwUhpXn>L7+2LK`fq3j$RFQ!%-w_(fc5+dm$g8ZC}NDeZ;-rjhVo^Ns?`}!8)+pWul%^gQQ%>jn#!!8$R9K zjCp!+?Ge4@qh^zSCO{IYN*veOPnZvEXD#*oVl+0b4mB277%kn+Y_%~8N}EY46U#M^ zIV!BDcu;+tW9(d9*BM(JR+u*r?!1*6Df*nn!}^SQCv&#RcysyFR`Zy|Kwaa~6j_*; z5>Gx|7FKl^9&Tex&ko7hqp3u{U_`i?G1<=fVI?4)&x@5fBVZ#`lSop6?$N==sN?{> zIoU;)A_NOP%tjp~$(|E~lnvhzUhp) z)5H7@BiAabaR8@zl^df~OKH9{_FF+>7=oFT9{nJy+4{tZ1RS-}s0jKR`41rS=` ze01+yUG$y7XLP|~VmMllvxYP5Aw-oAq*3&XTH`u(>ns`cqvq^AG6hrl{%w)@Xag~D z&A6jUa-LsR)2E8l%aic2IIM~yOXOC6z3FZdAa6<01pp)RfiD%2-y4i0^P*nB{VISE z7@}J$w;0=M%mGs9oedJhlUzl>Z3fpXx(rX|N)h>XQ8{;+wxYLM+zf7Nk3c2x`6VdaUBw5F5xS31^+RglAFEx} z3sr6k7y#Sy`l~m~$tz)+J{SBA>ZyW@7>Er=Bk7awr&@oHd=z`g_H8=CbPf{QQk?tZ zI`S?1zRhZ-vt3>xEYvFQtW{C$OaLY^Dkob!5=VpOvE-o%J0|Wy@l=2ynZ@3SABP2= zA#;4-dB4%PKvss?_*5OJfq&CzdyrVvlqr^-0dOMTpKdN~rvmW7JD&aXQ%6fk(Nw0^ZV)H2Q5q@*0EEbB4}HtcLn89cI1S8k73a z;T*4zah!bMy?YoI(uP)AHq;Aat888V5jnAmy4J6e{SCFF50Kd! z4!zygEr0)q3~&d>EhG691fNz82zX|U`h^57nm$-sA!(2wIITltkr6q$(2+RLMGEGH zJ(@IiMoKrgI7JgmAI>`K_dwiVd2PfWRDElgYKEw1awyMKCAHulumR`H9B!5fYiK++ zT`?ivFd;r~Y)n`q!6dz+(6(Mv5!yCd2egf&@v-`l!$ zbO5#w*xlT|^!j4G*SwwxI%XLRwa=emybff+;^>J#QPz2u6>#tmPczkEJ^bPC^e=S30CSdtS~Eq)AoPxgFATXph`y~%%`(r* zv(Hg*I&L19?mN%+NoCq6036Izh}4^hfB*c{v2S0CC@=RBgu0W< zBprf+&djtopUQ5P@E6|f>WFPi5iBEpFg(NJJO^t>J24NaMzZER0M5&g8c|*)5P!-d zClE#J(Drr6Z;m{^P>P}ceUPsp6p)a5#Z+i_S(apauIku!9#G|MHEWR{XTlI-e zkAxWFNM%kW2$)E_ff2AKll5r)p<%>QT=1wOR^2ed58_XF>4a0Lf_U zq~n9F<4fMw=cmXIIk++mffZIishyfiwAF#m9&((jC>OsX@?p9f zb3bzt$;fR*q*QDb%nBBu*{5BFI=N*+8zM-@Pv8DZ1J0}8k&bhRNt?cEm`UBH!@I)w ze$MBi*QP&`>G)mHJH-vX{ta*n37|>3A|*V z2Agnj@}3-8J6nb0*Hzt?c*JS(ENg8^vd-z0JEO6H!b^>kC!uM86RlZ|5N#xt*0$*w zd1RMfrJ)k^pmT-NuXWQbhXzef+|5$!`!he-@dB=^_bT4$+}i~M6QbrNuvY?z8OQ7{I>+Yr z(h?Zl;OB5ny2+~mWC=Y96xLtj%(bKgvdLM{c1Bw=M%f#B1cAgF_H6hItcj9(SoJ!a zt!D(5v0rg8p@&gCv@`B+m59FWp1(RJpG|`q3KC-+{{Ao=8ZD1Q6|= z5pD~}GDxT3kR2ne`S}FSR|e%nG2#$aP3J>1JnFa^r!O1_&{!T=m{JFmC%%2j{e9~` zc4n^F78QK6D4vvq(Hr-po2`G!<^t?)USI)z%IUO?(&%W6Q~pV2j1nhUfUsAjGBl+R zddWB#Y@STW3w%B(@Bw;(5tfB$ET3d7p2$!&eoyEXa$Yb@&Q0|!f3+Nf=Y+M=3G%17 z>Z!q4c_ls^1MaAS#4%4v0`DAuilk9rTGl{dpO_9RvWt0rbc4+S;{UcR|LO3W{*F6? z!2egz^3Yh~tOW7nhfb32q!fTIz7!sW28Oz^Sphm(tWT{RD#>L*jz=?F#)8(ajgjiA z@cR>9h?cA{ystic8+Ye%J;f#~5_u?c)po}8VWJEvN8V*zSSPomg=|HsKm1W#EDrrL5 zPQ8f@b_V5V&tM)!8&ntpqj~!UMuVy)Er^F2zktn}d!T32TdGt!UqQQG zorw^H2EX>;xtkf}pcVG_3d8O>5! zmf{!i`qu_u&hpe@G`+&@00ny4Kz30F=~wSi2V9+cWUGq(BAw&q;h7X9 z15=xo)9tG} zDoguqb;TkaN;|ZX;lba=%ci>>5Y)u9Awz%bYqe&pHIt#wnUMB~TbRTsQMUjgPf}DK zQpuDWXs0QO1!Ve&Mp7A}Y-8SJo(`4@Nnn&`$>^#>foMy6dbbX_mL>RvEpn6Ax>;@! z|5=>uO_eomHjaws;3XrCc17Wjza{2RY=F)p_o3TIzDPZ_S|cKj%Nu{e!!+>;U^Mj^-V*b>Ved(}rFX{6=o~`q0StlgmeDrw1kU$o#_H>pRxmk1UaoBLQ6=h3#n0($4gc zCcH%ra#S6dW%280hu&w&?Q;eF)HI7#UY+%7E*0ZK!d2QY?aTaPWz3&*LX2UkFNki@ zI{D+k25^<0XRq3X#iyF%pe3c%NKm!S;3#{=Vn(xC2^G{Im1$aH%R*J`y(d$+c5+`t zM=CK>bIGyeQ9h)OnmO1`QHeH`w%?$W=dYeRfcm$BZRP?IXD3qfTCBR7h*P6?MmG&n zVCO}Ugt6V0s0hrIV#HAwUWG!6D~Pq=ohsEzG?uesW# z2ZW!ezNr=RYXx|k9E@@RO|+pm8-mo_=JvR_gfpwPM-c+)ITew+0w$o_><0J_XXSGx z!%lou3JCr@y!QK@+iH(8I_D%e*OOehkQ`(~5%UaO-#~2z4`rvd!yHwnJF^}e*Lu-B zka&bMl*~<@Tue3~#b{U(w>DCRC=iDr0o)2Er2}eRC_@}TN_L2J>D!((29`~c3tI)T z_akpn_EQ^2yeGwL8DhF>tC_pKCa^kxliJf+cM(G3?bje&A zjh+c0_|(slDfhGqN&DJ10n?tpTg$;BF45Vmn?r`jKS@59nf~2wUHs2#dZrGXrZp$57ki8Y%4L7^5O8PRUtX zpIJs=ls*rc84&^VEgW&b)KV^Me4uel-TqLH-}+_c?cg?Md|%Q(6u>HsPqS6kHsGsm z{V6ZIv{d13AtTgHgv{?;9t$7*1z@S{!x>)T$ za)&e%bAtl!!xt%K1$?K-9AZ8pm;;3dD1yj6vMUwGsnF~3DD8PYQEKC7r;{g5YTiyH z^fBaWX0%v{+;CxIw+Dm)A_P%^o^&(D5rB$m#!2J$-UQF{YT7%E)85{C%@of~(alW_ z*CmXao)C6aD4G0>A-}tNs<_mJ3~YwXjP#_|v>6`HEQZ$HA4-RL+xm*0e{m|P@2#BN z2An)m5VfYsp(a3VwzhA+`O|;s)Bk8>YxA7{&7N%FAO2N+Ym1NHUzQ~1Wuhd(g^B-+ zjt~~1|7VDVy9EB9>a<85Q?&K1LV6_8FAD;6qZS3x_!diLIc42f*J^9?)*nkQ0}EbG zAWtgW6nq@g!1GKp;ZEBYi^)(Q&8ewiVcw`-iiUVBIcYHF!!q9cxy|M5u3E1N1%6`f zg$7|T{BiJv=crw4+ZbSn#Hii8vAtMZGreI+C=F59` zXU!OD#m;m$A$jBr^#V9d8C;en7_4DUit^H%p(fzpMxcadhw9+p%Vc`3H$SKx!L^Q9 zVnB+23|ljgFW!ir7)&Hl<=vqo^Kwrjm^rg=s4J0W>RlZQ3uqfQt$r<*H5~DJp+>f+ zS_;cQ0hbT#0QG0IIfE##8aS()Rd9g6Y;>3mzu;_6286N*R3W!^TYWRW0vkWh;B$Fz%}|!9^F3x!%*4s?cUbt(|2;4NQN@}NSK&ebb1aC~ zh5mCG&}DG5oW7-1`6RmyK7h)m60QUiA1N7qqMEp%KT;SLii}G?m9)_)MD$N#uys&8 z(F7R3d7LSTzIUfvH<*=j`bsU-$i0ufP{X z{GbpTv`@ue6;$ENugD))5=?=RPS3Jvh__UsrqyHnm7$}98cA1_cYu!?ofUQ)i!tjp zlR27}LzqcZsID~wtjc?cL66hu-h=g2>-6=X65;sU8iwJ?F`2`EQ%SK19wn+#FT@NQ6(=#0rb2c|`?u zQi-Q%Ze=Kxd!!?2`rN3v_~w}N#WfYXD0GHB#-=eMbR?ffOWtHvVusHv7eM&M?+Qh; zdpq(CSjg+BHXhc6$1!mmBSc~_a`*}3-ThG_5xZ?@WAg4w^#QL#M28Z|%{Hysk!vgm z_%e^J?ox#=KH-*U&N~(-R0hAjdKYg&C|qoc%J(W_&8aNc<{P3k@x47};!k8}f8ZNq zttRw8|9Vn18~dD{ye|C9!;Ok=wbGrHVABlOM1zNu^5NC)ptD7f={7kW1T@_9um?2N z%OmXMA6$9`=>w+cT%779^aNjYx@ce%nK#%iOh|Tv3C%LeR_p0;!V*$dTdPLo&%zW= z)=d!G^60ir4X`-63`;92q(oMmTRIonYjPv@_Wb*Bg^lkr_Cl9^DD)m>*3mDZoFAmg z1?dYoX^5_~^*a6Wuo`76|DmyMEGEytA#1`wEg)dY>jMHyzJzy2^_g8FcC~~36#X}w zw+E1Fm|;?a&_+k&NlOgU`zaqx+k!MBQ!UfA<rnCt z^IRfVaf~zdDS66a5Hd1L%E6DtQU2%NW>$EY37PkmnFk5ij^iu{i+D8U)_jLL>m zTNb7HPOgm4({(bq`}k%goAw?YwY@K}aIZ^X(2d?v&=$DO>_DN~rB*<r0uvO6@~&o6#f9RdA0zIp2Zu+f^NIkyvIh#vy4Sw*$yS(s?j>KTNcdhON;d*XQSZU1;z^YdBc>_{B9RdF+k4ADPfFABDfh`PX+Uo+f;9 zdRy*O*>#|}UsCN67SCVY{e_)QC5_g1=)ZmX$JLrH zLIss>R0c6MR+;?Ek!G=KrHnQmBHt=)?+Xpf{u+5^m8#cxv+Im#m#*?wNxm(HnCn{yiD=8jgJZYP7xq3QZ6&{7SaWUPX>i{bZVHD!}Lo>It83(ssF zgfvdWs^W&Ouet1NA17bln&L)A&|2iLv#Vvz|6!hS_#?dNF`{o-SUBOm1-Q74wpEmQ zK3v9+C0=h}LjDxta0Ug-*zAq%7K zKz=L3E7ADg8!i2f066fwR>j8XN)0HlE^}UZt0&Yaw!*NmT`!E`c=^t@6fXX?q~+%k z*c(cTVJDvzBfg48@=AfqZT{zpj07*MFQK;_6l6P0nsN!|l*1nQ%y&7ds-_2nLtvH3 zyTq5!aF0+M0IxtSMm$z=GNn6qia#U8Mi89EdLgmyCJm}@@_D2b0RsBt4GM7p#oaKy z!93faUw>gfy-~itFW0mGg)Dwo81ZT1l$~m&$(UA6=h=@qm;&)SyYHa${Fy!Dul`ns z^ZwkjC;tXcEihn=ox`>GUBDL}8UGi(zDWksH!_KhkaM4XOL?)-|K&|FM8rt*R|kPi z>f41(5<0~L46EAy*G3z^D-Jb|&}dBL+Zf^#J%5<;a1qczvJ;XBRxE*x+D^fO=HHtE zQN8_Nh5AJELxj6=EV-L0)UGzuDD0Cn-F(N~v)=)Si`&-%Jw88~q7J!?(o>mGC7>FS zo`EML)kx05Q@`67_X2{!Lr)UTEM{0lxN_Fb!mBd?rZaQub8w%HUK+p^>yqLmvwVZf z$etRFOpm8zWOMl@Yz)}aKeX4h5)+-qdX2J={ydG-HKcaq=ROh@XEV5ZG#zh+Roe;Hk;Pg%jvj+EH^hIVYe6*VY0<;9U(NCxOD?!tx)@S@gs@D5mRv`DO3AN}48_WP z(g&CT*i;|`sn|-k_e6L(ieH4MOc#*VOOMsRG8r)0Iu{2L{cu9}?)hp|XWo8Y4>J6r zcgi?160==Z$gUKFBjll>m&~52yyk96p4iAW!qPFPD&xbLPG0UB06t*KuWA z^ys%n`-A^8s5lo~23#-<(IdvNTGt?SVQ2gkU^%_l+ZZ9>U3VARw~0c)dhwB@S<*N9 zb^M4)jyYXfatANl1-ef!pu-wS5kNpzZhSc+zk4T4N6r+g0{RmR-6-C$U=WeAd&bVQ z!{}l{yTtdbI+zlU7W4i!oPvRbpl2+8t$4nE#bvmK+jkD)FPMctM=MUzz)hFy^N@@K zfK>8*$g~+Nd5Y6zfD`qFEWVJI8RAUfZ!SvBl4@f21KHw)#pOh9pl_)xRGOr?t|{Z2 zB*obevUz!0RNKdFePUq&qEGaK*7geJV1ZYxLz5kt2TpKi?MB8sr<4;dfb&O+q?V1)vw- z6%`Wk`xEQ}N1S666;Vi_!w7gYZLu3PHqG2YB4&4CJ#RpKsPobw2)MfH>~$L?C;Nw~NVz>0Wh?wIJ~CD(ZptybKK zlH{W%Xa=rI)$>Rtgn`N9UXCdJ1w1+9t-(Ri%5efkE+M=2t6akl@p}nj_>#wVZEO0? zzjF6{rvFA7Qv;8RphV!X+8#3^2_5ZWDl@jCjTuP{{Bxg*ZZIg>9y#}{3UABug!Ybx z2f6lWVG*d@3kx3V4IF-s ze@$4CqzjA`I50qwpFCIb<2fNDChaoLRAfjs?cJ4=;BaW|bB+59g7iZD6euQ%V6%Qu z96|ko`s+_Waj%fyCFz-J6ftM3ycysdDHZdHcX4>P^Z$X;fB7aG{t=N2+XujQbm~~B`xdZU~1f3fiB!Ow8Pc!}b>k6yh zu{D@_Ytd0Ztf*+fAlk#AOhlkT9os60ilA-NXK3dtQV+!wz(eASiX10;VHcsNPTg^~ zWkgk8UmE*Ma1_Z_yyK% zXmr7^>JU97az8E&%u}YbtonMR!r;aT5;#wr69?JqLQ5dcQN`(TIe3uk(4(upwnwst zDKF#uv`4$%O+DclNOqpd!ma<_d`1N`n;dg+B_+26pmv4JGxRV(GB3iN7j|JhqM9qk z_+NH9Cwr5Vk&{N@s1Rfkr%)5!x|qM46*V6b&OeOO@n0fJSu@-llgk?f8h?5qYu@17 z>n3hlYQUX>pP-w_^cDL}rxL)(r6h5LxG^C8&%r1`e(xmIEdzFi5hM&k!RGh}=X$96 zN_i!subwgb`=v<7DD_3{NW-R1xdj` zoLDD*<)#}ag)ySR0G5-*F7I*4jm=KN$i2-63rTeq?y6c|vxC=FS%~*aXDicydWZyE zN#I3jk(Edl7(r2k55mBW3)C2his4{`mx4wWdL#F;?|o!RAm(28Syd8;M^S0`kbVcsa@a3 zVPg0$@P&?TaY84T1ZUSwbRZ0NMCS5`r?|w&&4*eOGEU}Sac3cEBC2c*xyimklt7E; zGGls=6=u6oTp^&hml}q6kK)gtBfxvs)@ByC4zc5tlA6)1x=}8G?=GhwZa_Dz z#xv0~{47w`nx6{+#NcokQi{|YQ7a;di{1qUF3g1@4K^m?GLKT2)maxOHTL07++5DZ z4`ah~I5{0zI51Zl!kJUs%4h%aKYnQob@tHi=fPcSu25{OLhvlQ+52D9nJ56Ge$ ztjt9)i8xaa<(>{UjJD7N^@kvF_=hAG-w-Jj`$uv3`^(?}m$^QZYfR(?!x&zP{#MwH zHE_t-lgRYJf2dKEEVZLVk6FRgYgqgN2K|a{1rL&zviBJBfSa_RLDu^sktWr*{E_OF~QeKCA z7LaaRX(&wvlrID!!X^eMqR#l|CLGr$lDbgDc(PT7d5!UUZ%N-BrDx3jU8+}>+4#2i zl$z4?lx$?hoU<=ErT=V_^3JO9{h(J2o#=nDq?xF&yEq{ Ic|wMnSxmkv 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%0Aa> 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 delta 79246 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�d@uqc_5I`FwM&RQd5-5#d|O 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 UsqS1v0;U_tpB*OyTr@EM2V5M~F8}}l diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 0087cd3b18659b5577cf6ad3ef61f8eb9416ebba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51348 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

CflOl1i4(-2^1KXo)&I5QlgjRKFQgM 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 z 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7dfc31e8e..000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Wed Jul 02 20:43:27 CEST 2014 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-1.4-bin.zip diff --git a/gradlew b/gradlew deleted file mode 100755 index 91a7e269e..000000000 --- a/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index aec99730b..000000000 --- a/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/index.html b/index.html deleted file mode 100644 index 7e46cbb1e..000000000 --- a/index.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - TooTallNate/Java-WebSocket @ GitHub - - - - - - Fork me on GitHub - -

- -
- - - - -
- -

Java-WebSocket - by TooTallNate

- -
- A barebones WebSocket client and server implementation written in 100% Java. -
- - - - - - - - - - -

Authors

-

Davidiusdadi (DavidRohmer@web.de)
Bob Corsaro (bob@embed.ly)
Don Park (don@donpark.org)
David Rohmer (firstlastname@web.de)
swax (john.m.marshall@gmail.com)
Jarrod Ribble (jribble@netiq.com)
Julian Gautier (julian.gautier@alumni.neumont.edu)
Kristijan Sedlak (k.sedlak@mandatela.si)
morkai (lukasz@walukiewicz.eu)
Nathaniel Michael (natecmichael@gmail.com)
Nathan Rajlich (nathan@tootallnate.net)
sippykup (nobody@nowhere.com)

- - - -

Contact

-

Nathan Rajlich (nathan@tootallnate.net)

- - -

Download

-

- You can download this project in either - zip or - tar formats. -

-

You can also clone the project with Git - by running: -

$ git clone git://github.com/TooTallNate/Java-WebSocket
-

- - - -
- - - diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 0316b921c..000000000 --- a/pom.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - org.sonatype.oss - oss-parent - 7 - - - scm:git:git@github.com:TooTallNate/Java-WebSocket.git - scm:git:git@github.com:TooTallNate/Java-WebSocket.git - git@github.com:TooTallNate/Java-WebSocket.git - - 4.0.0 - org.java-websocket - Java-WebSocket - 1.3.1-SNAPSHOT - jar - Java WebSocket - http://java-websocket.org/ - A barebones WebSocket client and server implementation written in 100% Java - - UTF-8 - 1.6 - 1.0.0.RC24 - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.5.1 - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9 - - - attach-javadocs - - jar - - - - - - - - - - junit - junit - 4.8.2 - test - - - - info.cukes - cucumber-junit - 1.0.0 - test - - - info.cukes - cucumber-java - ${cucumber.version} - test - - - - - TooTallNate - Nathan Rajlich - nathan@tootallnate.net - https://github.com/TooTallNate - - founder - - - - Davidiusdadi - David Rohmer - rohmer.david@gmail.com - https://github.com/Davidiusdadi - - maintainer - - - - - - MIT License - http://github.com/TooTallNate/Java-WebSocket/blob/master/LICENSE - - - - - release-sign-artifacts - - performReleasetrue - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.1 - - - sign-artifacts - verify - - sign - - - - - rohmer.david@gmail.com - - - - - - - diff --git a/project.properties b/project.properties new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java b/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java index b871260f8..4d9eb54eb 100644 --- a/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java +++ b/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java @@ -25,7 +25,7 @@ public DefaultSSLWebSocketServerFactory( SSLContext sslContext ) { this( sslContext, Executors.newSingleThreadScheduledExecutor() ); } - public DefaultSSLWebSocketServerFactory( SSLContext sslContext , ExecutorService exec ) { + public DefaltSSLWebSocketServerFactory( SSLContext sslContext , ExecutorService exec ) { if( sslContext == null || exec == null ) throw new IllegalArgumentException(); this.sslcontext = sslContext; @@ -36,6 +36,7 @@ public DefaultSSLWebSocketServerFactory( SSLContext sslContext , ExecutorService public ByteChannel wrapChannel( SocketChannel channel, SelectionKey key ) throws IOException { SSLEngine e = sslcontext.createSSLEngine(); e.setUseClientMode( false ); + return new SSLSocketChannel2( channel, e, exec, key ); } diff --git a/src/test/java/org/java_websocket/AutobahnClientScenario.java b/src/test/java/org/java_websocket/AutobahnClientScenario.java deleted file mode 100644 index bbc422f8c..000000000 --- a/src/test/java/org/java_websocket/AutobahnClientScenario.java +++ /dev/null @@ -1,236 +0,0 @@ -package org.java_websocket; - -import cucumber.annotation.After; -import cucumber.annotation.en.Given; -import cucumber.annotation.en.Then; -import cucumber.annotation.en.When; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft; -import org.java_websocket.handshake.ClientHandshake; -import org.java_websocket.handshake.ServerHandshake; -import org.java_websocket.server.WebSocketServer; -import org.junit.Assert; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.UnknownHostException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.CountDownLatch; - -public class AutobahnClientScenario { - - private class AutobahnServer extends WebSocketServer { - - public AutobahnServer(int port, Draft d) throws UnknownHostException { - super(new InetSocketAddress(port), Collections.singletonList(d)); - } - - @Override - public void onOpen(WebSocket conn, ClientHandshake handshake) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void onClose(WebSocket conn, int code, String reason, boolean remote) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void onMessage(WebSocket conn, String message) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void onError(WebSocket conn, Exception ex) { - //throw new UnsupportedOperationException("Not supported yet."); - } - - } - - private class AutobahnClient extends WebSocketClient { - - private final CountDownLatch connectionOpenedLatch; - private final Map openHandShakeFields; - private String message; - - public AutobahnClient(Draft draft, URI uri) { - super(uri, draft); - connectionOpenedLatch = new CountDownLatch(1); - openHandShakeFields = new HashMap(); - } - - @Override - public void onOpen(ServerHandshake handshakedata) { - Iterator it = handshakedata.iterateHttpFields(); - while(it.hasNext()) { - String key = it.next(); - System.out.printf("%s %s%n", key, handshakedata.getFieldValue(key)); // TODO Remove this - openHandShakeFields.put(key, handshakedata.getFieldValue(key)); - } - connectionOpenedLatch.countDown(); - } - - @Override - public void onMessage(String message) { - // TODO Test message receiving - } - - @Override - public void onClose(int code, String reason, boolean remote) { - // TODO Check connection closing - } - - @Override - public void onError(Exception ex) { - // TODO Check error handling - ex.printStackTrace(); - connectionOpenedLatch.countDown(); - } - - } - - private static Draft getDraft(int number) { - Exception exception; - try { - return (Draft) Class.forName("org.java_websocket.drafts.Draft_" + number).newInstance(); - } catch(InstantiationException e) { - exception = e; - } catch(IllegalAccessException e) { - exception = e; - } catch(ClassNotFoundException e) { - exception = e; - } - throw new RuntimeException(exception); - } - - private String protocol; - private String host; - private Integer port; - private String query; - private Draft draft; - - private AutobahnServer autobahnServer; - - @Given("^the Autobahn Server is running using Draft_(\\d+) on port (\\d+)$") - public void startAutobahnServer(int draft, int port) throws UnknownHostException { - autobahnServer = new AutobahnServer(port, getDraft(draft)); - autobahnServer.start(); - } - - @Given("^protocol is (.+)$") - public void createProtocol(String protocol) { - this.protocol = protocol; - } - - @Given("^the host is (.+)$") - public void createHost(String host) { - this.host = host; - } - - @Given("^the port is (\\d+)$") - public void createPort(int port) { - this.port = port; - } - - @Given("^the query string is (.+)$") - public void createQuery(String query) { - this.query = query; - } - - @Given("^the draft is Draft_(\\d+)") - public void createDraft(int draft) { - this.draft = getDraft(draft); - } - - private AutobahnClient autobahnClient; - - @When("^the client connects to the server$") - public void connectToServer() { - URI uri; - try { - uri = new URI(this.protocol, null, this.host, this.port, null, this.query, null); - } catch(URISyntaxException e) { - throw new RuntimeException(e); - } - - System.out.println(uri); - autobahnClient = new AutobahnClient(this.draft, uri); - try { - autobahnClient.connectBlocking(); - autobahnClient.connectionOpenedLatch.await(); - } catch(InterruptedException e) { - Assert.assertTrue(e.getMessage(), false); - e.printStackTrace(); - } - } - - @Then("^the server response should contain (.+)$") - public void checkMethod(String method) { - // TODO Implement check - //assertTrue(method.contains("GET")); - } - - @Then("^the response's query should contain (.+)$") - public void checkQuery(String query) { - // TODO Implement check - //assertTrue(query.contains(this.query)); - } - - @Then("^the response's http version should contain (.+)$") - public void checkHttpVersion(String httpversion) { - // TODO Implement check - //assertTrue(.contains("HTTP/" + major + "." + minor)); - } - - @Then("^the response's handshake should contain (.+)$") - public void checkHandshake(String handshake) { - Assert.assertEquals(handshake, autobahnClient.openHandShakeFields.get("Connection")); - } - - @Then("^the response's host should contain (.+)$") - public void checkHost(String host) { - // TODO Implement check - //assertTrue(host.contains(this.host)); - } - - @Then("^the response's websocket key should contain (.+)$") - public void checkWebSocketKey(String websocketKey) { - // TODO Implement check - //Assert.assertTrue(autobahnClient.openHandShakeFields.containsKey(websocketKey)); - //assertTrue(websocketKey.contains("Sec-WebSocket-Key:")); - } - - @Then("^the response's websocket version should contain (.+)$") - public void checkWebSocketVersion(String websocketVersion) { - // TODO Implement check - //assertTrue(websocketVersion.contains("Sec-WebSocket-Version:")); - } - - @Then("^the response's upgraded protocol should contain (.+)$") - public void checkUpgradedProtocol(String upgradedProtocol) { - Assert.assertEquals(upgradedProtocol, autobahnClient.openHandShakeFields.get("Upgrade")); - } - - @After - public void cleanup() { - try { - autobahnClient.closeBlocking(); - } catch(InterruptedException e) { - e.printStackTrace(); - } - - try { - autobahnServer.stop(); - } catch(IOException e) { - e.printStackTrace(); - } catch(InterruptedException e) { - e.printStackTrace(); - } - } - -} diff --git a/src/test/java/org/java_websocket/AutobahnClientTest.java b/src/test/java/org/java_websocket/AutobahnClientTest.java deleted file mode 100644 index 600054066..000000000 --- a/src/test/java/org/java_websocket/AutobahnClientTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.java_websocket; - -import org.junit.runner.RunWith; - -import cucumber.junit.Cucumber; - -@RunWith(Cucumber.class) -public class AutobahnClientTest { - -} diff --git a/src/test/java/org/java_websocket/example/AutobahnClientTest.java b/src/test/java/org/java_websocket/example/AutobahnClientTest.java deleted file mode 100644 index 0bb093ac4..000000000 --- a/src/test/java/org/java_websocket/example/AutobahnClientTest.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.java_websocket.example; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URI; -import java.nio.ByteBuffer; - -import org.java_websocket.WebSocket; -import org.java_websocket.WebSocketImpl; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft; -import org.java_websocket.drafts.Draft_17; -import org.java_websocket.framing.FrameBuilder; -import org.java_websocket.framing.Framedata; -import org.java_websocket.handshake.ServerHandshake; - -public class AutobahnClientTest extends WebSocketClient { - - public AutobahnClientTest( Draft d , URI uri ) { - super( uri, d ); - } - /** - * @param args - */ - public static void main( String[] args ) { - System.out.println( "Testutility to profile/test this implementation using the Autobahn suit.\n" ); - System.out.println( "Type 'r ' to run a testcase. Example: r 1" ); - System.out.println( "Type 'r ' to run a testcase. Example: r 1 295" ); - System.out.println( "Type 'u' to update the test results." ); - System.out.println( "Type 'ex' to terminate the program." ); - System.out.println( "During sequences of cases the debugoutput will be turned of." ); - - System.out.println( "You can now enter in your commands:" ); - - try { - BufferedReader sysin = new BufferedReader( new InputStreamReader( System.in ) ); - - /*First of the thinks a programmer might want to change*/ - Draft d = new Draft_17(); - String clientname = "tootallnate/websocket"; - - String protocol = "ws"; - String host = "localhost"; - int port = 9001; - - String serverlocation = protocol + "://" + host + ":" + port; - String line = ""; - AutobahnClientTest e; - URI uri = null; - String perviousline = ""; - String nextline = null; - Integer start = null; - Integer end = null; - - while ( !line.contains( "ex" ) ) { - try { - if( nextline != null ) { - line = nextline; - nextline = null; - WebSocketImpl.DEBUG = false; - } else { - System.out.print( ">" ); - line = sysin.readLine(); - WebSocketImpl.DEBUG = true; - } - if( line.equals( "l" ) ) { - line = perviousline; - } - String[] spl = line.split( " " ); - if( line.startsWith( "r" ) ) { - if( spl.length == 3 ) { - start = new Integer( spl[ 1 ] ); - end = new Integer( spl[ 2 ] ); - } - if( start != null && end != null ) { - if( start > end ) { - start = null; - end = null; - } else { - nextline = "r " + start; - start++; - if( spl.length == 3 ) - continue; - } - } - uri = URI.create( serverlocation + "/runCase?case=" + spl[ 1 ] + "&agent=" + clientname ); - - } else if( line.startsWith( "u" ) ) { - WebSocketImpl.DEBUG = false; - uri = URI.create( serverlocation + "/updateReports?agent=" + clientname ); - } else if( line.startsWith( "d" ) ) { - try { - d = (Draft) Class.forName( "Draft_" + spl[ 1 ] ).getConstructor().newInstance(); - } catch ( Exception ex ) { - System.out.println( "Could not change draft" + ex ); - } - } - if( uri == null ) { - System.out.println( "Do not understand the input." ); - continue; - } - System.out.println( "//////////////////////Exec: " + uri.getQuery() ); - e = new AutobahnClientTest( d, uri ); - Thread t = new Thread( e ); - t.start(); - try { - t.join(); - - } catch ( InterruptedException e1 ) { - e1.printStackTrace(); - } finally { - e.close(); - } - } catch ( ArrayIndexOutOfBoundsException e1 ) { - System.out.println( "Bad Input r 1, u 1, d 10, ex" ); - } catch ( IllegalArgumentException e2 ) { - e2.printStackTrace(); - } - - } - } catch ( ArrayIndexOutOfBoundsException e ) { - System.out.println( "Missing server uri" ); - } catch ( IllegalArgumentException e ) { - e.printStackTrace(); - System.out.println( "URI should look like ws://localhost:8887 or wss://echo.websocket.org" ); - } catch ( IOException e ) { - e.printStackTrace(); // for System.in reader - } - System.exit( 0 ); - } - - @Override - public void onMessage( String message ) { - send( message ); - } - - @Override - public void onMessage( ByteBuffer blob ) { - getConnection().send( blob ); - } - - @Override - public void onError( Exception ex ) { - System.out.println( "Error: " ); - ex.printStackTrace(); - } - - @Override - public void onOpen( ServerHandshake handshake ) { - } - - @Override - public void onClose( int code, String reason, boolean remote ) { - System.out.println( "Closed: " + code + " " + reason ); - } - - @Override - public void onWebsocketMessageFragment( WebSocket conn, Framedata frame ) { - FrameBuilder builder = (FrameBuilder) frame; - builder.setTransferemasked( true ); - getConnection().sendFrame( frame ); - } - -} diff --git a/src/test/java/org/java_websocket/example/AutobahnServerTest.java b/src/test/java/org/java_websocket/example/AutobahnServerTest.java deleted file mode 100644 index e77c637c8..000000000 --- a/src/test/java/org/java_websocket/example/AutobahnServerTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.java_websocket.example; - -import java.net.InetSocketAddress; -import java.net.UnknownHostException; -import java.nio.ByteBuffer; -import java.util.Collections; - -import org.java_websocket.WebSocket; -import org.java_websocket.WebSocketImpl; -import org.java_websocket.drafts.Draft; -import org.java_websocket.drafts.Draft_17; -import org.java_websocket.framing.FrameBuilder; -import org.java_websocket.framing.Framedata; -import org.java_websocket.handshake.ClientHandshake; -import org.java_websocket.server.WebSocketServer; - -public class AutobahnServerTest extends WebSocketServer { - private static int counter = 0; - - public AutobahnServerTest( int port , Draft d ) throws UnknownHostException { - super( new InetSocketAddress( port ), Collections.singletonList( d ) ); - } - - public AutobahnServerTest( InetSocketAddress address, Draft d ) { - super( address, Collections.singletonList( d ) ); - } - - @Override - public void onOpen( WebSocket conn, ClientHandshake handshake ) { - counter++; - System.out.println( "///////////Opened connection number" + counter ); - } - - @Override - public void onClose( WebSocket conn, int code, String reason, boolean remote ) { - System.out.println( "closed" ); - } - - @Override - public void onError( WebSocket conn, Exception ex ) { - System.out.println( "Error:" ); - ex.printStackTrace(); - } - - @Override - public void onMessage( WebSocket conn, String message ) { - conn.send( message ); - } - - @Override - public void onMessage( WebSocket conn, ByteBuffer blob ) { - conn.send( blob ); - } - - @Override - public void onWebsocketMessageFragment( WebSocket conn, Framedata frame ) { - FrameBuilder builder = (FrameBuilder) frame; - builder.setTransferemasked( false ); - conn.sendFrame( frame ); - } - - public static void main( String[] args ) throws UnknownHostException { - WebSocketImpl.DEBUG = false; - int port; - try { - port = new Integer( args[ 0 ] ); - } catch ( Exception e ) { - System.out.println( "No port specified. Defaulting to 9003" ); - port = 9003; - } - new AutobahnServerTest( port, new Draft_17() ).start(); - } - -} diff --git a/src/test/resources/org/java_websocket/AutobahnClient.feature b/src/test/resources/org/java_websocket/AutobahnClient.feature deleted file mode 100644 index 737961775..000000000 --- a/src/test/resources/org/java_websocket/AutobahnClient.feature +++ /dev/null @@ -1,25 +0,0 @@ -Feature: Client connects using Draft 17 - As an autobahn client - I want to connect to a websocket server using draft 17 - So that I can send and receive messages - - Scenario Outline: Client connection parameters are valid - Given the Autobahn Server is running using Draft_ on port - And protocol is - And the host is - And the port is - And the query string is - And the draft is Draft_ - When the client connects to the server - Then the server response should contain - And the response's query should contain - And the response's http version should contain - And the response's handshake should contain - And the response's host should contain - And the response's websocket key should contain - And the response's websocket version should contain - And the response's upgraded protocol should contain - - Examples: - | protocol | host | port | query | draft | method | http_version | handshake | websocket_key | websocket_version | upgraded_protocol | - | ws | localhost | 9003 | case=1&agent=tootallnate/websocket | 17 | GET | HTTP/1.1 | Upgrade | Sec-WebSocket-Key | Sec-WebSocket-Version | websocket | From e59aa3b0844cd4f20f160e716f5ce081fe86d6fa Mon Sep 17 00:00:00 2001 From: Dominic Cerisano Date: Mon, 12 Sep 2016 03:43:22 -0400 Subject: [PATCH 2/2] ratfuck --- build.xml | 12 +- dist/java_websocket.jar | Bin 95696 -> 99576 bytes src/main/example/ChatClient.java | 163 - src/main/example/ChatServer.java | 99 - src/main/example/ExampleClient.java | 54 - src/main/example/FragmentedFramesExample.java | 57 - src/main/example/ProxyClientExample.java | 12 - src/main/example/SSLClientExample.java | 99 - src/main/example/SSLServerExample.java | 50 - src/main/example/ServerStressTest.java | 217 - src/main/example/chat.html | 66 - src/main/example/prototype.js | 4874 ----------------- .../example/web-socket-js/WebSocketMain.swf | Bin 177114 -> 0 bytes src/main/example/web-socket-js/index.html | 29 - src/main/example/web-socket-js/swfobject.js | 4 - src/main/example/web-socket-js/web_socket.js | 389 -- .../AbstractWrappedByteChannel.java | 0 .../org/java_websocket/SSLSocketChannel2.java | 0 .../java_websocket/SocketChannelIOHelper.java | 0 .../org/java_websocket/WebSocket.java | 0 .../org/java_websocket/WebSocketAdapter.java | 0 .../org/java_websocket/WebSocketFactory.java | 0 .../org/java_websocket/WebSocketImpl.java | 0 .../org/java_websocket/WebSocketListener.java | 0 .../java_websocket/WrappedByteChannel.java | 0 .../client/AbstractClientProxyChannel.java | 0 .../client/WebSocketClient.java | 0 .../org/java_websocket/drafts/Draft.java | 0 .../org/java_websocket/drafts/Draft_10.java | 0 .../org/java_websocket/drafts/Draft_17.java | 0 .../org/java_websocket/drafts/Draft_75.java | 0 .../org/java_websocket/drafts/Draft_76.java | 0 .../IncompleteHandshakeException.java | 0 .../exceptions/InvalidDataException.java | 0 .../exceptions/InvalidFrameException.java | 0 .../exceptions/InvalidHandshakeException.java | 0 .../exceptions/LimitExedeedException.java | 0 .../exceptions/NotSendableException.java | 0 .../WebsocketNotConnectedException.java | 0 .../java_websocket/framing/CloseFrame.java | 0 .../framing/CloseFrameBuilder.java | 0 .../java_websocket/framing/FrameBuilder.java | 0 .../org/java_websocket/framing/Framedata.java | 0 .../framing/FramedataImpl1.java | 0 .../handshake/ClientHandshake.java | 0 .../handshake/ClientHandshakeBuilder.java | 0 .../handshake/HandshakeBuilder.java | 0 .../handshake/HandshakeImpl1Client.java | 0 .../handshake/HandshakeImpl1Server.java | 0 .../handshake/Handshakedata.java | 0 .../handshake/HandshakedataImpl1.java | 0 .../handshake/ServerHandshake.java | 0 .../handshake/ServerHandshakeBuilder.java | 0 .../DefaultSSLWebSocketServerFactory.java | 2 +- .../server/DefaultWebSocketServerFactory.java | 0 .../server/WebSocketServer.java | 0 .../org/java_websocket/util/Base64.java | 0 .../java_websocket/util/Charsetfunctions.java | 0 58 files changed, 6 insertions(+), 6121 deletions(-) delete mode 100644 src/main/example/ChatClient.java delete mode 100644 src/main/example/ChatServer.java delete mode 100644 src/main/example/ExampleClient.java delete mode 100644 src/main/example/FragmentedFramesExample.java delete mode 100644 src/main/example/ProxyClientExample.java delete mode 100644 src/main/example/SSLClientExample.java delete mode 100644 src/main/example/SSLServerExample.java delete mode 100644 src/main/example/ServerStressTest.java delete mode 100644 src/main/example/chat.html delete mode 100644 src/main/example/prototype.js delete mode 100644 src/main/example/web-socket-js/WebSocketMain.swf delete mode 100644 src/main/example/web-socket-js/index.html delete mode 100644 src/main/example/web-socket-js/swfobject.js delete mode 100644 src/main/example/web-socket-js/web_socket.js rename src/{main/java => }/org/java_websocket/AbstractWrappedByteChannel.java (100%) rename src/{main/java => }/org/java_websocket/SSLSocketChannel2.java (100%) rename src/{main/java => }/org/java_websocket/SocketChannelIOHelper.java (100%) rename src/{main/java => }/org/java_websocket/WebSocket.java (100%) rename src/{main/java => }/org/java_websocket/WebSocketAdapter.java (100%) rename src/{main/java => }/org/java_websocket/WebSocketFactory.java (100%) rename src/{main/java => }/org/java_websocket/WebSocketImpl.java (100%) rename src/{main/java => }/org/java_websocket/WebSocketListener.java (100%) rename src/{main/java => }/org/java_websocket/WrappedByteChannel.java (100%) rename src/{main/java => }/org/java_websocket/client/AbstractClientProxyChannel.java (100%) rename src/{main/java => }/org/java_websocket/client/WebSocketClient.java (100%) rename src/{main/java => }/org/java_websocket/drafts/Draft.java (100%) rename src/{main/java => }/org/java_websocket/drafts/Draft_10.java (100%) rename src/{main/java => }/org/java_websocket/drafts/Draft_17.java (100%) rename src/{main/java => }/org/java_websocket/drafts/Draft_75.java (100%) rename src/{main/java => }/org/java_websocket/drafts/Draft_76.java (100%) rename src/{main/java => }/org/java_websocket/exceptions/IncompleteHandshakeException.java (100%) rename src/{main/java => }/org/java_websocket/exceptions/InvalidDataException.java (100%) rename src/{main/java => }/org/java_websocket/exceptions/InvalidFrameException.java (100%) rename src/{main/java => }/org/java_websocket/exceptions/InvalidHandshakeException.java (100%) rename src/{main/java => }/org/java_websocket/exceptions/LimitExedeedException.java (100%) rename src/{main/java => }/org/java_websocket/exceptions/NotSendableException.java (100%) rename src/{main/java => }/org/java_websocket/exceptions/WebsocketNotConnectedException.java (100%) rename src/{main/java => }/org/java_websocket/framing/CloseFrame.java (100%) rename src/{main/java => }/org/java_websocket/framing/CloseFrameBuilder.java (100%) rename src/{main/java => }/org/java_websocket/framing/FrameBuilder.java (100%) rename src/{main/java => }/org/java_websocket/framing/Framedata.java (100%) rename src/{main/java => }/org/java_websocket/framing/FramedataImpl1.java (100%) rename src/{main/java => }/org/java_websocket/handshake/ClientHandshake.java (100%) rename src/{main/java => }/org/java_websocket/handshake/ClientHandshakeBuilder.java (100%) rename src/{main/java => }/org/java_websocket/handshake/HandshakeBuilder.java (100%) rename src/{main/java => }/org/java_websocket/handshake/HandshakeImpl1Client.java (100%) rename src/{main/java => }/org/java_websocket/handshake/HandshakeImpl1Server.java (100%) rename src/{main/java => }/org/java_websocket/handshake/Handshakedata.java (100%) rename src/{main/java => }/org/java_websocket/handshake/HandshakedataImpl1.java (100%) rename src/{main/java => }/org/java_websocket/handshake/ServerHandshake.java (100%) rename src/{main/java => }/org/java_websocket/handshake/ServerHandshakeBuilder.java (100%) rename src/{main/java => }/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java (94%) rename src/{main/java => }/org/java_websocket/server/DefaultWebSocketServerFactory.java (100%) rename src/{main/java => }/org/java_websocket/server/WebSocketServer.java (100%) rename src/{main/java => }/org/java_websocket/util/Base64.java (100%) rename src/{main/java => }/org/java_websocket/util/Charsetfunctions.java (100%) diff --git a/build.xml b/build.xml index 3d33c2745..eb39e915f 100644 --- a/build.xml +++ b/build.xml @@ -1,14 +1,12 @@ - + - + - - + @@ -19,7 +17,7 @@ - + diff --git a/dist/java_websocket.jar b/dist/java_websocket.jar index 3a93c3e46a49b2e2949747d03bc95f3b1e79fdad..de16c9d503af46fb10bd0ad8a328244f8a2a7919 100644 GIT binary patch literal 99576 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 literal 95696 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%0D`oRE0Rd=h#T7CfEo!Y=`WbO31*q2us6G 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 to all currently connected WebSocket clients. - * - * @param text - * The String to send across the network. - * @throws InterruptedException - * When socket related I/O errors occur. - */ - public void sendToAll( String text ) { - Collection con = connections(); - synchronized ( con ) { - for( WebSocket c : con ) { - c.send( text ); - } - } - } -} diff --git a/src/main/example/ExampleClient.java b/src/main/example/ExampleClient.java deleted file mode 100644 index 3cf68377e..000000000 --- a/src/main/example/ExampleClient.java +++ /dev/null @@ -1,54 +0,0 @@ -import java.net.URI; -import java.net.URISyntaxException; - -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft; -import org.java_websocket.drafts.Draft_10; -import org.java_websocket.framing.Framedata; -import org.java_websocket.handshake.ServerHandshake; - -/** This example demonstrates how to create a websocket connection to a server. Only the most important callbacks are overloaded. */ -public class ExampleClient extends WebSocketClient { - - public ExampleClient( URI serverUri , Draft draft ) { - super( serverUri, draft ); - } - - public ExampleClient( URI serverURI ) { - super( serverURI ); - } - - @Override - public void onOpen( ServerHandshake handshakedata ) { - System.out.println( "opened connection" ); - // if you plan to refuse connection based on ip or httpfields overload: onWebsocketHandshakeReceivedAsClient - } - - @Override - public void onMessage( String message ) { - System.out.println( "received: " + message ); - } - - @Override - public void onFragment( Framedata fragment ) { - System.out.println( "received fragment: " + new String( fragment.getPayloadData().array() ) ); - } - - @Override - public void onClose( int code, String reason, boolean remote ) { - // The codecodes are documented in class org.java_websocket.framing.CloseFrame - System.out.println( "Connection closed by " + ( remote ? "remote peer" : "us" ) ); - } - - @Override - public void onError( Exception ex ) { - ex.printStackTrace(); - // if the error is fatal then onClose will be called additionally - } - - public static void main( String[] args ) throws URISyntaxException { - ExampleClient c = new ExampleClient( new URI( "ws://localhost:8887" ), new Draft_10() ); // more about drafts here: http://github.com/TooTallNate/Java-WebSocket/wiki/Drafts - c.connect(); - } - -} \ No newline at end of file diff --git a/src/main/example/FragmentedFramesExample.java b/src/main/example/FragmentedFramesExample.java deleted file mode 100644 index b5a03e1aa..000000000 --- a/src/main/example/FragmentedFramesExample.java +++ /dev/null @@ -1,57 +0,0 @@ -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.ByteBuffer; - -import org.java_websocket.WebSocket; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft_17; -import org.java_websocket.framing.Framedata.Opcode; - -/** - * This example shows how to send fragmented frames.
- * For information on when to used fragmented frames see http://tools.ietf.org/html/rfc6455#section-5.4
- * Fragmented and normal messages can not be mixed. - * One is however allowed to mix them with control messages like ping/pong. - * - * @see WebSocket#sendFragmentedFrame(Opcode, ByteBuffer, boolean) - **/ -public class FragmentedFramesExample { - public static void main( String[] args ) throws URISyntaxException , IOException , InterruptedException { - // WebSocketImpl.DEBUG = true; // will give extra output - - WebSocketClient websocket = new ExampleClient( new URI( "ws://localhost:8887" ), new Draft_17() ); // Draft_17 is implementation of rfc6455 - if( !websocket.connectBlocking() ) { - System.err.println( "Could not connect to the server." ); - return; - } - - System.out.println( "This example shows how to send fragmented(continuous) messages." ); - - BufferedReader stdin = new BufferedReader( new InputStreamReader( System.in ) ); - while ( websocket.isOpen() ) { - System.out.println( "Please type in a loooooong line(which then will be send in 2 byte fragments):" ); - String longline = stdin.readLine(); - ByteBuffer longelinebuffer = ByteBuffer.wrap( longline.getBytes() ); - longelinebuffer.rewind(); - - for( int position = 2 ; ; position += 2 ) { - if( position < longelinebuffer.capacity() ) { - longelinebuffer.limit( position ); - websocket.sendFragmentedFrame( Opcode.TEXT, longelinebuffer, false );// when sending binary data one should use Opcode.BINARY - assert ( longelinebuffer.remaining() == 0 ); - // after calling sendFragmentedFrame one may reuse the buffer given to the method immediately - } else { - longelinebuffer.limit( longelinebuffer.capacity() ); - websocket.sendFragmentedFrame( Opcode.TEXT, longelinebuffer, true );// sending the last frame - break; - } - - } - System.out.println( "You can not type in the next long message or press Ctr-C to exit." ); - } - System.out.println( "FragmentedFramesExample terminated" ); - } -} diff --git a/src/main/example/ProxyClientExample.java b/src/main/example/ProxyClientExample.java deleted file mode 100644 index ddff0ea0d..000000000 --- a/src/main/example/ProxyClientExample.java +++ /dev/null @@ -1,12 +0,0 @@ -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.URI; -import java.net.URISyntaxException; - -public class ProxyClientExample { - public static void main( String[] args ) throws URISyntaxException { - ExampleClient c = new ExampleClient( new URI( "ws://echo.websocket.org" ) ); - c.setProxy( new Proxy( Proxy.Type.HTTP, new InetSocketAddress( "proxyaddress", 80 ) ) ); - c.connect(); - } -} diff --git a/src/main/example/SSLClientExample.java b/src/main/example/SSLClientExample.java deleted file mode 100644 index e740c9c54..000000000 --- a/src/main/example/SSLClientExample.java +++ /dev/null @@ -1,99 +0,0 @@ -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.net.URI; -import java.security.KeyStore; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManagerFactory; - -import org.java_websocket.WebSocketImpl; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.handshake.ServerHandshake; - -class WebSocketChatClient extends WebSocketClient { - - public WebSocketChatClient( URI serverUri ) { - super( serverUri ); - } - - @Override - public void onOpen( ServerHandshake handshakedata ) { - System.out.println( "Connected" ); - - } - - @Override - public void onMessage( String message ) { - System.out.println( "got: " + message ); - - } - - @Override - public void onClose( int code, String reason, boolean remote ) { - System.out.println( "Disconnected" ); - System.exit( 0 ); - - } - - @Override - public void onError( Exception ex ) { - ex.printStackTrace(); - - } - -} - -public class SSLClientExample { - - /* - * Keystore with certificate created like so (in JKS format): - * - *keytool -genkey -validity 3650 -keystore "keystore.jks" -storepass "storepassword" -keypass "keypassword" -alias "default" -dname "CN=127.0.0.1, OU=MyOrgUnit, O=MyOrg, L=MyCity, S=MyRegion, C=MyCountry" - */ - public static void main( String[] args ) throws Exception { - WebSocketImpl.DEBUG = true; - - WebSocketChatClient chatclient = new WebSocketChatClient( new URI( "wss://localhost:8887" ) ); - - // load up the key store - String STORETYPE = "JKS"; - String KEYSTORE = "keystore.jks"; - String STOREPASSWORD = "storepassword"; - String KEYPASSWORD = "keypassword"; - - KeyStore ks = KeyStore.getInstance( STORETYPE ); - File kf = new File( KEYSTORE ); - ks.load( new FileInputStream( kf ), STOREPASSWORD.toCharArray() ); - - KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" ); - kmf.init( ks, KEYPASSWORD.toCharArray() ); - TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" ); - tmf.init( ks ); - - SSLContext sslContext = null; - sslContext = SSLContext.getInstance( "TLS" ); - sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null ); - // sslContext.init( null, null, null ); // will use java's default key and trust store which is sufficient unless you deal with self-signed certificates - - SSLSocketFactory factory = sslContext.getSocketFactory();// (SSLSocketFactory) SSLSocketFactory.getDefault(); - - chatclient.setSocket( factory.createSocket() ); - - chatclient.connectBlocking(); - - BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) ); - while ( true ) { - String line = reader.readLine(); - if( line.equals( "close" ) ) { - chatclient.close(); - } else { - chatclient.send( line ); - } - } - - } -} diff --git a/src/main/example/SSLServerExample.java b/src/main/example/SSLServerExample.java deleted file mode 100644 index 563395403..000000000 --- a/src/main/example/SSLServerExample.java +++ /dev/null @@ -1,50 +0,0 @@ - - -import java.io.File; -import java.io.FileInputStream; -import java.security.KeyStore; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManagerFactory; - -import org.java_websocket.WebSocketImpl; -import org.java_websocket.server.DefaultSSLWebSocketServerFactory; - -public class SSLServerExample { - - /* - * Keystore with certificate created like so (in JKS format): - * - *keytool -genkey -validity 3650 -keystore "keystore.jks" -storepass "storepassword" -keypass "keypassword" -alias "default" -dname "CN=127.0.0.1, OU=MyOrgUnit, O=MyOrg, L=MyCity, S=MyRegion, C=MyCountry" - */ - public static void main( String[] args ) throws Exception { - WebSocketImpl.DEBUG = true; - - ChatServer chatserver = new ChatServer( 8887 ); // Firefox does allow multible ssl connection only via port 443 //tested on FF16 - - // load up the key store - String STORETYPE = "JKS"; - String KEYSTORE = "keystore.jks"; - String STOREPASSWORD = "storepassword"; - String KEYPASSWORD = "keypassword"; - - KeyStore ks = KeyStore.getInstance( STORETYPE ); - File kf = new File( KEYSTORE ); - ks.load( new FileInputStream( kf ), STOREPASSWORD.toCharArray() ); - - KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" ); - kmf.init( ks, KEYPASSWORD.toCharArray() ); - TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" ); - tmf.init( ks ); - - SSLContext sslContext = null; - sslContext = SSLContext.getInstance( "TLS" ); - sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null ); - - chatserver.setWebSocketFactory( new DefaultSSLWebSocketServerFactory( sslContext ) ); - - chatserver.start(); - - } -} diff --git a/src/main/example/ServerStressTest.java b/src/main/example/ServerStressTest.java deleted file mode 100644 index 8fe2e97a4..000000000 --- a/src/main/example/ServerStressTest.java +++ /dev/null @@ -1,217 +0,0 @@ -import java.awt.FlowLayout; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.channels.NotYetConnectedException; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSlider; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import org.java_websocket.client.WebSocketClient; - -public class ServerStressTest extends JFrame { - private JSlider clients; - private JSlider interval; - private JSlider joinrate; - private JButton start, stop, reset; - private JLabel joinratelabel = new JLabel(); - private JLabel clientslabel = new JLabel(); - private JLabel intervallabel = new JLabel(); - private JTextField uriinput = new JTextField( "ws://localhost:8887" ); - private JTextArea text = new JTextArea( "payload" ); - private Timer timer = new Timer( true ); - private Thread adjustthread; - - private int notyetconnected = 0; - - public ServerStressTest() { - setTitle( "ServerStressTest" ); - setDefaultCloseOperation( EXIT_ON_CLOSE ); - start = new JButton( "Start" ); - start.addActionListener( new ActionListener() { - - @Override - public void actionPerformed( ActionEvent e ) { - start.setEnabled( false ); - stop.setEnabled( true ); - reset.setEnabled( false ); - interval.setEnabled( false ); - clients.setEnabled( false ); - - stopAdjust(); - adjustthread = new Thread( new Runnable() { - @Override - public void run() { - try { - adjust(); - } catch ( InterruptedException e ) { - System.out.println( "adjust chanced" ); - } - } - } ); - adjustthread.start(); - - } - } ); - stop = new JButton( "Stop" ); - stop.setEnabled( false ); - stop.addActionListener( new ActionListener() { - - @Override - public void actionPerformed( ActionEvent e ) { - timer.cancel(); - stopAdjust(); - start.setEnabled( true ); - stop.setEnabled( false ); - reset.setEnabled( true ); - joinrate.setEnabled( true ); - interval.setEnabled( true ); - clients.setEnabled( true ); - } - } ); - reset = new JButton( "reset" ); - reset.setEnabled( true ); - reset.addActionListener( new ActionListener() { - - @Override - public void actionPerformed( ActionEvent e ) { - while ( !websockets.isEmpty() ) - websockets.remove( 0 ).close(); - - } - } ); - joinrate = new JSlider( 0, 5000 ); - joinrate.addChangeListener( new ChangeListener() { - @Override - public void stateChanged( ChangeEvent e ) { - joinratelabel.setText( "Joinrate: " + joinrate.getValue() + " ms " ); - } - } ); - clients = new JSlider( 0, 10000 ); - clients.addChangeListener( new ChangeListener() { - - @Override - public void stateChanged( ChangeEvent e ) { - clientslabel.setText( "Clients: " + clients.getValue() ); - - } - } ); - interval = new JSlider( 0, 5000 ); - interval.addChangeListener( new ChangeListener() { - - @Override - public void stateChanged( ChangeEvent e ) { - intervallabel.setText( "Interval: " + interval.getValue() + " ms " ); - - } - } ); - - setSize( 300, 400 ); - setLayout( new GridLayout( 10, 1, 10, 10 ) ); - add( new JLabel( "URI" ) ); - add( uriinput ); - add( joinratelabel ); - add( joinrate ); - add( clientslabel ); - add( clients ); - add( intervallabel ); - add( interval ); - JPanel south = new JPanel( new FlowLayout( FlowLayout.CENTER ) ); - add( text ); - add( south ); - - south.add( start ); - south.add( stop ); - south.add( reset ); - - joinrate.setValue( 200 ); - interval.setValue( 1000 ); - clients.setValue( 1 ); - - } - - List websockets = Collections.synchronizedList( new LinkedList() ); - URI uri; - public void adjust() throws InterruptedException { - System.out.println( "Adjust" ); - try { - uri = new URI( uriinput.getText() ); - } catch ( URISyntaxException e ) { - e.printStackTrace(); - } - int totalclients = clients.getValue(); - while ( websockets.size() < totalclients ) { - WebSocketClient cl = new ExampleClient( uri ) { - @Override - public void onClose( int code, String reason, boolean remote ) { - System.out.println( "Closed duo " + code + " " + reason ); - clients.setValue( websockets.size() ); - websockets.remove( this ); - } - }; - - cl.connect(); - clients.setValue( websockets.size() ); - websockets.add( cl ); - Thread.sleep( joinrate.getValue() ); - } - while ( websockets.size() > clients.getValue() ) { - websockets.remove( 0 ).close(); - } - timer = new Timer( true ); - timer.scheduleAtFixedRate( new TimerTask() { - @Override - public void run() { - send(); - } - }, 0, interval.getValue() ); - - } - - public void stopAdjust() { - if( adjustthread != null ) { - adjustthread.interrupt(); - try { - adjustthread.join(); - } catch ( InterruptedException e ) { - e.printStackTrace(); - } - } - } - public void send() { - notyetconnected = 0; - String payload = text.getText(); - long time1 = System.currentTimeMillis(); - synchronized ( websockets ) { - for( WebSocketClient cl : websockets ) { - try { - cl.send( payload ); - } catch ( NotYetConnectedException e ) { - notyetconnected++; - } - } - } - System.out.println( websockets.size() + "/" + notyetconnected + " clients sent \"" + payload + "\"" + ( System.currentTimeMillis() - time1 ) ); - } - /** - * @param args - */ - public static void main( String[] args ) { - new ServerStressTest().setVisible( true ); - } - -} diff --git a/src/main/example/chat.html b/src/main/example/chat.html deleted file mode 100644 index 4a1327e86..000000000 --- a/src/main/example/chat.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - WebSocket Chat Client - - - - - - - -

-

-

- - diff --git a/src/main/example/prototype.js b/src/main/example/prototype.js deleted file mode 100644 index 9fe6e1243..000000000 --- a/src/main/example/prototype.js +++ /dev/null @@ -1,4874 +0,0 @@ -/* Prototype JavaScript framework, version 1.6.1 - * (c) 2005-2009 Sam Stephenson - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://www.prototypejs.org/ - * - *--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.6.1', - - Browser: (function(){ - var ua = navigator.userAgent; - var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; - return { - IE: !!window.attachEvent && !isOpera, - Opera: isOpera, - WebKit: ua.indexOf('AppleWebKit/') > -1, - Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, - MobileSafari: /Apple.*Mobile.*Safari/.test(ua) - } - })(), - - BrowserFeatures: { - XPath: !!document.evaluate, - SelectorsAPI: !!document.querySelector, - ElementExtensions: (function() { - var constructor = window.Element || window.HTMLElement; - return !!(constructor && constructor.prototype); - })(), - SpecificElementExtensions: (function() { - if (typeof window.HTMLDivElement !== 'undefined') - return true; - - var div = document.createElement('div'); - var form = document.createElement('form'); - var isSupported = false; - - if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { - isSupported = true; - } - - div = form = null; - - return isSupported; - })() - }, - - ScriptFragment: ']*>([\\S\\s]*?)<\/script>', - JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, - - emptyFunction: function() { }, - K: function(x) { return x } -}; - -if (Prototype.Browser.MobileSafari) - Prototype.BrowserFeatures.SpecificElementExtensions = false; - - -var Abstract = { }; - - -var Try = { - these: function() { - var returnValue; - - for (var i = 0, length = arguments.length; i < length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) { } - } - - return returnValue; - } -}; - -/* Based on Alex Arnell's inheritance implementation. */ - -var Class = (function() { - function subclass() {}; - function create() { - var parent = null, properties = $A(arguments); - if (Object.isFunction(properties[0])) - parent = properties.shift(); - - function klass() { - this.initialize.apply(this, arguments); - } - - Object.extend(klass, Class.Methods); - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - subclass.prototype = parent.prototype; - klass.prototype = new subclass; - parent.subclasses.push(klass); - } - - for (var i = 0; i < properties.length; i++) - klass.addMethods(properties[i]); - - if (!klass.prototype.initialize) - klass.prototype.initialize = Prototype.emptyFunction; - - klass.prototype.constructor = klass; - return klass; - } - - function addMethods(source) { - var ancestor = this.superclass && this.superclass.prototype; - var properties = Object.keys(source); - - if (!Object.keys({ toString: true }).length) { - if (source.toString != Object.prototype.toString) - properties.push("toString"); - if (source.valueOf != Object.prototype.valueOf) - properties.push("valueOf"); - } - - for (var i = 0, length = properties.length; i < length; i++) { - var property = properties[i], value = source[property]; - if (ancestor && Object.isFunction(value) && - value.argumentNames().first() == "$super") { - var method = value; - value = (function(m) { - return function() { return ancestor[m].apply(this, arguments); }; - })(property).wrap(method); - - value.valueOf = method.valueOf.bind(method); - value.toString = method.toString.bind(method); - } - this.prototype[property] = value; - } - - return this; - } - - return { - create: create, - Methods: { - addMethods: addMethods - } - }; -})(); -(function() { - - var _toString = Object.prototype.toString; - - function extend(destination, source) { - for (var property in source) - destination[property] = source[property]; - return destination; - } - - function inspect(object) { - try { - if (isUndefined(object)) return 'undefined'; - if (object === null) return 'null'; - return object.inspect ? object.inspect() : String(object); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } - } - - function toJSON(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); - } - - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (isElement(object)) return; - - var results = []; - for (var property in object) { - var value = toJSON(object[property]); - if (!isUndefined(value)) - results.push(property.toJSON() + ': ' + value); - } - - return '{' + results.join(', ') + '}'; - } - - function toQueryString(object) { - return $H(object).toQueryString(); - } - - function toHTML(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - } - - function keys(object) { - var results = []; - for (var property in object) - results.push(property); - return results; - } - - function values(object) { - var results = []; - for (var property in object) - results.push(object[property]); - return results; - } - - function clone(object) { - return extend({ }, object); - } - - function isElement(object) { - return !!(object && object.nodeType == 1); - } - - function isArray(object) { - return _toString.call(object) == "[object Array]"; - } - - - function isHash(object) { - return object instanceof Hash; - } - - function isFunction(object) { - return typeof object === "function"; - } - - function isString(object) { - return _toString.call(object) == "[object String]"; - } - - function isNumber(object) { - return _toString.call(object) == "[object Number]"; - } - - function isUndefined(object) { - return typeof object === "undefined"; - } - - extend(Object, { - extend: extend, - inspect: inspect, - toJSON: toJSON, - toQueryString: toQueryString, - toHTML: toHTML, - keys: keys, - values: values, - clone: clone, - isElement: isElement, - isArray: isArray, - isHash: isHash, - isFunction: isFunction, - isString: isString, - isNumber: isNumber, - isUndefined: isUndefined - }); -})(); -Object.extend(Function.prototype, (function() { - var slice = Array.prototype.slice; - - function update(array, args) { - var arrayLength = array.length, length = args.length; - while (length--) array[arrayLength + length] = args[length]; - return array; - } - - function merge(array, args) { - array = slice.call(array, 0); - return update(array, args); - } - - function argumentNames() { - var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] - .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') - .replace(/\s+/g, '').split(','); - return names.length == 1 && !names[0] ? [] : names; - } - - function bind(context) { - if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; - var __method = this, args = slice.call(arguments, 1); - return function() { - var a = merge(args, arguments); - return __method.apply(context, a); - } - } - - function bindAsEventListener(context) { - var __method = this, args = slice.call(arguments, 1); - return function(event) { - var a = update([event || window.event], args); - return __method.apply(context, a); - } - } - - function curry() { - if (!arguments.length) return this; - var __method = this, args = slice.call(arguments, 0); - return function() { - var a = merge(args, arguments); - return __method.apply(this, a); - } - } - - function delay(timeout) { - var __method = this, args = slice.call(arguments, 1); - timeout = timeout * 1000 - return window.setTimeout(function() { - return __method.apply(__method, args); - }, timeout); - } - - function defer() { - var args = update([0.01], arguments); - return this.delay.apply(this, args); - } - - function wrap(wrapper) { - var __method = this; - return function() { - var a = update([__method.bind(this)], arguments); - return wrapper.apply(this, a); - } - } - - function methodize() { - if (this._methodized) return this._methodized; - var __method = this; - return this._methodized = function() { - var a = update([this], arguments); - return __method.apply(null, a); - }; - } - - return { - argumentNames: argumentNames, - bind: bind, - bindAsEventListener: bindAsEventListener, - curry: curry, - delay: delay, - defer: defer, - wrap: wrap, - methodize: methodize - } -})()); - - -Date.prototype.toJSON = function() { - return '"' + this.getUTCFullYear() + '-' + - (this.getUTCMonth() + 1).toPaddedString(2) + '-' + - this.getUTCDate().toPaddedString(2) + 'T' + - this.getUTCHours().toPaddedString(2) + ':' + - this.getUTCMinutes().toPaddedString(2) + ':' + - this.getUTCSeconds().toPaddedString(2) + 'Z"'; -}; - - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { - return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; -var PeriodicalExecuter = Class.create({ - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - execute: function() { - this.callback(this); - }, - - stop: function() { - if (!this.timer) return; - clearInterval(this.timer); - this.timer = null; - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.execute(); - this.currentlyExecuting = false; - } catch(e) { - this.currentlyExecuting = false; - throw e; - } - } - } -}); -Object.extend(String, { - interpret: function(value) { - return value == null ? '' : String(value); - }, - specialChar: { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '\\': '\\\\' - } -}); - -Object.extend(String.prototype, (function() { - - function prepareReplacement(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; - } - - function gsub(pattern, replacement) { - var result = '', source = this, match; - replacement = prepareReplacement(replacement); - - if (Object.isString(pattern)) - pattern = RegExp.escape(pattern); - - if (!(pattern.length || pattern.source)) { - replacement = replacement(''); - return replacement + source.split('').join(replacement) + replacement; - } - - while (source.length > 0) { - if (match = source.match(pattern)) { - result += source.slice(0, match.index); - result += String.interpret(replacement(match)); - source = source.slice(match.index + match[0].length); - } else { - result += source, source = ''; - } - } - return result; - } - - function sub(pattern, replacement, count) { - replacement = prepareReplacement(replacement); - count = Object.isUndefined(count) ? 1 : count; - - return this.gsub(pattern, function(match) { - if (--count < 0) return match[0]; - return replacement(match); - }); - } - - function scan(pattern, iterator) { - this.gsub(pattern, iterator); - return String(this); - } - - function truncate(length, truncation) { - length = length || 30; - truncation = Object.isUndefined(truncation) ? '...' : truncation; - return this.length > length ? - this.slice(0, length - truncation.length) + truncation : String(this); - } - - function strip() { - return this.replace(/^\s+/, '').replace(/\s+$/, ''); - } - - function stripTags() { - return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); - } - - function stripScripts() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - } - - function extractScripts() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - } - - function evalScripts() { - return this.extractScripts().map(function(script) { return eval(script) }); - } - - function escapeHTML() { - return this.replace(/&/g,'&').replace(//g,'>'); - } - - function unescapeHTML() { - return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); - } - - - function toQueryParams(separator) { - var match = this.strip().match(/([^?#]*)(#.*)?$/); - if (!match) return { }; - - return match[1].split(separator || '&').inject({ }, function(hash, pair) { - if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - if (value != undefined) value = decodeURIComponent(value); - - if (key in hash) { - if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; - hash[key].push(value); - } - else hash[key] = value; - } - return hash; - }); - } - - function toArray() { - return this.split(''); - } - - function succ() { - return this.slice(0, this.length - 1) + - String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - } - - function times(count) { - return count < 1 ? '' : new Array(count + 1).join(this); - } - - function camelize() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; - - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - } - - function capitalize() { - return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - } - - function underscore() { - return this.replace(/::/g, '/') - .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') - .replace(/([a-z\d])([A-Z])/g, '$1_$2') - .replace(/-/g, '_') - .toLowerCase(); - } - - function dasherize() { - return this.replace(/_/g, '-'); - } - - function inspect(useDoubleQuotes) { - var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { - if (character in String.specialChar) { - return String.specialChar[character]; - } - return '\\u00' + character.charCodeAt().toPaddedString(2, 16); - }); - if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; - return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - } - - function toJSON() { - return this.inspect(true); - } - - function unfilterJSON(filter) { - return this.replace(filter || Prototype.JSONFilter, '$1'); - } - - function isJSON() { - var str = this; - if (str.blank()) return false; - str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - } - - function evalJSON(sanitize) { - var json = this.unfilterJSON(); - try { - if (!sanitize || json.isJSON()) return eval('(' + json + ')'); - } catch (e) { } - throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - } - - function include(pattern) { - return this.indexOf(pattern) > -1; - } - - function startsWith(pattern) { - return this.indexOf(pattern) === 0; - } - - function endsWith(pattern) { - var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - } - - function empty() { - return this == ''; - } - - function blank() { - return /^\s*$/.test(this); - } - - function interpolate(object, pattern) { - return new Template(this, pattern).evaluate(object); - } - - return { - gsub: gsub, - sub: sub, - scan: scan, - truncate: truncate, - strip: String.prototype.trim ? String.prototype.trim : strip, - stripTags: stripTags, - stripScripts: stripScripts, - extractScripts: extractScripts, - evalScripts: evalScripts, - escapeHTML: escapeHTML, - unescapeHTML: unescapeHTML, - toQueryParams: toQueryParams, - parseQuery: toQueryParams, - toArray: toArray, - succ: succ, - times: times, - camelize: camelize, - capitalize: capitalize, - underscore: underscore, - dasherize: dasherize, - inspect: inspect, - toJSON: toJSON, - unfilterJSON: unfilterJSON, - isJSON: isJSON, - evalJSON: evalJSON, - include: include, - startsWith: startsWith, - endsWith: endsWith, - empty: empty, - blank: blank, - interpolate: interpolate - }; -})()); - -var Template = Class.create({ - initialize: function(template, pattern) { - this.template = template.toString(); - this.pattern = pattern || Template.Pattern; - }, - - evaluate: function(object) { - if (object && Object.isFunction(object.toTemplateReplacements)) - object = object.toTemplateReplacements(); - - return this.template.gsub(this.pattern, function(match) { - if (object == null) return (match[1] + ''); - - var before = match[1] || ''; - if (before == '\\') return match[2]; - - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; - match = pattern.exec(expr); - if (match == null) return before; - - while (match != null) { - var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; - ctx = ctx[comp]; - if (null == ctx || '' == match[3]) break; - expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); - match = pattern.exec(expr); - } - - return before + String.interpret(ctx); - }); - } -}); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; - -var $break = { }; - -var Enumerable = (function() { - function each(iterator, context) { - var index = 0; - try { - this._each(function(value) { - iterator.call(context, value, index++); - }); - } catch (e) { - if (e != $break) throw e; - } - return this; - } - - function eachSlice(number, iterator, context) { - var index = -number, slices = [], array = this.toArray(); - if (number < 1) return array; - while ((index += number) < array.length) - slices.push(array.slice(index, index+number)); - return slices.collect(iterator, context); - } - - function all(iterator, context) { - iterator = iterator || Prototype.K; - var result = true; - this.each(function(value, index) { - result = result && !!iterator.call(context, value, index); - if (!result) throw $break; - }); - return result; - } - - function any(iterator, context) { - iterator = iterator || Prototype.K; - var result = false; - this.each(function(value, index) { - if (result = !!iterator.call(context, value, index)) - throw $break; - }); - return result; - } - - function collect(iterator, context) { - iterator = iterator || Prototype.K; - var results = []; - this.each(function(value, index) { - results.push(iterator.call(context, value, index)); - }); - return results; - } - - function detect(iterator, context) { - var result; - this.each(function(value, index) { - if (iterator.call(context, value, index)) { - result = value; - throw $break; - } - }); - return result; - } - - function findAll(iterator, context) { - var results = []; - this.each(function(value, index) { - if (iterator.call(context, value, index)) - results.push(value); - }); - return results; - } - - function grep(filter, iterator, context) { - iterator = iterator || Prototype.K; - var results = []; - - if (Object.isString(filter)) - filter = new RegExp(RegExp.escape(filter)); - - this.each(function(value, index) { - if (filter.match(value)) - results.push(iterator.call(context, value, index)); - }); - return results; - } - - function include(object) { - if (Object.isFunction(this.indexOf)) - if (this.indexOf(object) != -1) return true; - - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - } - - function inGroupsOf(number, fillWith) { - fillWith = Object.isUndefined(fillWith) ? null : fillWith; - return this.eachSlice(number, function(slice) { - while(slice.length < number) slice.push(fillWith); - return slice; - }); - } - - function inject(memo, iterator, context) { - this.each(function(value, index) { - memo = iterator.call(context, memo, value, index); - }); - return memo; - } - - function invoke(method) { - var args = $A(arguments).slice(1); - return this.map(function(value) { - return value[method].apply(value, args); - }); - } - - function max(iterator, context) { - iterator = iterator || Prototype.K; - var result; - this.each(function(value, index) { - value = iterator.call(context, value, index); - if (result == null || value >= result) - result = value; - }); - return result; - } - - function min(iterator, context) { - iterator = iterator || Prototype.K; - var result; - this.each(function(value, index) { - value = iterator.call(context, value, index); - if (result == null || value < result) - result = value; - }); - return result; - } - - function partition(iterator, context) { - iterator = iterator || Prototype.K; - var trues = [], falses = []; - this.each(function(value, index) { - (iterator.call(context, value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - } - - function pluck(property) { - var results = []; - this.each(function(value) { - results.push(value[property]); - }); - return results; - } - - function reject(iterator, context) { - var results = []; - this.each(function(value, index) { - if (!iterator.call(context, value, index)) - results.push(value); - }); - return results; - } - - function sortBy(iterator, context) { - return this.map(function(value, index) { - return { - value: value, - criteria: iterator.call(context, value, index) - }; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - } - - function toArray() { - return this.map(); - } - - function zip() { - var iterator = Prototype.K, args = $A(arguments); - if (Object.isFunction(args.last())) - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - return iterator(collections.pluck(index)); - }); - } - - function size() { - return this.toArray().length; - } - - function inspect() { - return '#'; - } - - - - - - - - - - return { - each: each, - eachSlice: eachSlice, - all: all, - every: all, - any: any, - some: any, - collect: collect, - map: collect, - detect: detect, - findAll: findAll, - select: findAll, - filter: findAll, - grep: grep, - include: include, - member: include, - inGroupsOf: inGroupsOf, - inject: inject, - invoke: invoke, - max: max, - min: min, - partition: partition, - pluck: pluck, - reject: reject, - sortBy: sortBy, - toArray: toArray, - entries: toArray, - zip: zip, - size: size, - inspect: inspect, - find: detect - }; -})(); -function $A(iterable) { - if (!iterable) return []; - if ('toArray' in Object(iterable)) return iterable.toArray(); - var length = iterable.length || 0, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; -} - -function $w(string) { - if (!Object.isString(string)) return []; - string = string.strip(); - return string ? string.split(/\s+/) : []; -} - -Array.from = $A; - - -(function() { - var arrayProto = Array.prototype, - slice = arrayProto.slice, - _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available - - function each(iterator) { - for (var i = 0, length = this.length; i < length; i++) - iterator(this[i]); - } - if (!_each) _each = each; - - function clear() { - this.length = 0; - return this; - } - - function first() { - return this[0]; - } - - function last() { - return this[this.length - 1]; - } - - function compact() { - return this.select(function(value) { - return value != null; - }); - } - - function flatten() { - return this.inject([], function(array, value) { - if (Object.isArray(value)) - return array.concat(value.flatten()); - array.push(value); - return array; - }); - } - - function without() { - var values = slice.call(arguments, 0); - return this.select(function(value) { - return !values.include(value); - }); - } - - function reverse(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - } - - function uniq(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - } - - function intersect(array) { - return this.uniq().findAll(function(item) { - return array.detect(function(value) { return item === value }); - }); - } - - - function clone() { - return slice.call(this, 0); - } - - function size() { - return this.length; - } - - function inspect() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - } - - function toJSON() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (!Object.isUndefined(value)) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } - - function indexOf(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; - } - - function lastIndexOf(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; - } - - function concat() { - var array = slice.call(this, 0), item; - for (var i = 0, length = arguments.length; i < length; i++) { - item = arguments[i]; - if (Object.isArray(item) && !('callee' in item)) { - for (var j = 0, arrayLength = item.length; j < arrayLength; j++) - array.push(item[j]); - } else { - array.push(item); - } - } - return array; - } - - Object.extend(arrayProto, Enumerable); - - if (!arrayProto._reverse) - arrayProto._reverse = arrayProto.reverse; - - Object.extend(arrayProto, { - _each: _each, - clear: clear, - first: first, - last: last, - compact: compact, - flatten: flatten, - without: without, - reverse: reverse, - uniq: uniq, - intersect: intersect, - clone: clone, - toArray: clone, - size: size, - inspect: inspect, - toJSON: toJSON - }); - - var CONCAT_ARGUMENTS_BUGGY = (function() { - return [].concat(arguments)[0][0] !== 1; - })(1,2) - - if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; - - if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; - if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; -})(); -function $H(object) { - return new Hash(object); -}; - -var Hash = Class.create(Enumerable, (function() { - function initialize(object) { - this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); - } - - function _each(iterator) { - for (var key in this._object) { - var value = this._object[key], pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - } - - function set(key, value) { - return this._object[key] = value; - } - - function get(key) { - if (this._object[key] !== Object.prototype[key]) - return this._object[key]; - } - - function unset(key) { - var value = this._object[key]; - delete this._object[key]; - return value; - } - - function toObject() { - return Object.clone(this._object); - } - - function keys() { - return this.pluck('key'); - } - - function values() { - return this.pluck('value'); - } - - function index(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - } - - function merge(object) { - return this.clone().update(object); - } - - function update(object) { - return new Hash(object).inject(this, function(result, pair) { - result.set(pair.key, pair.value); - return result; - }); - } - - function toQueryPair(key, value) { - if (Object.isUndefined(value)) return key; - return key + '=' + encodeURIComponent(String.interpret(value)); - } - - function toQueryString() { - return this.inject([], function(results, pair) { - var key = encodeURIComponent(pair.key), values = pair.value; - - if (values && typeof values == 'object') { - if (Object.isArray(values)) - return results.concat(values.map(toQueryPair.curry(key))); - } else results.push(toQueryPair(key, values)); - return results; - }).join('&'); - } - - function inspect() { - return '#'; - } - - function toJSON() { - return Object.toJSON(this.toObject()); - } - - function clone() { - return new Hash(this); - } - - return { - initialize: initialize, - _each: _each, - set: set, - get: get, - unset: unset, - toObject: toObject, - toTemplateReplacements: toObject, - keys: keys, - values: values, - index: index, - merge: merge, - update: update, - toQueryString: toQueryString, - inspect: inspect, - toJSON: toJSON, - clone: clone - }; -})()); - -Hash.from = $H; -Object.extend(Number.prototype, (function() { - function toColorPart() { - return this.toPaddedString(2, 16); - } - - function succ() { - return this + 1; - } - - function times(iterator, context) { - $R(0, this, true).each(iterator, context); - return this; - } - - function toPaddedString(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - } - - function toJSON() { - return isFinite(this) ? this.toString() : 'null'; - } - - function abs() { - return Math.abs(this); - } - - function round() { - return Math.round(this); - } - - function ceil() { - return Math.ceil(this); - } - - function floor() { - return Math.floor(this); - } - - return { - toColorPart: toColorPart, - succ: succ, - times: times, - toPaddedString: toPaddedString, - toJSON: toJSON, - abs: abs, - round: round, - ceil: ceil, - floor: floor - }; -})()); - -function $R(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -} - -var ObjectRange = Class.create(Enumerable, (function() { - function initialize(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - } - - function _each(iterator) { - var value = this.start; - while (this.include(value)) { - iterator(value); - value = value.succ(); - } - } - - function include(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } - - return { - initialize: initialize, - _each: _each, - include: include - }; -})()); - - - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new XMLHttpRequest()}, - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')} - ) || false; - }, - - activeRequestCount: 0 -}; - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responder) { - if (!this.include(responder)) - this.responders.push(responder); - }, - - unregister: function(responder) { - this.responders = this.responders.without(responder); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (Object.isFunction(responder[callback])) { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) { } - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { Ajax.activeRequestCount++ }, - onComplete: function() { Ajax.activeRequestCount-- } -}); -Ajax.Base = Class.create({ - initialize: function(options) { - this.options = { - method: 'post', - asynchronous: true, - contentType: 'application/x-www-form-urlencoded', - encoding: 'UTF-8', - parameters: '', - evalJSON: true, - evalJS: true - }; - Object.extend(this.options, options || { }); - - this.options.method = this.options.method.toLowerCase(); - - if (Object.isString(this.options.parameters)) - this.options.parameters = this.options.parameters.toQueryParams(); - else if (Object.isHash(this.options.parameters)) - this.options.parameters = this.options.parameters.toObject(); - } -}); -Ajax.Request = Class.create(Ajax.Base, { - _complete: false, - - initialize: function($super, url, options) { - $super(options); - this.transport = Ajax.getTransport(); - this.request(url); - }, - - request: function(url) { - this.url = url; - this.method = this.options.method; - var params = Object.clone(this.options.parameters); - - if (!['get', 'post'].include(this.method)) { - params['_method'] = this.method; - this.method = 'post'; - } - - this.parameters = params; - - if (params = Object.toQueryString(params)) { - if (this.method == 'get') - this.url += (this.url.include('?') ? '&' : '?') + params; - else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - params += '&_='; - } - - try { - var response = new Ajax.Response(this); - if (this.options.onCreate) this.options.onCreate(response); - Ajax.Responders.dispatch('onCreate', this, response); - - this.transport.open(this.method.toUpperCase(), this.url, - this.options.asynchronous); - - if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); - - this.transport.onreadystatechange = this.onStateChange.bind(this); - this.setRequestHeaders(); - - this.body = this.method == 'post' ? (this.options.postBody || params) : null; - this.transport.send(this.body); - - /* Force Firefox to handle ready state 4 for synchronous requests */ - if (!this.options.asynchronous && this.transport.overrideMimeType) - this.onStateChange(); - - } - catch (e) { - this.dispatchException(e); - } - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState > 1 && !((readyState == 4) && this._complete)) - this.respondToReadyState(this.transport.readyState); - }, - - setRequestHeaders: function() { - var headers = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-Prototype-Version': Prototype.Version, - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }; - - if (this.method == 'post') { - headers['Content-type'] = this.options.contentType + - (this.options.encoding ? '; charset=' + this.options.encoding : ''); - - /* Force "Connection: close" for older Mozilla browsers to work - * around a bug where XMLHttpRequest sends an incorrect - * Content-length header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType && - (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) - headers['Connection'] = 'close'; - } - - if (typeof this.options.requestHeaders == 'object') { - var extras = this.options.requestHeaders; - - if (Object.isFunction(extras.push)) - for (var i = 0, length = extras.length; i < length; i += 2) - headers[extras[i]] = extras[i+1]; - else - $H(extras).each(function(pair) { headers[pair.key] = pair.value }); - } - - for (var name in headers) - this.transport.setRequestHeader(name, headers[name]); - }, - - success: function() { - var status = this.getStatus(); - return !status || (status >= 200 && status < 300); - }, - - getStatus: function() { - try { - return this.transport.status || 0; - } catch (e) { return 0 } - }, - - respondToReadyState: function(readyState) { - var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - - if (state == 'Complete') { - try { - this._complete = true; - (this.options['on' + response.status] - || this.options['on' + (this.success() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - var contentType = response.getHeader('Content-type'); - if (this.options.evalJS == 'force' - || (this.options.evalJS && this.isSameOrigin() && contentType - && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) - this.evalResponse(); - } - - try { - (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); - Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - if (state == 'Complete') { - this.transport.onreadystatechange = Prototype.emptyFunction; - } - }, - - isSameOrigin: function() { - var m = this.url.match(/^\s*https?:\/\/[^\/]*/); - return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ - protocol: location.protocol, - domain: document.domain, - port: location.port ? ':' + location.port : '' - })); - }, - - getHeader: function(name) { - try { - return this.transport.getResponseHeader(name) || null; - } catch (e) { return null; } - }, - - evalResponse: function() { - try { - return eval((this.transport.responseText || '').unfilterJSON()); - } catch (e) { - this.dispatchException(e); - } - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - - - - - - - - -Ajax.Response = Class.create({ - initialize: function(request){ - this.request = request; - var transport = this.transport = request.transport, - readyState = this.readyState = transport.readyState; - - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { - this.status = this.getStatus(); - this.statusText = this.getStatusText(); - this.responseText = String.interpret(transport.responseText); - this.headerJSON = this._getHeaderJSON(); - } - - if(readyState == 4) { - var xml = transport.responseXML; - this.responseXML = Object.isUndefined(xml) ? null : xml; - this.responseJSON = this._getResponseJSON(); - } - }, - - status: 0, - - statusText: '', - - getStatus: Ajax.Request.prototype.getStatus, - - getStatusText: function() { - try { - return this.transport.statusText || ''; - } catch (e) { return '' } - }, - - getHeader: Ajax.Request.prototype.getHeader, - - getAllHeaders: function() { - try { - return this.getAllResponseHeaders(); - } catch (e) { return null } - }, - - getResponseHeader: function(name) { - return this.transport.getResponseHeader(name); - }, - - getAllResponseHeaders: function() { - return this.transport.getAllResponseHeaders(); - }, - - _getHeaderJSON: function() { - var json = this.getHeader('X-JSON'); - if (!json) return null; - json = decodeURIComponent(escape(json)); - try { - return json.evalJSON(this.request.options.sanitizeJSON || - !this.request.isSameOrigin()); - } catch (e) { - this.request.dispatchException(e); - } - }, - - _getResponseJSON: function() { - var options = this.request.options; - if (!options.evalJSON || (options.evalJSON != 'force' && - !(this.getHeader('Content-type') || '').include('application/json')) || - this.responseText.blank()) - return null; - try { - return this.responseText.evalJSON(options.sanitizeJSON || - !this.request.isSameOrigin()); - } catch (e) { - this.request.dispatchException(e); - } - } -}); - -Ajax.Updater = Class.create(Ajax.Request, { - initialize: function($super, container, url, options) { - this.container = { - success: (container.success || container), - failure: (container.failure || (container.success ? null : container)) - }; - - options = Object.clone(options); - var onComplete = options.onComplete; - options.onComplete = (function(response, json) { - this.updateContent(response.responseText); - if (Object.isFunction(onComplete)) onComplete(response, json); - }).bind(this); - - $super(url, options); - }, - - updateContent: function(responseText) { - var receiver = this.container[this.success() ? 'success' : 'failure'], - options = this.options; - - if (!options.evalScripts) responseText = responseText.stripScripts(); - - if (receiver = $(receiver)) { - if (options.insertion) { - if (Object.isString(options.insertion)) { - var insertion = { }; insertion[options.insertion] = responseText; - receiver.insert(insertion); - } - else options.insertion(receiver, responseText); - } - else receiver.update(responseText); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { - initialize: function($super, container, url, options) { - $super(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = { }; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.options.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(response) { - if (this.options.decay) { - this.decay = (response.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = response.responseText; - } - this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); - - - -function $(element) { - if (arguments.length > 1) { - for (var i = 0, elements = [], length = arguments.length; i < length; i++) - elements.push($(arguments[i])); - return elements; - } - if (Object.isString(element)) - element = document.getElementById(element); - return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { - document._getElementsByXPath = function(expression, parentElement) { - var results = []; - var query = document.evaluate(expression, $(parentElement) || document, - null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - for (var i = 0, length = query.snapshotLength; i < length; i++) - results.push(Element.extend(query.snapshotItem(i))); - return results; - }; -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Node) var Node = { }; - -if (!Node.ELEMENT_NODE) { - Object.extend(Node, { - ELEMENT_NODE: 1, - ATTRIBUTE_NODE: 2, - TEXT_NODE: 3, - CDATA_SECTION_NODE: 4, - ENTITY_REFERENCE_NODE: 5, - ENTITY_NODE: 6, - PROCESSING_INSTRUCTION_NODE: 7, - COMMENT_NODE: 8, - DOCUMENT_NODE: 9, - DOCUMENT_TYPE_NODE: 10, - DOCUMENT_FRAGMENT_NODE: 11, - NOTATION_NODE: 12 - }); -} - - -(function(global) { - - var SETATTRIBUTE_IGNORES_NAME = (function(){ - var elForm = document.createElement("form"); - var elInput = document.createElement("input"); - var root = document.documentElement; - elInput.setAttribute("name", "test"); - elForm.appendChild(elInput); - root.appendChild(elForm); - var isBuggy = elForm.elements - ? (typeof elForm.elements.test == "undefined") - : null; - root.removeChild(elForm); - elForm = elInput = null; - return isBuggy; - })(); - - var element = global.Element; - global.Element = function(tagName, attributes) { - attributes = attributes || { }; - tagName = tagName.toLowerCase(); - var cache = Element.cache; - if (SETATTRIBUTE_IGNORES_NAME && attributes.name) { - tagName = '<' + tagName + ' name="' + attributes.name + '">'; - delete attributes.name; - return Element.writeAttribute(document.createElement(tagName), attributes); - } - if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); - return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); - }; - Object.extend(global.Element, element || { }); - if (element) global.Element.prototype = element.prototype; -})(this); - -Element.cache = { }; -Element.idCounter = 1; - -Element.Methods = { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function(element) { - element = $(element); - Element[Element.visible(element) ? 'hide' : 'show'](element); - return element; - }, - - - hide: function(element) { - element = $(element); - element.style.display = 'none'; - return element; - }, - - show: function(element) { - element = $(element); - element.style.display = ''; - return element; - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - return element; - }, - - update: (function(){ - - var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ - var el = document.createElement("select"), - isBuggy = true; - el.innerHTML = ""; - if (el.options && el.options[0]) { - isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; - } - el = null; - return isBuggy; - })(); - - var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ - try { - var el = document.createElement("table"); - if (el && el.tBodies) { - el.innerHTML = "test"; - var isBuggy = typeof el.tBodies[0] == "undefined"; - el = null; - return isBuggy; - } - } catch (e) { - return true; - } - })(); - - var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { - var s = document.createElement("script"), - isBuggy = false; - try { - s.appendChild(document.createTextNode("")); - isBuggy = !s.firstChild || - s.firstChild && s.firstChild.nodeType !== 3; - } catch (e) { - isBuggy = true; - } - s = null; - return isBuggy; - })(); - - function update(element, content) { - element = $(element); - - if (content && content.toElement) - content = content.toElement(); - - if (Object.isElement(content)) - return element.update().insert(content); - - content = Object.toHTML(content); - - var tagName = element.tagName.toUpperCase(); - - if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { - element.text = content; - return element; - } - - if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) { - if (tagName in Element._insertionTranslations.tags) { - while (element.firstChild) { - element.removeChild(element.firstChild); - } - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { - element.appendChild(node) - }); - } - else { - element.innerHTML = content.stripScripts(); - } - } - else { - element.innerHTML = content.stripScripts(); - } - - content.evalScripts.bind(content).defer(); - return element; - } - - return update; - })(), - - replace: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - else if (!Object.isElement(content)) { - content = Object.toHTML(content); - var range = element.ownerDocument.createRange(); - range.selectNode(element); - content.evalScripts.bind(content).defer(); - content = range.createContextualFragment(content.stripScripts()); - } - element.parentNode.replaceChild(content, element); - return element; - }, - - insert: function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = {bottom:insertions}; - - var content, insert, tagName, childNodes; - - for (var position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - insert = Element._insertionTranslations[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - insert(element, content); - continue; - } - - content = Object.toHTML(content); - - tagName = ((position == 'before' || position == 'after') - ? element.parentNode : element).tagName.toUpperCase(); - - childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - - if (position == 'top' || position == 'after') childNodes.reverse(); - childNodes.each(insert.curry(element)); - - content.evalScripts.bind(content).defer(); - } - - return element; - }, - - wrap: function(element, wrapper, attributes) { - element = $(element); - if (Object.isElement(wrapper)) - $(wrapper).writeAttribute(attributes || { }); - else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); - else wrapper = new Element('div', wrapper); - if (element.parentNode) - element.parentNode.replaceChild(wrapper, element); - wrapper.appendChild(element); - return wrapper; - }, - - inspect: function(element) { - element = $(element); - var result = '<' + element.tagName.toLowerCase(); - $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); - if (value) result += ' ' + attribute + '=' + value.inspect(true); - }); - return result + '>'; - }, - - recursivelyCollect: function(element, property) { - element = $(element); - var elements = []; - while (element = element[property]) - if (element.nodeType == 1) - elements.push(Element.extend(element)); - return elements; - }, - - ancestors: function(element) { - return Element.recursivelyCollect(element, 'parentNode'); - }, - - descendants: function(element) { - return Element.select(element, "*"); - }, - - firstDescendant: function(element) { - element = $(element).firstChild; - while (element && element.nodeType != 1) element = element.nextSibling; - return $(element); - }, - - immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; - }, - - previousSiblings: function(element) { - return Element.recursivelyCollect(element, 'previousSibling'); - }, - - nextSiblings: function(element) { - return Element.recursivelyCollect(element, 'nextSibling'); - }, - - siblings: function(element) { - element = $(element); - return Element.previousSiblings(element).reverse() - .concat(Element.nextSiblings(element)); - }, - - match: function(element, selector) { - if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); - }, - - up: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(element.parentNode); - var ancestors = Element.ancestors(element); - return Object.isNumber(expression) ? ancestors[expression] : - Selector.findElement(ancestors, expression, index); - }, - - down: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return Element.firstDescendant(element); - return Object.isNumber(expression) ? Element.descendants(element)[expression] : - Element.select(element, expression)[index || 0]; - }, - - previous: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = Element.previousSiblings(element); - return Object.isNumber(expression) ? previousSiblings[expression] : - Selector.findElement(previousSiblings, expression, index); - }, - - next: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = Element.nextSiblings(element); - return Object.isNumber(expression) ? nextSiblings[expression] : - Selector.findElement(nextSiblings, expression, index); - }, - - - select: function(element) { - var args = Array.prototype.slice.call(arguments, 1); - return Selector.findChildElements(element, args); - }, - - adjacent: function(element) { - var args = Array.prototype.slice.call(arguments, 1); - return Selector.findChildElements(element.parentNode, args).without(element); - }, - - identify: function(element) { - element = $(element); - var id = Element.readAttribute(element, 'id'); - if (id) return id; - do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); - Element.writeAttribute(element, 'id', id); - return id; - }, - - readAttribute: function(element, name) { - element = $(element); - if (Prototype.Browser.IE) { - var t = Element._attributeTranslations.read; - if (t.values[name]) return t.values[name](element, name); - if (t.names[name]) name = t.names[name]; - if (name.include(':')) { - return (!element.attributes || !element.attributes[name]) ? null : - element.attributes[name].value; - } - } - return element.getAttribute(name); - }, - - writeAttribute: function(element, name, value) { - element = $(element); - var attributes = { }, t = Element._attributeTranslations.write; - - if (typeof name == 'object') attributes = name; - else attributes[name] = Object.isUndefined(value) ? true : value; - - for (var attr in attributes) { - name = t.names[attr] || attr; - value = attributes[attr]; - if (t.values[attr]) name = t.values[attr](element, value); - if (value === false || value === null) - element.removeAttribute(name); - else if (value === true) - element.setAttribute(name, name); - else element.setAttribute(name, value); - } - return element; - }, - - getHeight: function(element) { - return Element.getDimensions(element).height; - }, - - getWidth: function(element) { - return Element.getDimensions(element).width; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - var elementClassName = element.className; - return (elementClassName.length > 0 && (elementClassName == className || - new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - if (!Element.hasClassName(element, className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - element.className = element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); - return element; - }, - - toggleClassName: function(element, className) { - if (!(element = $(element))) return; - return Element[Element.hasClassName(element, className) ? - 'removeClassName' : 'addClassName'](element, className); - }, - - cleanWhitespace: function(element) { - element = $(element); - var node = element.firstChild; - while (node) { - var nextNode = node.nextSibling; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - element.removeChild(node); - node = nextNode; - } - return element; - }, - - empty: function(element) { - return $(element).innerHTML.blank(); - }, - - descendantOf: function(element, ancestor) { - element = $(element), ancestor = $(ancestor); - - if (element.compareDocumentPosition) - return (element.compareDocumentPosition(ancestor) & 8) === 8; - - if (ancestor.contains) - return ancestor.contains(element) && ancestor !== element; - - while (element = element.parentNode) - if (element == ancestor) return true; - - return false; - }, - - scrollTo: function(element) { - element = $(element); - var pos = Element.cumulativeOffset(element); - window.scrollTo(pos[0], pos[1]); - return element; - }, - - getStyle: function(element, style) { - element = $(element); - style = style == 'float' ? 'cssFloat' : style.camelize(); - var value = element.style[style]; - if (!value || value == 'auto') { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css[style] : null; - } - if (style == 'opacity') return value ? parseFloat(value) : 1.0; - return value == 'auto' ? null : value; - }, - - getOpacity: function(element) { - return $(element).getStyle('opacity'); - }, - - setStyle: function(element, styles) { - element = $(element); - var elementStyle = element.style, match; - if (Object.isString(styles)) { - element.style.cssText += ';' + styles; - return styles.include('opacity') ? - element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; - } - for (var property in styles) - if (property == 'opacity') element.setOpacity(styles[property]); - else - elementStyle[(property == 'float' || property == 'cssFloat') ? - (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : - property] = styles[property]; - - return element; - }, - - setOpacity: function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - return element; - }, - - getDimensions: function(element) { - element = $(element); - var display = Element.getStyle(element, 'display'); - if (display != 'none' && display != null) // Safari bug - return {width: element.offsetWidth, height: element.offsetHeight}; - - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - var originalDisplay = els.display; - els.visibility = 'hidden'; - if (originalPosition != 'fixed') // Switching fixed to absolute causes issues in Safari - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - if (Prototype.Browser.Opera) { - element.style.top = 0; - element.style.left = 0; - } - } - return element; - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - return element; - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return element; - element._overflow = Element.getStyle(element, 'overflow') || 'auto'; - if (element._overflow !== 'hidden') - element.style.overflow = 'hidden'; - return element; - }, - - undoClipping: function(element) { - element = $(element); - if (!element._overflow) return element; - element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; - element._overflow = null; - return element; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - if (element.tagName.toUpperCase() == 'BODY') break; - var p = Element.getStyle(element, 'position'); - if (p !== 'static') break; - } - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - absolutize: function(element) { - element = $(element); - if (Element.getStyle(element, 'position') == 'absolute') return element; - - var offsets = Element.positionedOffset(element); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - return element; - }, - - relativize: function(element) { - element = $(element); - if (Element.getStyle(element, 'position') == 'relative') return element; - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - return element; - }, - - cumulativeScrollOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - getOffsetParent: function(element) { - if (element.offsetParent) return $(element.offsetParent); - if (element == document.body) return $(element); - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return $(element); - - return $(document.body); - }, - - viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - if (element.offsetParent == document.body && - Element.getStyle(element, 'position') == 'absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } - } while (element = element.parentNode); - - return Element._returnOffset(valueL, valueT); - }, - - clonePosition: function(element, source) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || { }); - - source = $(source); - var p = Element.viewportOffset(source); - - element = $(element); - var delta = [0, 0]; - var parent = null; - if (Element.getStyle(element, 'position') == 'absolute') { - parent = Element.getOffsetParent(element); - delta = Element.viewportOffset(parent); - } - - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if (options.setWidth) element.style.width = source.offsetWidth + 'px'; - if (options.setHeight) element.style.height = source.offsetHeight + 'px'; - return element; - } -}; - -Object.extend(Element.Methods, { - getElementsBySelector: Element.Methods.select, - - childElements: Element.Methods.immediateDescendants -}); - -Element._attributeTranslations = { - write: { - names: { - className: 'class', - htmlFor: 'for' - }, - values: { } - } -}; - -if (Prototype.Browser.Opera) { - Element.Methods.getStyle = Element.Methods.getStyle.wrap( - function(proceed, element, style) { - switch (style) { - case 'left': case 'top': case 'right': case 'bottom': - if (proceed(element, 'position') === 'static') return null; - case 'height': case 'width': - if (!Element.visible(element)) return null; - - var dim = parseInt(proceed(element, style), 10); - - if (dim !== element['offset' + style.capitalize()]) - return dim + 'px'; - - var properties; - if (style === 'height') { - properties = ['border-top-width', 'padding-top', - 'padding-bottom', 'border-bottom-width']; - } - else { - properties = ['border-left-width', 'padding-left', - 'padding-right', 'border-right-width']; - } - return properties.inject(dim, function(memo, property) { - var val = proceed(element, property); - return val === null ? memo : memo - parseInt(val, 10); - }) + 'px'; - default: return proceed(element, style); - } - } - ); - - Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( - function(proceed, element, attribute) { - if (attribute === 'title') return element.title; - return proceed(element, attribute); - } - ); -} - -else if (Prototype.Browser.IE) { - Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( - function(proceed, element) { - element = $(element); - try { element.offsetParent } - catch(e) { return $(document.body) } - var position = element.getStyle('position'); - if (position !== 'static') return proceed(element); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - - $w('positionedOffset viewportOffset').each(function(method) { - Element.Methods[method] = Element.Methods[method].wrap( - function(proceed, element) { - element = $(element); - try { element.offsetParent } - catch(e) { return Element._returnOffset(0,0) } - var position = element.getStyle('position'); - if (position !== 'static') return proceed(element); - var offsetParent = element.getOffsetParent(); - if (offsetParent && offsetParent.getStyle('position') === 'fixed') - offsetParent.setStyle({ zoom: 1 }); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - }); - - Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( - function(proceed, element) { - try { element.offsetParent } - catch(e) { return Element._returnOffset(0,0) } - return proceed(element); - } - ); - - Element.Methods.getStyle = function(element, style) { - element = $(element); - style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); - var value = element.style[style]; - if (!value && element.currentStyle) value = element.currentStyle[style]; - - if (style == 'opacity') { - if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) - if (value[1]) return parseFloat(value[1]) / 100; - return 1.0; - } - - if (value == 'auto') { - if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) - return element['offset' + style.capitalize()] + 'px'; - return null; - } - return value; - }; - - Element.Methods.setOpacity = function(element, value) { - function stripAlpha(filter){ - return filter.replace(/alpha\([^\)]*\)/gi,''); - } - element = $(element); - var currentStyle = element.currentStyle; - if ((currentStyle && !currentStyle.hasLayout) || - (!currentStyle && element.style.zoom == 'normal')) - element.style.zoom = 1; - - var filter = element.getStyle('filter'), style = element.style; - if (value == 1 || value === '') { - (filter = stripAlpha(filter)) ? - style.filter = filter : style.removeAttribute('filter'); - return element; - } else if (value < 0.00001) value = 0; - style.filter = stripAlpha(filter) + - 'alpha(opacity=' + (value * 100) + ')'; - return element; - }; - - Element._attributeTranslations = (function(){ - - var classProp = 'className'; - var forProp = 'for'; - - var el = document.createElement('div'); - - el.setAttribute(classProp, 'x'); - - if (el.className !== 'x') { - el.setAttribute('class', 'x'); - if (el.className === 'x') { - classProp = 'class'; - } - } - el = null; - - el = document.createElement('label'); - el.setAttribute(forProp, 'x'); - if (el.htmlFor !== 'x') { - el.setAttribute('htmlFor', 'x'); - if (el.htmlFor === 'x') { - forProp = 'htmlFor'; - } - } - el = null; - - return { - read: { - names: { - 'class': classProp, - 'className': classProp, - 'for': forProp, - 'htmlFor': forProp - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute); - }, - _getAttr2: function(element, attribute) { - return element.getAttribute(attribute, 2); - }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: (function(){ - - var el = document.createElement('div'); - el.onclick = Prototype.emptyFunction; - var value = el.getAttribute('onclick'); - var f; - - if (String(value).indexOf('{') > -1) { - f = function(element, attribute) { - attribute = element.getAttribute(attribute); - if (!attribute) return null; - attribute = attribute.toString(); - attribute = attribute.split('{')[1]; - attribute = attribute.split('}')[0]; - return attribute.strip(); - }; - } - else if (value === '') { - f = function(element, attribute) { - attribute = element.getAttribute(attribute); - if (!attribute) return null; - return attribute.strip(); - }; - } - el = null; - return f; - })(), - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; - } - } - } - } - })(); - - Element._attributeTranslations.write = { - names: Object.extend({ - cellpadding: 'cellPadding', - cellspacing: 'cellSpacing' - }, Element._attributeTranslations.read.names), - values: { - checked: function(element, value) { - element.checked = !!value; - }, - - style: function(element, value) { - element.style.cssText = value ? value : ''; - } - } - }; - - Element._attributeTranslations.has = {}; - - $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + - 'encType maxLength readOnly longDesc frameBorder').each(function(attr) { - Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; - Element._attributeTranslations.has[attr.toLowerCase()] = attr; - }); - - (function(v) { - Object.extend(v, { - href: v._getAttr2, - src: v._getAttr2, - type: v._getAttr, - action: v._getAttrNode, - disabled: v._flag, - checked: v._flag, - readonly: v._flag, - multiple: v._flag, - onload: v._getEv, - onunload: v._getEv, - onclick: v._getEv, - ondblclick: v._getEv, - onmousedown: v._getEv, - onmouseup: v._getEv, - onmouseover: v._getEv, - onmousemove: v._getEv, - onmouseout: v._getEv, - onfocus: v._getEv, - onblur: v._getEv, - onkeypress: v._getEv, - onkeydown: v._getEv, - onkeyup: v._getEv, - onsubmit: v._getEv, - onreset: v._getEv, - onselect: v._getEv, - onchange: v._getEv - }); - })(Element._attributeTranslations.read.values); - - if (Prototype.BrowserFeatures.ElementExtensions) { - (function() { - function _descendants(element) { - var nodes = element.getElementsByTagName('*'), results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName !== "!") // Filter out comment nodes. - results.push(node); - return results; - } - - Element.Methods.down = function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - return Object.isNumber(expression) ? _descendants(element)[expression] : - Element.select(element, expression)[index || 0]; - } - })(); - } - -} - -else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1) ? 0.999999 : - (value === '') ? '' : (value < 0.00001) ? 0 : value; - return element; - }; -} - -else if (Prototype.Browser.WebKit) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - - if (value == 1) - if(element.tagName.toUpperCase() == 'IMG' && element.width) { - element.width++; element.width--; - } else try { - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch (e) { } - - return element; - }; - - Element.Methods.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return Element._returnOffset(valueL, valueT); - }; -} - -if ('outerHTML' in document.documentElement) { - Element.Methods.replace = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - element.parentNode.replaceChild(content, element); - return element; - } - - content = Object.toHTML(content); - var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - - if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - parent.removeChild(element); - if (nextSibling) - fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); - else - fragments.each(function(node) { parent.appendChild(node) }); - } - else element.outerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -Element._returnOffset = function(l, t) { - var result = [l, t]; - result.left = l; - result.top = t; - return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; - if (t) { - div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - } else div.innerHTML = html; - return $A(div.childNodes); -}; - -Element._insertionTranslations = { - before: function(element, node) { - element.parentNode.insertBefore(node, element); - }, - top: function(element, node) { - element.insertBefore(node, element.firstChild); - }, - bottom: function(element, node) { - element.appendChild(node); - }, - after: function(element, node) { - element.parentNode.insertBefore(node, element.nextSibling); - }, - tags: { - TABLE: ['', '
', 1], - TBODY: ['', '
', 2], - TR: ['', '
', 3], - TD: ['
', '
', 4], - SELECT: ['', 1] - } -}; - -(function() { - var tags = Element._insertionTranslations.tags; - Object.extend(tags, { - THEAD: tags.TBODY, - TFOOT: tags.TBODY, - TH: tags.TD - }); -})(); - -Element.Methods.Simulated = { - hasAttribute: function(element, attribute) { - attribute = Element._attributeTranslations.has[attribute] || attribute; - var node = $(element).getAttributeNode(attribute); - return !!(node && node.specified); - } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -(function(div) { - - if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { - window.HTMLElement = { }; - window.HTMLElement.prototype = div['__proto__']; - Prototype.BrowserFeatures.ElementExtensions = true; - } - - div = null; - -})(document.createElement('div')) - -Element.extend = (function() { - - function checkDeficiency(tagName) { - if (typeof window.Element != 'undefined') { - var proto = window.Element.prototype; - if (proto) { - var id = '_' + (Math.random()+'').slice(2); - var el = document.createElement(tagName); - proto[id] = 'x'; - var isBuggy = (el[id] !== 'x'); - delete proto[id]; - el = null; - return isBuggy; - } - } - return false; - } - - function extendElementWith(element, methods) { - for (var property in methods) { - var value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } - } - - var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); - - if (Prototype.BrowserFeatures.SpecificElementExtensions) { - if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { - return function(element) { - if (element && typeof element._extendedByPrototype == 'undefined') { - var t = element.tagName; - if (t && (/^(?:object|applet|embed)$/i.test(t))) { - extendElementWith(element, Element.Methods); - extendElementWith(element, Element.Methods.Simulated); - extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); - } - } - return element; - } - } - return Prototype.K; - } - - var Methods = { }, ByTag = Element.Methods.ByTag; - - var extend = Object.extend(function(element) { - if (!element || typeof element._extendedByPrototype != 'undefined' || - element.nodeType != 1 || element == window) return element; - - var methods = Object.clone(Methods), - tagName = element.tagName.toUpperCase(); - - if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - - extendElementWith(element, methods); - - element._extendedByPrototype = Prototype.emptyFunction; - return element; - - }, { - refresh: function() { - if (!Prototype.BrowserFeatures.ElementExtensions) { - Object.extend(Methods, Element.Methods); - Object.extend(Methods, Element.Methods.Simulated); - } - } - }); - - extend.refresh(); - return extend; -})(); - -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; - -Element.addMethods = function(methods) { - var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - - if (!methods) { - Object.extend(Form, Form.Methods); - Object.extend(Form.Element, Form.Element.Methods); - Object.extend(Element.Methods.ByTag, { - "FORM": Object.clone(Form.Methods), - "INPUT": Object.clone(Form.Element.Methods), - "SELECT": Object.clone(Form.Element.Methods), - "TEXTAREA": Object.clone(Form.Element.Methods) - }); - } - - if (arguments.length == 2) { - var tagName = methods; - methods = arguments[1]; - } - - if (!tagName) Object.extend(Element.Methods, methods || { }); - else { - if (Object.isArray(tagName)) tagName.each(extend); - else extend(tagName); - } - - function extend(tagName) { - tagName = tagName.toUpperCase(); - if (!Element.Methods.ByTag[tagName]) - Element.Methods.ByTag[tagName] = { }; - Object.extend(Element.Methods.ByTag[tagName], methods); - } - - function copy(methods, destination, onlyIfAbsent) { - onlyIfAbsent = onlyIfAbsent || false; - for (var property in methods) { - var value = methods[property]; - if (!Object.isFunction(value)) continue; - if (!onlyIfAbsent || !(property in destination)) - destination[property] = value.methodize(); - } - } - - function findDOMClass(tagName) { - var klass; - var trans = { - "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", - "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", - "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", - "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", - "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": - "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": - "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": - "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": - "FrameSet", "IFRAME": "IFrame" - }; - if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName.capitalize() + 'Element'; - if (window[klass]) return window[klass]; - - var element = document.createElement(tagName); - var proto = element['__proto__'] || element.constructor.prototype; - element = null; - return proto; - } - - var elementPrototype = window.HTMLElement ? HTMLElement.prototype : - Element.prototype; - - if (F.ElementExtensions) { - copy(Element.Methods, elementPrototype); - copy(Element.Methods.Simulated, elementPrototype, true); - } - - if (F.SpecificElementExtensions) { - for (var tag in Element.Methods.ByTag) { - var klass = findDOMClass(tag); - if (Object.isUndefined(klass)) continue; - copy(T[tag], klass.prototype); - } - } - - Object.extend(Element, Element.Methods); - delete Element.ByTag; - - if (Element.extend.refresh) Element.extend.refresh(); - Element.cache = { }; -}; - - -document.viewport = { - - getDimensions: function() { - return { width: this.getWidth(), height: this.getHeight() }; - }, - - getScrollOffsets: function() { - return Element._returnOffset( - window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); - } -}; - -(function(viewport) { - var B = Prototype.Browser, doc = document, element, property = {}; - - function getRootElement() { - if (B.WebKit && !doc.evaluate) - return document; - - if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) - return document.body; - - return document.documentElement; - } - - function define(D) { - if (!element) element = getRootElement(); - - property[D] = 'client' + D; - - viewport['get' + D] = function() { return element[property[D]] }; - return viewport['get' + D](); - } - - viewport.getWidth = define.curry('Width'); - - viewport.getHeight = define.curry('Height'); -})(document.viewport); - - -Element.Storage = { - UID: 1 -}; - -Element.addMethods({ - getStorage: function(element) { - if (!(element = $(element))) return; - - var uid; - if (element === window) { - uid = 0; - } else { - if (typeof element._prototypeUID === "undefined") - element._prototypeUID = [Element.Storage.UID++]; - uid = element._prototypeUID[0]; - } - - if (!Element.Storage[uid]) - Element.Storage[uid] = $H(); - - return Element.Storage[uid]; - }, - - store: function(element, key, value) { - if (!(element = $(element))) return; - - if (arguments.length === 2) { - Element.getStorage(element).update(key); - } else { - Element.getStorage(element).set(key, value); - } - - return element; - }, - - retrieve: function(element, key, defaultValue) { - if (!(element = $(element))) return; - var hash = Element.getStorage(element), value = hash.get(key); - - if (Object.isUndefined(value)) { - hash.set(key, defaultValue); - value = defaultValue; - } - - return value; - }, - - clone: function(element, deep) { - if (!(element = $(element))) return; - var clone = element.cloneNode(deep); - clone._prototypeUID = void 0; - if (deep) { - var descendants = Element.select(clone, '*'), - i = descendants.length; - while (i--) { - descendants[i]._prototypeUID = void 0; - } - } - return Element.extend(clone); - } -}); -/* Portions of the Selector class are derived from Jack Slocum's DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ - -var Selector = Class.create({ - initialize: function(expression) { - this.expression = expression.strip(); - - if (this.shouldUseSelectorsAPI()) { - this.mode = 'selectorsAPI'; - } else if (this.shouldUseXPath()) { - this.mode = 'xpath'; - this.compileXPathMatcher(); - } else { - this.mode = "normal"; - this.compileMatcher(); - } - - }, - - shouldUseXPath: (function() { - - var IS_DESCENDANT_SELECTOR_BUGGY = (function(){ - var isBuggy = false; - if (document.evaluate && window.XPathResult) { - var el = document.createElement('div'); - el.innerHTML = '
'; - - var xpath = ".//*[local-name()='ul' or local-name()='UL']" + - "//*[local-name()='li' or local-name()='LI']"; - - var result = document.evaluate(xpath, el, null, - XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - - isBuggy = (result.snapshotLength !== 2); - el = null; - } - return isBuggy; - })(); - - return function() { - if (!Prototype.BrowserFeatures.XPath) return false; - - var e = this.expression; - - if (Prototype.Browser.WebKit && - (e.include("-of-type") || e.include(":empty"))) - return false; - - if ((/(\[[\w-]*?:|:checked)/).test(e)) - return false; - - if (IS_DESCENDANT_SELECTOR_BUGGY) return false; - - return true; - } - - })(), - - shouldUseSelectorsAPI: function() { - if (!Prototype.BrowserFeatures.SelectorsAPI) return false; - - if (Selector.CASE_INSENSITIVE_CLASS_NAMES) return false; - - if (!Selector._div) Selector._div = new Element('div'); - - try { - Selector._div.querySelector(this.expression); - } catch(e) { - return false; - } - - return true; - }, - - compileMatcher: function() { - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m, len = ps.length, name; - - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; - } - - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; - - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i = 0; i"; - } -}); - -if (Prototype.BrowserFeatures.SelectorsAPI && - document.compatMode === 'BackCompat') { - Selector.CASE_INSENSITIVE_CLASS_NAMES = (function(){ - var div = document.createElement('div'), - span = document.createElement('span'); - - div.id = "prototype_test_id"; - span.className = 'Test'; - div.appendChild(span); - var isIgnored = (div.querySelector('#prototype_test_id .test') !== null); - div = span = null; - return isIgnored; - })(); -} - -Object.extend(Selector, { - _cache: { }, - - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: function(m) { - m[1] = m[1].toLowerCase(); - return new Template("[@#{1}]").evaluate(m); - }, - attr: function(m) { - m[1] = m[1].toLowerCase(); - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0)]", - 'checked': "[@checked]", - 'disabled': "[(@disabled) and (@type!='hidden')]", - 'enabled': "[not(@disabled) and (@type!='hidden')]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, v, len = p.length, name; - - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i = 0; i= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } - } - }, - - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: [ - { name: 'laterSibling', re: /^\s*~\s*/ }, - { name: 'child', re: /^\s*>\s*/ }, - { name: 'adjacent', re: /^\s*\+\s*/ }, - { name: 'descendant', re: /^\s/ }, - - { name: 'tagName', re: /^\s*(\*|[\w\-]+)(\b|$)?/ }, - { name: 'id', re: /^#([\w\-\*]+)(\b|$)/ }, - { name: 'className', re: /^\.([\w\-\*]+)(\b|$)/ }, - { name: 'pseudo', re: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/ }, - { name: 'attrPresence', re: /^\[((?:[\w-]+:)?[\w-]+)\]/ }, - { name: 'attr', re: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ } - ], - - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); - } - }, - - handlers: { - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, - - mark: function(nodes) { - var _true = Prototype.emptyFunction; - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = _true; - return nodes; - }, - - unmark: (function(){ - - var PROPERTIES_ATTRIBUTES_MAP = (function(){ - var el = document.createElement('div'), - isBuggy = false, - propName = '_countedByPrototype', - value = 'x' - el[propName] = value; - isBuggy = (el.getAttribute(propName) === value); - el = null; - return isBuggy; - })(); - - return PROPERTIES_ATTRIBUTES_MAP ? - function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node.removeAttribute('_countedByPrototype'); - return nodes; - } : - function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = void 0; - return nodes; - } - })(), - - index: function(parentNode, reverse, ofType) { - parentNode._countedByPrototype = Prototype.emptyFunction; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - var node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; - } - } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; - } - }, - - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (typeof (n = nodes[i])._countedByPrototype == 'undefined') { - n._countedByPrototype = Prototype.emptyFunction; - results.push(Element.extend(n)); - } - return Selector.handlers.unmark(results); - }, - - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); - } - return results; - }, - - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; - return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - tagName: function(nodes, root, tagName, combinator) { - var uTagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() === uTagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - - if (root == document) { - if (!targetNode) return []; - if (!nodes) return [targetNode]; - } else { - if (!root.sourceIndex || root.sourceIndex < 1) { - var nodes = root.getElementsByTagName('*'); - for (var j = 0, node; node = nodes[j]; j++) { - if (node.id === id) return [node]; - } - } - } - - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); - } - }, - - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); - }, - - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; - }); - }, - - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._countedByPrototype) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } - } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } - } - h.unmark(nodes); - h.unmark(indexed); - return results; - }, - - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (node.tagName == '!' || node.firstChild) continue; - results.push(node); - } - return results; - }, - - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._countedByPrototype) results.push(node); - h.unmark(exclusions); - return results; - }, - - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled && (!node.type || node.type !== 'hidden')) - results.push(node); - return results; - }, - - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); }, - '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); }, - '*=': function(nv, v) { return nv == v || nv && nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() + - '-').include('-' + (v || "").toUpperCase() + '-'); } - }, - - split: function(expression) { - var expressions = []; - expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - return expressions; - }, - - matchElements: function(elements, expression) { - var matches = $$(expression), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._countedByPrototype) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - expressions = Selector.split(expressions.join(',')); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; - } -}); - -if (Prototype.Browser.IE) { - Object.extend(Selector.handlers, { - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - if (node.tagName !== "!") a.push(node); - return a; - } - }); -} - -function $$() { - return Selector.findChildElements(document, $A(arguments)); -} - -var Form = { - reset: function(form) { - form = $(form); - form.reset(); - return form; - }, - - serializeElements: function(elements, options) { - if (typeof options != 'object') options = { hash: !!options }; - else if (Object.isUndefined(options.hash)) options.hash = true; - var key, value, submitted = false, submit = options.submit; - - var data = elements.inject({ }, function(result, element) { - if (!element.disabled && element.name) { - key = element.name; value = $(element).getValue(); - if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && - submit !== false && (!submit || key == submit) && (submitted = true)))) { - if (key in result) { - if (!Object.isArray(result[key])) result[key] = [result[key]]; - result[key].push(value); - } - else result[key] = value; - } - } - return result; - }); - - return options.hash ? data : Object.toQueryString(data); - } -}; - -Form.Methods = { - serialize: function(form, options) { - return Form.serializeElements(Form.getElements(form), options); - }, - - getElements: function(form) { - var elements = $(form).getElementsByTagName('*'), - element, - arr = [ ], - serializers = Form.Element.Serializers; - for (var i = 0; element = elements[i]; i++) { - arr.push(element); - } - return arr.inject([], function(elements, child) { - if (serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - }) - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) return $A(inputs).map(Element.extend); - - for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || (name && input.name != name)) - continue; - matchingInputs.push(Element.extend(input)); - } - - return matchingInputs; - }, - - disable: function(form) { - form = $(form); - Form.getElements(form).invoke('disable'); - return form; - }, - - enable: function(form) { - form = $(form); - Form.getElements(form).invoke('enable'); - return form; - }, - - findFirstElement: function(form) { - var elements = $(form).getElements().findAll(function(element) { - return 'hidden' != element.type && !element.disabled; - }); - var firstByIndex = elements.findAll(function(element) { - return element.hasAttribute('tabIndex') && element.tabIndex >= 0; - }).sortBy(function(element) { return element.tabIndex }).first(); - - return firstByIndex ? firstByIndex : elements.find(function(element) { - return /^(?:input|select|textarea)$/i.test(element.tagName); - }); - }, - - focusFirstElement: function(form) { - form = $(form); - form.findFirstElement().activate(); - return form; - }, - - request: function(form, options) { - form = $(form), options = Object.clone(options || { }); - - var params = options.parameters, action = form.readAttribute('action') || ''; - if (action.blank()) action = window.location.href; - options.parameters = form.serialize(true); - - if (params) { - if (Object.isString(params)) params = params.toQueryParams(); - Object.extend(options.parameters, params); - } - - if (form.hasAttribute('method') && !options.method) - options.method = form.method; - - return new Ajax.Request(action, options); - } -}; - -/*--------------------------------------------------------------------------*/ - - -Form.Element = { - focus: function(element) { - $(element).focus(); - return element; - }, - - select: function(element) { - $(element).select(); - return element; - } -}; - -Form.Element.Methods = { - - serialize: function(element) { - element = $(element); - if (!element.disabled && element.name) { - var value = element.getValue(); - if (value != undefined) { - var pair = { }; - pair[element.name] = value; - return Object.toQueryString(pair); - } - } - return ''; - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - return Form.Element.Serializers[method](element); - }, - - setValue: function(element, value) { - element = $(element); - var method = element.tagName.toLowerCase(); - Form.Element.Serializers[method](element, value); - return element; - }, - - clear: function(element) { - $(element).value = ''; - return element; - }, - - present: function(element) { - return $(element).value != ''; - }, - - activate: function(element) { - element = $(element); - try { - element.focus(); - if (element.select && (element.tagName.toLowerCase() != 'input' || - !(/^(?:button|reset|submit)$/i.test(element.type)))) - element.select(); - } catch (e) { } - return element; - }, - - disable: function(element) { - element = $(element); - element.disabled = true; - return element; - }, - - enable: function(element) { - element = $(element); - element.disabled = false; - return element; - } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; - -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { - input: function(element, value) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element, value); - default: - return Form.Element.Serializers.textarea(element, value); - } - }, - - inputSelector: function(element, value) { - if (Object.isUndefined(value)) return element.checked ? element.value : null; - else element.checked = !!value; - }, - - textarea: function(element, value) { - if (Object.isUndefined(value)) return element.value; - else element.value = value; - }, - - select: function(element, value) { - if (Object.isUndefined(value)) - return this[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - else { - var opt, currentValue, single = !Object.isArray(value); - for (var i = 0, length = element.length; i < length; i++) { - opt = element.options[i]; - currentValue = this.optionValue(opt); - if (single) { - if (currentValue == value) { - opt.selected = true; - return; - } - } - else opt.selected = value.include(currentValue); - } - } - }, - - selectOne: function(element) { - var index = element.selectedIndex; - return index >= 0 ? this.optionValue(element.options[index]) : null; - }, - - selectMany: function(element) { - var values, length = element.length; - if (!length) return null; - - for (var i = 0, values = []; i < length; i++) { - var opt = element.options[i]; - if (opt.selected) values.push(this.optionValue(opt)); - } - return values; - }, - - optionValue: function(opt) { - return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; - } -}; - -/*--------------------------------------------------------------------------*/ - - -Abstract.TimedObserver = Class.create(PeriodicalExecuter, { - initialize: function($super, element, frequency, callback) { - $super(callback, frequency); - this.element = $(element); - this.lastValue = this.getValue(); - }, - - execute: function() { - var value = this.getValue(); - if (Object.isString(this.lastValue) && Object.isString(value) ? - this.lastValue != value : String(this.lastValue) != String(value)) { - this.callback(this.element, value); - this.lastValue = value; - } - } -}); - -Form.Element.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = Class.create({ - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - Form.getElements(this.element).each(this.registerCallback, this); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - default: - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -}); - -Form.Element.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); -(function() { - - var Event = { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, - - cache: {} - }; - - var docEl = document.documentElement; - var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl - && 'onmouseleave' in docEl; - - var _isButton; - if (Prototype.Browser.IE) { - var buttonMap = { 0: 1, 1: 4, 2: 2 }; - _isButton = function(event, code) { - return event.button === buttonMap[code]; - }; - } else if (Prototype.Browser.WebKit) { - _isButton = function(event, code) { - switch (code) { - case 0: return event.which == 1 && !event.metaKey; - case 1: return event.which == 1 && event.metaKey; - default: return false; - } - }; - } else { - _isButton = function(event, code) { - return event.which ? (event.which === code + 1) : (event.button === code); - }; - } - - function isLeftClick(event) { return _isButton(event, 0) } - - function isMiddleClick(event) { return _isButton(event, 1) } - - function isRightClick(event) { return _isButton(event, 2) } - - function element(event) { - event = Event.extend(event); - - var node = event.target, type = event.type, - currentTarget = event.currentTarget; - - if (currentTarget && currentTarget.tagName) { - if (type === 'load' || type === 'error' || - (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' - && currentTarget.type === 'radio')) - node = currentTarget; - } - - if (node.nodeType == Node.TEXT_NODE) - node = node.parentNode; - - return Element.extend(node); - } - - function findElement(event, expression) { - var element = Event.element(event); - if (!expression) return element; - var elements = [element].concat(element.ancestors()); - return Selector.findElement(elements, expression, 0); - } - - function pointer(event) { - return { x: pointerX(event), y: pointerY(event) }; - } - - function pointerX(event) { - var docElement = document.documentElement, - body = document.body || { scrollLeft: 0 }; - - return event.pageX || (event.clientX + - (docElement.scrollLeft || body.scrollLeft) - - (docElement.clientLeft || 0)); - } - - function pointerY(event) { - var docElement = document.documentElement, - body = document.body || { scrollTop: 0 }; - - return event.pageY || (event.clientY + - (docElement.scrollTop || body.scrollTop) - - (docElement.clientTop || 0)); - } - - - function stop(event) { - Event.extend(event); - event.preventDefault(); - event.stopPropagation(); - - event.stopped = true; - } - - Event.Methods = { - isLeftClick: isLeftClick, - isMiddleClick: isMiddleClick, - isRightClick: isRightClick, - - element: element, - findElement: findElement, - - pointer: pointer, - pointerX: pointerX, - pointerY: pointerY, - - stop: stop - }; - - - var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { - m[name] = Event.Methods[name].methodize(); - return m; - }); - - if (Prototype.Browser.IE) { - function _relatedTarget(event) { - var element; - switch (event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } - - Object.extend(methods, { - stopPropagation: function() { this.cancelBubble = true }, - preventDefault: function() { this.returnValue = false }, - inspect: function() { return '[object Event]' } - }); - - Event.extend = function(event, element) { - if (!event) return false; - if (event._extendedByPrototype) return event; - - event._extendedByPrototype = Prototype.emptyFunction; - var pointer = Event.pointer(event); - - Object.extend(event, { - target: event.srcElement || element, - relatedTarget: _relatedTarget(event), - pageX: pointer.x, - pageY: pointer.y - }); - - return Object.extend(event, methods); - }; - } else { - Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; - Object.extend(Event.prototype, methods); - Event.extend = Prototype.K; - } - - function _createResponder(element, eventName, handler) { - var registry = Element.retrieve(element, 'prototype_event_registry'); - - if (Object.isUndefined(registry)) { - CACHE.push(element); - registry = Element.retrieve(element, 'prototype_event_registry', $H()); - } - - var respondersForEvent = registry.get(eventName); - if (Object.isUndefined(respondersForEvent)) { - respondersForEvent = []; - registry.set(eventName, respondersForEvent); - } - - if (respondersForEvent.pluck('handler').include(handler)) return false; - - var responder; - if (eventName.include(":")) { - responder = function(event) { - if (Object.isUndefined(event.eventName)) - return false; - - if (event.eventName !== eventName) - return false; - - Event.extend(event, element); - handler.call(element, event); - }; - } else { - if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && - (eventName === "mouseenter" || eventName === "mouseleave")) { - if (eventName === "mouseenter" || eventName === "mouseleave") { - responder = function(event) { - Event.extend(event, element); - - var parent = event.relatedTarget; - while (parent && parent !== element) { - try { parent = parent.parentNode; } - catch(e) { parent = element; } - } - - if (parent === element) return; - - handler.call(element, event); - }; - } - } else { - responder = function(event) { - Event.extend(event, element); - handler.call(element, event); - }; - } - } - - responder.handler = handler; - respondersForEvent.push(responder); - return responder; - } - - function _destroyCache() { - for (var i = 0, length = CACHE.length; i < length; i++) { - Event.stopObserving(CACHE[i]); - CACHE[i] = null; - } - } - - var CACHE = []; - - if (Prototype.Browser.IE) - window.attachEvent('onunload', _destroyCache); - - if (Prototype.Browser.WebKit) - window.addEventListener('unload', Prototype.emptyFunction, false); - - - var _getDOMEventName = Prototype.K; - - if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { - _getDOMEventName = function(eventName) { - var translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; - return eventName in translations ? translations[eventName] : eventName; - }; - } - - function observe(element, eventName, handler) { - element = $(element); - - var responder = _createResponder(element, eventName, handler); - - if (!responder) return element; - - if (eventName.include(':')) { - if (element.addEventListener) - element.addEventListener("dataavailable", responder, false); - else { - element.attachEvent("ondataavailable", responder); - element.attachEvent("onfilterchange", responder); - } - } else { - var actualEventName = _getDOMEventName(eventName); - - if (element.addEventListener) - element.addEventListener(actualEventName, responder, false); - else - element.attachEvent("on" + actualEventName, responder); - } - - return element; - } - - function stopObserving(element, eventName, handler) { - element = $(element); - - var registry = Element.retrieve(element, 'prototype_event_registry'); - - if (Object.isUndefined(registry)) return element; - - if (eventName && !handler) { - var responders = registry.get(eventName); - - if (Object.isUndefined(responders)) return element; - - responders.each( function(r) { - Element.stopObserving(element, eventName, r.handler); - }); - return element; - } else if (!eventName) { - registry.each( function(pair) { - var eventName = pair.key, responders = pair.value; - - responders.each( function(r) { - Element.stopObserving(element, eventName, r.handler); - }); - }); - return element; - } - - var responders = registry.get(eventName); - - if (!responders) return; - - var responder = responders.find( function(r) { return r.handler === handler; }); - if (!responder) return element; - - var actualEventName = _getDOMEventName(eventName); - - if (eventName.include(':')) { - if (element.removeEventListener) - element.removeEventListener("dataavailable", responder, false); - else { - element.detachEvent("ondataavailable", responder); - element.detachEvent("onfilterchange", responder); - } - } else { - if (element.removeEventListener) - element.removeEventListener(actualEventName, responder, false); - else - element.detachEvent('on' + actualEventName, responder); - } - - registry.set(eventName, responders.without(responder)); - - return element; - } - - function fire(element, eventName, memo, bubble) { - element = $(element); - - if (Object.isUndefined(bubble)) - bubble = true; - - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - var event; - if (document.createEvent) { - event = document.createEvent('HTMLEvents'); - event.initEvent('dataavailable', true, true); - } else { - event = document.createEventObject(); - event.eventType = bubble ? 'ondataavailable' : 'onfilterchange'; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) - element.dispatchEvent(event); - else - element.fireEvent(event.eventType, event); - - return Event.extend(event); - } - - - Object.extend(Event, Event.Methods); - - Object.extend(Event, { - fire: fire, - observe: observe, - stopObserving: stopObserving - }); - - Element.addMethods({ - fire: fire, - - observe: observe, - - stopObserving: stopObserving - }); - - Object.extend(document, { - fire: fire.methodize(), - - observe: observe.methodize(), - - stopObserving: stopObserving.methodize(), - - loaded: false - }); - - if (window.Event) Object.extend(window.Event, Event); - else window.Event = Event; -})(); - -(function() { - /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ - - var timer; - - function fireContentLoadedEvent() { - if (document.loaded) return; - if (timer) window.clearTimeout(timer); - document.loaded = true; - document.fire('dom:loaded'); - } - - function checkReadyState() { - if (document.readyState === 'complete') { - document.stopObserving('readystatechange', checkReadyState); - fireContentLoadedEvent(); - } - } - - function pollDoScroll() { - try { document.documentElement.doScroll('left'); } - catch(e) { - timer = pollDoScroll.defer(); - return; - } - fireContentLoadedEvent(); - } - - if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); - } else { - document.observe('readystatechange', checkReadyState); - if (window == top) - timer = pollDoScroll.defer(); - } - - Event.observe(window, 'load', fireContentLoadedEvent); -})(); - -Element.addMethods(); - -/*------------------------------- DEPRECATED -------------------------------*/ - -Hash.toQueryString = Object.toQueryString; - -var Toggle = { display: Element.toggle }; - -Element.Methods.childOf = Element.Methods.descendantOf; - -var Insertion = { - Before: function(element, content) { - return Element.insert(element, {before:content}); - }, - - Top: function(element, content) { - return Element.insert(element, {top:content}); - }, - - Bottom: function(element, content) { - return Element.insert(element, {bottom:content}); - }, - - After: function(element, content) { - return Element.insert(element, {after:content}); - } -}; - -var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); - -var Position = { - includeScrollOffsets: false, - - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = Element.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = Element.cumulativeScrollOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = Element.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - - cumulativeOffset: Element.Methods.cumulativeOffset, - - positionedOffset: Element.Methods.positionedOffset, - - absolutize: function(element) { - Position.prepare(); - return Element.absolutize(element); - }, - - relativize: function(element) { - Position.prepare(); - return Element.relativize(element); - }, - - realOffset: Element.Methods.cumulativeScrollOffset, - - offsetParent: Element.Methods.getOffsetParent, - - page: Element.Methods.viewportOffset, - - clone: function(source, target, options) { - options = options || { }; - return Element.clonePosition(target, source, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ - function iter(name) { - return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; - } - - instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? - function(element, className) { - className = className.toString().strip(); - var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); - return cond ? document._getElementsByXPath('.//*' + cond, element) : []; - } : function(element, className) { - className = className.toString().strip(); - var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); - if (!classNames && !className) return elements; - - var nodes = $(element).getElementsByTagName('*'); - className = ' ' + className + ' '; - - for (var i = 0, child, cn; child = nodes[i]; i++) { - if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || - (classNames && classNames.all(function(name) { - return !name.toString().blank() && cn.include(' ' + name + ' '); - })))) - elements.push(Element.extend(child)); - } - return elements; - }; - - return function(className, parentElement) { - return $(parentElement || document.body).getElementsByClassName(className); - }; -}(Element.Methods); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set($A(this).concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set($A(this).without(classNameToRemove).join(' ')); - }, - - toString: function() { - return $A(this).join(' '); - } -}; - -Object.extend(Element.ClassNames.prototype, Enumerable); - -/*--------------------------------------------------------------------------*/ diff --git a/src/main/example/web-socket-js/WebSocketMain.swf b/src/main/example/web-socket-js/WebSocketMain.swf deleted file mode 100644 index 8174466912475a494681e9436844f4bf90d909f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177114 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�{?S0&?Rq)c&c-(}SFHOPy4tz`b5gun?zakh{ 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
|G@gv7v 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 G)Bgi3fUR8s diff --git a/src/main/example/web-socket-js/index.html b/src/main/example/web-socket-js/index.html deleted file mode 100644 index ee8db6e68..000000000 --- a/src/main/example/web-socket-js/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - diff --git a/src/main/example/web-socket-js/swfobject.js b/src/main/example/web-socket-js/swfobject.js deleted file mode 100644 index 8eafe9dd8..000000000 --- a/src/main/example/web-socket-js/swfobject.js +++ /dev/null @@ -1,4 +0,0 @@ -/* SWFObject v2.2 - is released under the MIT License -*/ -var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab -// License: New BSD License -// Reference: http://dev.w3.org/html5/websockets/ -// Reference: http://tools.ietf.org/html/rfc6455 - -(function() { - - if (window.WEB_SOCKET_FORCE_FLASH) { - // Keeps going. - } else if (window.WebSocket) { - return; - } else if (window.MozWebSocket) { - // Firefox. - window.WebSocket = MozWebSocket; - return; - } - - var logger; - if (window.WEB_SOCKET_LOGGER) { - logger = WEB_SOCKET_LOGGER; - } else if (window.console && window.console.log && window.console.error) { - // In some environment, console is defined but console.log or console.error is missing. - logger = window.console; - } else { - logger = {log: function(){ }, error: function(){ }}; - } - - // swfobject.hasFlashPlayerVersion("10.0.0") doesn't work with Gnash. - if (swfobject.getFlashPlayerVersion().major < 10) { - logger.error("Flash Player >= 10.0.0 is required."); - return; - } - if (location.protocol == "file:") { - logger.error( - "WARNING: web-socket-js doesn't work in file:///... URL " + - "unless you set Flash Security Settings properly. " + - "Open the page via Web server i.e. http://..."); - } - - /** - * Our own implementation of WebSocket class using Flash. - * @param {string} url - * @param {array or string} protocols - * @param {string} proxyHost - * @param {int} proxyPort - * @param {string} headers - */ - window.WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { - var self = this; - self.__id = WebSocket.__nextId++; - WebSocket.__instances[self.__id] = self; - self.readyState = WebSocket.CONNECTING; - self.bufferedAmount = 0; - self.__events = {}; - if (!protocols) { - protocols = []; - } else if (typeof protocols == "string") { - protocols = [protocols]; - } - // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. - // Otherwise, when onopen fires immediately, onopen is called before it is set. - self.__createTask = setTimeout(function() { - WebSocket.__addTask(function() { - self.__createTask = null; - WebSocket.__flash.create( - self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); - }); - }, 0); - }; - - /** - * Send data to the web socket. - * @param {string} data The data to send to the socket. - * @return {boolean} True for success, false for failure. - */ - WebSocket.prototype.send = function(data) { - if (this.readyState == WebSocket.CONNECTING) { - throw "INVALID_STATE_ERR: Web Socket connection has not been established"; - } - // We use encodeURIComponent() here, because FABridge doesn't work if - // the argument includes some characters. We don't use escape() here - // because of this: - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions - // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't - // preserve all Unicode characters either e.g. "\uffff" in Firefox. - // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require - // additional testing. - var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); - if (result < 0) { // success - return true; - } else { - this.bufferedAmount += result; - return false; - } - }; - - /** - * Close this web socket gracefully. - */ - WebSocket.prototype.close = function() { - if (this.__createTask) { - clearTimeout(this.__createTask); - this.__createTask = null; - this.readyState = WebSocket.CLOSED; - return; - } - if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { - return; - } - this.readyState = WebSocket.CLOSING; - WebSocket.__flash.close(this.__id); - }; - - /** - * Implementation of {@link DOM 2 EventTarget Interface} - * - * @param {string} type - * @param {function} listener - * @param {boolean} useCapture - * @return void - */ - WebSocket.prototype.addEventListener = function(type, listener, useCapture) { - if (!(type in this.__events)) { - this.__events[type] = []; - } - this.__events[type].push(listener); - }; - - /** - * Implementation of {@link DOM 2 EventTarget Interface} - * - * @param {string} type - * @param {function} listener - * @param {boolean} useCapture - * @return void - */ - WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { - if (!(type in this.__events)) return; - var events = this.__events[type]; - for (var i = events.length - 1; i >= 0; --i) { - if (events[i] === listener) { - events.splice(i, 1); - break; - } - } - }; - - /** - * Implementation of {@link DOM 2 EventTarget Interface} - * - * @param {Event} event - * @return void - */ - WebSocket.prototype.dispatchEvent = function(event) { - var events = this.__events[event.type] || []; - for (var i = 0; i < events.length; ++i) { - events[i](event); - } - var handler = this["on" + event.type]; - if (handler) handler.apply(this, [event]); - }; - - /** - * Handles an event from Flash. - * @param {Object} flashEvent - */ - WebSocket.prototype.__handleEvent = function(flashEvent) { - - if ("readyState" in flashEvent) { - this.readyState = flashEvent.readyState; - } - if ("protocol" in flashEvent) { - this.protocol = flashEvent.protocol; - } - - var jsEvent; - if (flashEvent.type == "open" || flashEvent.type == "error") { - jsEvent = this.__createSimpleEvent(flashEvent.type); - } else if (flashEvent.type == "close") { - jsEvent = this.__createSimpleEvent("close"); - jsEvent.wasClean = flashEvent.wasClean ? true : false; - jsEvent.code = flashEvent.code; - jsEvent.reason = flashEvent.reason; - } else if (flashEvent.type == "message") { - var data = decodeURIComponent(flashEvent.message); - jsEvent = this.__createMessageEvent("message", data); - } else { - throw "unknown event type: " + flashEvent.type; - } - - this.dispatchEvent(jsEvent); - - }; - - WebSocket.prototype.__createSimpleEvent = function(type) { - if (document.createEvent && window.Event) { - var event = document.createEvent("Event"); - event.initEvent(type, false, false); - return event; - } else { - return {type: type, bubbles: false, cancelable: false}; - } - }; - - WebSocket.prototype.__createMessageEvent = function(type, data) { - if (document.createEvent && window.MessageEvent && !window.opera) { - var event = document.createEvent("MessageEvent"); - event.initMessageEvent("message", false, false, data, null, null, window, null); - return event; - } else { - // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. - return {type: type, data: data, bubbles: false, cancelable: false}; - } - }; - - /** - * Define the WebSocket readyState enumeration. - */ - WebSocket.CONNECTING = 0; - WebSocket.OPEN = 1; - WebSocket.CLOSING = 2; - WebSocket.CLOSED = 3; - - WebSocket.__initialized = false; - WebSocket.__flash = null; - WebSocket.__instances = {}; - WebSocket.__tasks = []; - WebSocket.__nextId = 0; - - /** - * Load a new flash security policy file. - * @param {string} url - */ - WebSocket.loadFlashPolicyFile = function(url){ - WebSocket.__addTask(function() { - WebSocket.__flash.loadManualPolicyFile(url); - }); - }; - - /** - * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. - */ - WebSocket.__initialize = function() { - - if (WebSocket.__initialized) return; - WebSocket.__initialized = true; - - if (WebSocket.__swfLocation) { - // For backword compatibility. - window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; - } - if (!window.WEB_SOCKET_SWF_LOCATION) { - logger.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); - return; - } - if (!window.WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR && - !WEB_SOCKET_SWF_LOCATION.match(/(^|\/)WebSocketMainInsecure\.swf(\?.*)?$/) && - WEB_SOCKET_SWF_LOCATION.match(/^\w+:\/\/([^\/]+)/)) { - var swfHost = RegExp.$1; - if (location.host != swfHost) { - logger.error( - "[WebSocket] You must host HTML and WebSocketMain.swf in the same host " + - "('" + location.host + "' != '" + swfHost + "'). " + - "See also 'How to host HTML file and SWF file in different domains' section " + - "in README.md. If you use WebSocketMainInsecure.swf, you can suppress this message " + - "by WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR = true;"); - } - } - var container = document.createElement("div"); - container.id = "webSocketContainer"; - // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents - // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). - // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash - // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is - // the best we can do as far as we know now. - container.style.position = "absolute"; - if (WebSocket.__isFlashLite()) { - container.style.left = "0px"; - container.style.top = "0px"; - } else { - container.style.left = "-100px"; - container.style.top = "-100px"; - } - var holder = document.createElement("div"); - holder.id = "webSocketFlash"; - container.appendChild(holder); - document.body.appendChild(container); - // See this article for hasPriority: - // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html - swfobject.embedSWF( - WEB_SOCKET_SWF_LOCATION, - "webSocketFlash", - "1" /* width */, - "1" /* height */, - "10.0.0" /* SWF version */, - null, - null, - {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, - null, - function(e) { - if (!e.success) { - logger.error("[WebSocket] swfobject.embedSWF failed"); - } - } - ); - - }; - - /** - * Called by Flash to notify JS that it's fully loaded and ready - * for communication. - */ - WebSocket.__onFlashInitialized = function() { - // We need to set a timeout here to avoid round-trip calls - // to flash during the initialization process. - setTimeout(function() { - WebSocket.__flash = document.getElementById("webSocketFlash"); - WebSocket.__flash.setCallerUrl(location.href); - WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); - for (var i = 0; i < WebSocket.__tasks.length; ++i) { - WebSocket.__tasks[i](); - } - WebSocket.__tasks = []; - }, 0); - }; - - /** - * Called by Flash to notify WebSockets events are fired. - */ - WebSocket.__onFlashEvent = function() { - setTimeout(function() { - try { - // Gets events using receiveEvents() instead of getting it from event object - // of Flash event. This is to make sure to keep message order. - // It seems sometimes Flash events don't arrive in the same order as they are sent. - var events = WebSocket.__flash.receiveEvents(); - for (var i = 0; i < events.length; ++i) { - WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); - } - } catch (e) { - logger.error(e); - } - }, 0); - return true; - }; - - // Called by Flash. - WebSocket.__log = function(message) { - logger.log(decodeURIComponent(message)); - }; - - // Called by Flash. - WebSocket.__error = function(message) { - logger.error(decodeURIComponent(message)); - }; - - WebSocket.__addTask = function(task) { - if (WebSocket.__flash) { - task(); - } else { - WebSocket.__tasks.push(task); - } - }; - - /** - * Test if the browser is running flash lite. - * @return {boolean} True if flash lite is running, false otherwise. - */ - WebSocket.__isFlashLite = function() { - if (!window.navigator || !window.navigator.mimeTypes) { - return false; - } - var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; - if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { - return false; - } - return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; - }; - - if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { - // NOTE: - // This fires immediately if web_socket.js is dynamically loaded after - // the document is loaded. - swfobject.addDomLoadEvent(function() { - WebSocket.__initialize(); - }); - } - -})(); diff --git a/src/main/java/org/java_websocket/AbstractWrappedByteChannel.java b/src/org/java_websocket/AbstractWrappedByteChannel.java similarity index 100% rename from src/main/java/org/java_websocket/AbstractWrappedByteChannel.java rename to src/org/java_websocket/AbstractWrappedByteChannel.java diff --git a/src/main/java/org/java_websocket/SSLSocketChannel2.java b/src/org/java_websocket/SSLSocketChannel2.java similarity index 100% rename from src/main/java/org/java_websocket/SSLSocketChannel2.java rename to src/org/java_websocket/SSLSocketChannel2.java diff --git a/src/main/java/org/java_websocket/SocketChannelIOHelper.java b/src/org/java_websocket/SocketChannelIOHelper.java similarity index 100% rename from src/main/java/org/java_websocket/SocketChannelIOHelper.java rename to src/org/java_websocket/SocketChannelIOHelper.java diff --git a/src/main/java/org/java_websocket/WebSocket.java b/src/org/java_websocket/WebSocket.java similarity index 100% rename from src/main/java/org/java_websocket/WebSocket.java rename to src/org/java_websocket/WebSocket.java diff --git a/src/main/java/org/java_websocket/WebSocketAdapter.java b/src/org/java_websocket/WebSocketAdapter.java similarity index 100% rename from src/main/java/org/java_websocket/WebSocketAdapter.java rename to src/org/java_websocket/WebSocketAdapter.java diff --git a/src/main/java/org/java_websocket/WebSocketFactory.java b/src/org/java_websocket/WebSocketFactory.java similarity index 100% rename from src/main/java/org/java_websocket/WebSocketFactory.java rename to src/org/java_websocket/WebSocketFactory.java diff --git a/src/main/java/org/java_websocket/WebSocketImpl.java b/src/org/java_websocket/WebSocketImpl.java similarity index 100% rename from src/main/java/org/java_websocket/WebSocketImpl.java rename to src/org/java_websocket/WebSocketImpl.java diff --git a/src/main/java/org/java_websocket/WebSocketListener.java b/src/org/java_websocket/WebSocketListener.java similarity index 100% rename from src/main/java/org/java_websocket/WebSocketListener.java rename to src/org/java_websocket/WebSocketListener.java diff --git a/src/main/java/org/java_websocket/WrappedByteChannel.java b/src/org/java_websocket/WrappedByteChannel.java similarity index 100% rename from src/main/java/org/java_websocket/WrappedByteChannel.java rename to src/org/java_websocket/WrappedByteChannel.java diff --git a/src/main/java/org/java_websocket/client/AbstractClientProxyChannel.java b/src/org/java_websocket/client/AbstractClientProxyChannel.java similarity index 100% rename from src/main/java/org/java_websocket/client/AbstractClientProxyChannel.java rename to src/org/java_websocket/client/AbstractClientProxyChannel.java diff --git a/src/main/java/org/java_websocket/client/WebSocketClient.java b/src/org/java_websocket/client/WebSocketClient.java similarity index 100% rename from src/main/java/org/java_websocket/client/WebSocketClient.java rename to src/org/java_websocket/client/WebSocketClient.java diff --git a/src/main/java/org/java_websocket/drafts/Draft.java b/src/org/java_websocket/drafts/Draft.java similarity index 100% rename from src/main/java/org/java_websocket/drafts/Draft.java rename to src/org/java_websocket/drafts/Draft.java diff --git a/src/main/java/org/java_websocket/drafts/Draft_10.java b/src/org/java_websocket/drafts/Draft_10.java similarity index 100% rename from src/main/java/org/java_websocket/drafts/Draft_10.java rename to src/org/java_websocket/drafts/Draft_10.java diff --git a/src/main/java/org/java_websocket/drafts/Draft_17.java b/src/org/java_websocket/drafts/Draft_17.java similarity index 100% rename from src/main/java/org/java_websocket/drafts/Draft_17.java rename to src/org/java_websocket/drafts/Draft_17.java diff --git a/src/main/java/org/java_websocket/drafts/Draft_75.java b/src/org/java_websocket/drafts/Draft_75.java similarity index 100% rename from src/main/java/org/java_websocket/drafts/Draft_75.java rename to src/org/java_websocket/drafts/Draft_75.java diff --git a/src/main/java/org/java_websocket/drafts/Draft_76.java b/src/org/java_websocket/drafts/Draft_76.java similarity index 100% rename from src/main/java/org/java_websocket/drafts/Draft_76.java rename to src/org/java_websocket/drafts/Draft_76.java diff --git a/src/main/java/org/java_websocket/exceptions/IncompleteHandshakeException.java b/src/org/java_websocket/exceptions/IncompleteHandshakeException.java similarity index 100% rename from src/main/java/org/java_websocket/exceptions/IncompleteHandshakeException.java rename to src/org/java_websocket/exceptions/IncompleteHandshakeException.java diff --git a/src/main/java/org/java_websocket/exceptions/InvalidDataException.java b/src/org/java_websocket/exceptions/InvalidDataException.java similarity index 100% rename from src/main/java/org/java_websocket/exceptions/InvalidDataException.java rename to src/org/java_websocket/exceptions/InvalidDataException.java diff --git a/src/main/java/org/java_websocket/exceptions/InvalidFrameException.java b/src/org/java_websocket/exceptions/InvalidFrameException.java similarity index 100% rename from src/main/java/org/java_websocket/exceptions/InvalidFrameException.java rename to src/org/java_websocket/exceptions/InvalidFrameException.java diff --git a/src/main/java/org/java_websocket/exceptions/InvalidHandshakeException.java b/src/org/java_websocket/exceptions/InvalidHandshakeException.java similarity index 100% rename from src/main/java/org/java_websocket/exceptions/InvalidHandshakeException.java rename to src/org/java_websocket/exceptions/InvalidHandshakeException.java diff --git a/src/main/java/org/java_websocket/exceptions/LimitExedeedException.java b/src/org/java_websocket/exceptions/LimitExedeedException.java similarity index 100% rename from src/main/java/org/java_websocket/exceptions/LimitExedeedException.java rename to src/org/java_websocket/exceptions/LimitExedeedException.java diff --git a/src/main/java/org/java_websocket/exceptions/NotSendableException.java b/src/org/java_websocket/exceptions/NotSendableException.java similarity index 100% rename from src/main/java/org/java_websocket/exceptions/NotSendableException.java rename to src/org/java_websocket/exceptions/NotSendableException.java diff --git a/src/main/java/org/java_websocket/exceptions/WebsocketNotConnectedException.java b/src/org/java_websocket/exceptions/WebsocketNotConnectedException.java similarity index 100% rename from src/main/java/org/java_websocket/exceptions/WebsocketNotConnectedException.java rename to src/org/java_websocket/exceptions/WebsocketNotConnectedException.java diff --git a/src/main/java/org/java_websocket/framing/CloseFrame.java b/src/org/java_websocket/framing/CloseFrame.java similarity index 100% rename from src/main/java/org/java_websocket/framing/CloseFrame.java rename to src/org/java_websocket/framing/CloseFrame.java diff --git a/src/main/java/org/java_websocket/framing/CloseFrameBuilder.java b/src/org/java_websocket/framing/CloseFrameBuilder.java similarity index 100% rename from src/main/java/org/java_websocket/framing/CloseFrameBuilder.java rename to src/org/java_websocket/framing/CloseFrameBuilder.java diff --git a/src/main/java/org/java_websocket/framing/FrameBuilder.java b/src/org/java_websocket/framing/FrameBuilder.java similarity index 100% rename from src/main/java/org/java_websocket/framing/FrameBuilder.java rename to src/org/java_websocket/framing/FrameBuilder.java diff --git a/src/main/java/org/java_websocket/framing/Framedata.java b/src/org/java_websocket/framing/Framedata.java similarity index 100% rename from src/main/java/org/java_websocket/framing/Framedata.java rename to src/org/java_websocket/framing/Framedata.java diff --git a/src/main/java/org/java_websocket/framing/FramedataImpl1.java b/src/org/java_websocket/framing/FramedataImpl1.java similarity index 100% rename from src/main/java/org/java_websocket/framing/FramedataImpl1.java rename to src/org/java_websocket/framing/FramedataImpl1.java diff --git a/src/main/java/org/java_websocket/handshake/ClientHandshake.java b/src/org/java_websocket/handshake/ClientHandshake.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/ClientHandshake.java rename to src/org/java_websocket/handshake/ClientHandshake.java diff --git a/src/main/java/org/java_websocket/handshake/ClientHandshakeBuilder.java b/src/org/java_websocket/handshake/ClientHandshakeBuilder.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/ClientHandshakeBuilder.java rename to src/org/java_websocket/handshake/ClientHandshakeBuilder.java diff --git a/src/main/java/org/java_websocket/handshake/HandshakeBuilder.java b/src/org/java_websocket/handshake/HandshakeBuilder.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/HandshakeBuilder.java rename to src/org/java_websocket/handshake/HandshakeBuilder.java diff --git a/src/main/java/org/java_websocket/handshake/HandshakeImpl1Client.java b/src/org/java_websocket/handshake/HandshakeImpl1Client.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/HandshakeImpl1Client.java rename to src/org/java_websocket/handshake/HandshakeImpl1Client.java diff --git a/src/main/java/org/java_websocket/handshake/HandshakeImpl1Server.java b/src/org/java_websocket/handshake/HandshakeImpl1Server.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/HandshakeImpl1Server.java rename to src/org/java_websocket/handshake/HandshakeImpl1Server.java diff --git a/src/main/java/org/java_websocket/handshake/Handshakedata.java b/src/org/java_websocket/handshake/Handshakedata.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/Handshakedata.java rename to src/org/java_websocket/handshake/Handshakedata.java diff --git a/src/main/java/org/java_websocket/handshake/HandshakedataImpl1.java b/src/org/java_websocket/handshake/HandshakedataImpl1.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/HandshakedataImpl1.java rename to src/org/java_websocket/handshake/HandshakedataImpl1.java diff --git a/src/main/java/org/java_websocket/handshake/ServerHandshake.java b/src/org/java_websocket/handshake/ServerHandshake.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/ServerHandshake.java rename to src/org/java_websocket/handshake/ServerHandshake.java diff --git a/src/main/java/org/java_websocket/handshake/ServerHandshakeBuilder.java b/src/org/java_websocket/handshake/ServerHandshakeBuilder.java similarity index 100% rename from src/main/java/org/java_websocket/handshake/ServerHandshakeBuilder.java rename to src/org/java_websocket/handshake/ServerHandshakeBuilder.java diff --git a/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java b/src/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java similarity index 94% rename from src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java rename to src/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java index 4d9eb54eb..6ea8d4b86 100644 --- a/src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java +++ b/src/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java @@ -25,7 +25,7 @@ public DefaultSSLWebSocketServerFactory( SSLContext sslContext ) { this( sslContext, Executors.newSingleThreadScheduledExecutor() ); } - public DefaltSSLWebSocketServerFactory( SSLContext sslContext , ExecutorService exec ) { + public DefaultSSLWebSocketServerFactory( SSLContext sslContext , ExecutorService exec ) { if( sslContext == null || exec == null ) throw new IllegalArgumentException(); this.sslcontext = sslContext; diff --git a/src/main/java/org/java_websocket/server/DefaultWebSocketServerFactory.java b/src/org/java_websocket/server/DefaultWebSocketServerFactory.java similarity index 100% rename from src/main/java/org/java_websocket/server/DefaultWebSocketServerFactory.java rename to src/org/java_websocket/server/DefaultWebSocketServerFactory.java diff --git a/src/main/java/org/java_websocket/server/WebSocketServer.java b/src/org/java_websocket/server/WebSocketServer.java similarity index 100% rename from src/main/java/org/java_websocket/server/WebSocketServer.java rename to src/org/java_websocket/server/WebSocketServer.java diff --git a/src/main/java/org/java_websocket/util/Base64.java b/src/org/java_websocket/util/Base64.java similarity index 100% rename from src/main/java/org/java_websocket/util/Base64.java rename to src/org/java_websocket/util/Base64.java diff --git a/src/main/java/org/java_websocket/util/Charsetfunctions.java b/src/org/java_websocket/util/Charsetfunctions.java similarity index 100% rename from src/main/java/org/java_websocket/util/Charsetfunctions.java rename to src/org/java_websocket/util/Charsetfunctions.java