From 589c7e4e8d4e713739eb2cb6431f5b8a458079dd Mon Sep 17 00:00:00 2001 From: Takuya Fujii Date: Wed, 28 May 2014 23:21:00 +0900 Subject: [PATCH 01/10] Introduce using query --- .gitignore | 2 + .gradle/1.11/taskArtifacts/cache.properties | 1 + .../1.11/taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .gradle/1.11/taskArtifacts/fileSnapshots.bin | Bin 0 -> 18571 bytes .gradle/1.11/taskArtifacts/taskArtifacts.bin | Bin 0 -> 18614 bytes build.gradle | 10 ++ build.xml | 1 - gradlew | 164 ++++++++++++++++++ src/io/socket/IOConnection.java | 25 ++- src/io/socket/SocketIO.java | 10 +- 10 files changed, 205 insertions(+), 8 deletions(-) create mode 100644 .gradle/1.11/taskArtifacts/cache.properties create mode 100644 .gradle/1.11/taskArtifacts/cache.properties.lock create mode 100644 .gradle/1.11/taskArtifacts/fileSnapshots.bin create mode 100644 .gradle/1.11/taskArtifacts/taskArtifacts.bin create mode 100644 build.gradle create mode 100755 gradlew diff --git a/.gitignore b/.gitignore index d1b29c6..cded08d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ bin/ jar/ +*.iml +.idea/* \ No newline at end of file diff --git a/.gradle/1.11/taskArtifacts/cache.properties b/.gradle/1.11/taskArtifacts/cache.properties new file mode 100644 index 0000000..5c9bcfc --- /dev/null +++ b/.gradle/1.11/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Wed May 28 22:27:36 JST 2014 diff --git a/.gradle/1.11/taskArtifacts/cache.properties.lock b/.gradle/1.11/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000000000000000000000000000000000000..7935d626860007ad1723eb8d2e2102d1aa4a4869 GIT binary patch literal 17 TcmZQ>P%{4OD!SE`0RlJxCyxU% literal 0 HcmV?d00001 diff --git a/.gradle/1.11/taskArtifacts/fileSnapshots.bin b/.gradle/1.11/taskArtifacts/fileSnapshots.bin new file mode 100644 index 0000000000000000000000000000000000000000..32a162d36f4f846884104ec5e0bd2d6618f428a8 GIT binary patch literal 18571 zcmeI(FHeF&7y$5-jlyJOSV$&kW^?!n2w`JJ=eh0n{OawJVFp%|eyUf0{7+SZZ)0RjXF5FkK+009C72oNAZ zfB*pk1PBoLCj!YdHqy$Q>0LLn#s0JTn9M`ypT=!t`7pj&ysvKaGo!omCE@V=F}t{b zdMomiDqnkPc=?@u=XEmy0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5Fl_&f#fRQ){fCkvr*CwGD3;^-Slhc2D^23-V~ zE+S-ha?nYrIP?KZ&Gl4#gi`*2B;WTXL%!b{;|Ni@`Z)}7HlC;Rud|d80R#|0009IL zKmY**5I_I{1Q0*~0R#|0009L4iGX>qjpWm2N|o$yuwGmY&65!2f=x4{);725+`puE z?rO)MgyWvnFZJL$J!eG#0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_KdzaU_4?JJsg){>bqyXEK2ceVH?XE`x?txv+pmwu$& st|wJLkXpr$v2+9F_rh2Q?N~N!rSA2^NGDOt@!DaewCA3h8*kn}_F~6M_y7O^ literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..ea7d20d --- /dev/null +++ b/build.gradle @@ -0,0 +1,10 @@ +buildscript { + repositories { + } + + dependencies { + } +} + +ant.importBuild 'build.xml' +defaultTasks 'jar' diff --git a/build.xml b/build.xml index afa2eb6..87106ff 100644 --- a/build.xml +++ b/build.xml @@ -97,7 +97,6 @@ - diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/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/src/io/socket/IOConnection.java b/src/io/socket/IOConnection.java index 0febf78..032a698 100644 --- a/src/io/socket/IOConnection.java +++ b/src/io/socket/IOConnection.java @@ -75,6 +75,8 @@ class IOConnection implements IOCallback { /** The url for this connection. */ private URL url; + private String queryStr; + /** The transport for this connection. */ private IOTransport transport; @@ -220,6 +222,10 @@ public static SSLContext getSslContext() { return sslContext; } + static public IOConnection register(String origin, SocketIO socket) { + return register(origin, null, socket); + } + /** * Creates a new connection or returns the corresponding one. * @@ -229,7 +235,7 @@ public static SSLContext getSslContext() { * the socket * @return a IOConnection object */ - static public IOConnection register(String origin, SocketIO socket) { + static public IOConnection register(String origin, String queryStr, SocketIO socket) { List list = connections.get(origin); if (list == null) { list = new LinkedList(); @@ -243,7 +249,7 @@ static public IOConnection register(String origin, SocketIO socket) { } } - IOConnection connection = new IOConnection(origin, socket); + IOConnection connection = new IOConnection(origin, queryStr, socket); list.add(connection); return connection; } @@ -295,7 +301,13 @@ private void handshake() { URLConnection connection; try { setState(STATE_HANDSHAKE); - url = new URL(IOConnection.this.url.toString() + SOCKET_IO_1); + + if( queryStr != null ) { + url = new URL(IOConnection.this.url.toString() + SOCKET_IO_1 + "?" + queryStr ); + } else { + url = new URL(IOConnection.this.url.toString() + SOCKET_IO_1); + } + connection = url.openConnection(); if (connection instanceof HttpsURLConnection) { ((HttpsURLConnection) connection) @@ -395,6 +407,10 @@ private void synthesizeAck(IOMessage message, IOAcknowledge ack) { } } + private IOConnection(String url,SocketIO socket) { + this( url, null, socket ); + } + /** * Instantiates a new IOConnection. * @@ -403,9 +419,10 @@ private void synthesizeAck(IOMessage message, IOAcknowledge ack) { * @param socket * the socket */ - private IOConnection(String url, SocketIO socket) { + private IOConnection(String url, String query, SocketIO socket) { try { this.url = new URL(url); + this.queryStr = query; this.urlStr = url; } catch (MalformedURLException e) { throw new RuntimeException(e); diff --git a/src/io/socket/SocketIO.java b/src/io/socket/SocketIO.java index 26143b7..17c2730 100644 --- a/src/io/socket/SocketIO.java +++ b/src/io/socket/SocketIO.java @@ -189,7 +189,11 @@ else if (this.url == null) } } - /** + private boolean setAndConnect(URL url, IOCallback callback) { + return setAndConnect(url, url.getQuery(), callback); + } + + /** * Sets url and callback and initiates connecting if both are present * * @param url @@ -198,7 +202,7 @@ else if (this.url == null) * the callback * @return true if connecting has been initiated, false if not */ - private boolean setAndConnect(URL url, IOCallback callback) { + private boolean setAndConnect(URL url, String query, IOCallback callback) { if(this.connection != null) throw new RuntimeException("You can connect your SocketIO instance only once. Use a fresh instance instead."); if ((this.url != null && url != null) @@ -217,7 +221,7 @@ private boolean setAndConnect(URL url, IOCallback callback) { if (this.namespace.equals("/")) { this.namespace = ""; } - this.connection = IOConnection.register(origin, this); + this.connection = IOConnection.register(origin, query, this); return true; } return false; From e47dca26de84dd7d67d194d4dcac2f1de67bd0e2 Mon Sep 17 00:00:00 2001 From: Takuya Fujii Date: Thu, 29 May 2014 03:35:14 +0900 Subject: [PATCH 02/10] Fix BUG --- src/io/socket/SocketIO.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/io/socket/SocketIO.java b/src/io/socket/SocketIO.java index 17c2730..441e7ee 100644 --- a/src/io/socket/SocketIO.java +++ b/src/io/socket/SocketIO.java @@ -190,7 +190,8 @@ else if (this.url == null) } private boolean setAndConnect(URL url, IOCallback callback) { - return setAndConnect(url, url.getQuery(), callback); + String query = url != null ? url.getQuery() : null; + return setAndConnect(url, query, callback); } /** From e90046358bc155b23800081e2355872ccae03286 Mon Sep 17 00:00:00 2001 From: Takuya Fujii Date: Thu, 29 May 2014 16:36:08 +0900 Subject: [PATCH 03/10] Customize --- .gitignore | 1 + build.gradle | 24 +++++++++++++++++++++++- src/io/socket/IOConnection.java | 9 +++++++-- src/io/socket/SocketIO.java | 24 ++++++++++++++++++++---- src/io/socket/WebsocketTransport.java | 15 +++++++++++---- src/io/socket/XhrTransport.java | 4 ++-- 6 files changed, 64 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index cded08d..3e7ab8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ bin/ jar/ +build/ *.iml .idea/* \ No newline at end of file diff --git a/build.gradle b/build.gradle index ea7d20d..2850de3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,6 @@ +apply plugin: 'java' +version = 2.0 + buildscript { repositories { } @@ -6,5 +9,24 @@ buildscript { } } -ant.importBuild 'build.xml' +repositories { +} + +dependencies { + compile fileTree('libs') +} + +sourceSets { + main { + java { + srcDir 'src' + } + } +} + defaultTasks 'jar' + +compileJava.destinationDir = file('bin') + +jar.destinationDir = file("jar") +jar.from file("bin") diff --git a/src/io/socket/IOConnection.java b/src/io/socket/IOConnection.java index 032a698..c7d560f 100644 --- a/src/io/socket/IOConnection.java +++ b/src/io/socket/IOConnection.java @@ -308,6 +308,8 @@ private void handshake() { url = new URL(IOConnection.this.url.toString() + SOCKET_IO_1); } + logger.info( "handshake url: " + url ); + connection = url.openConnection(); if (connection instanceof HttpsURLConnection) { ((HttpsURLConnection) connection) @@ -330,6 +332,8 @@ private void handshake() { heartbeatTimeout = Long.parseLong(data[1]) * 1000; closingTimeout = Long.parseLong(data[2]) * 1000; protocols = Arrays.asList(data[3].split(",")); + + logger.info( "handshake done: " + response ); } catch (Exception e) { error(new SocketIOException("Error while handshaking", e)); } @@ -343,14 +347,15 @@ private synchronized void connectTransport() { return; setState(STATE_CONNECTING); if (protocols.contains(WebsocketTransport.TRANSPORT_NAME)) - transport = WebsocketTransport.create(url, this); + transport = WebsocketTransport.create(url, queryStr, this); else if (protocols.contains(XhrTransport.TRANSPORT_NAME)) - transport = XhrTransport.create(url, this); + transport = XhrTransport.create(url, queryStr, this); else { error(new SocketIOException( "Server supports no available transports. You should reconfigure the server to support a available transport")); return; } + logger.info( "transport: " + transport.getName() + ", state: " + String.valueOf(getState()) ); transport.connect(); } diff --git a/src/io/socket/SocketIO.java b/src/io/socket/SocketIO.java index 441e7ee..6d695b3 100644 --- a/src/io/socket/SocketIO.java +++ b/src/io/socket/SocketIO.java @@ -36,6 +36,8 @@ public class SocketIO { private URL url; + private String query; + /** * Instantiates a new socket.io connection. The object connects after * calling {@link #connect(URL, IOCallback)} or @@ -54,12 +56,16 @@ public SocketIO() { * @throws MalformedURLException * the malformed url exception */ - public SocketIO(final String url) throws MalformedURLException { + public SocketIO(final String url, String query) throws MalformedURLException { if (url == null) throw new RuntimeException("url may not be null."); - setAndConnect(new URL(url), null); + setAndConnect(new URL(url), query, null); } + public SocketIO(final String url) throws MalformedURLException { + this(url, (String)null); + } + /** * Instantiates a new socket.io connection and sets the request headers used * while connecting the first time for authorizing. The object connects @@ -123,7 +129,12 @@ public SocketIO(final URL url, final IOCallback callback) { public SocketIO(final URL url) { setAndConnect(url, null); } - + + + public SocketIO(final URL url, final String query) { + setAndConnect(url, query, null); + } + /** * Set the socket factory used for SSL connections. * @param socketFactory @@ -212,6 +223,11 @@ private boolean setAndConnect(URL url, String query, IOCallback callback) { if (url != null) { this.url = url; } + + if (query != null) { + this.query = query; + } + if (callback != null) { this.callback = callback; } @@ -222,7 +238,7 @@ private boolean setAndConnect(URL url, String query, IOCallback callback) { if (this.namespace.equals("/")) { this.namespace = ""; } - this.connection = IOConnection.register(origin, query, this); + this.connection = IOConnection.register(origin, this.query, this); return true; } return false; diff --git a/src/io/socket/WebsocketTransport.java b/src/io/socket/WebsocketTransport.java index 0ec9bee..f12aaef 100644 --- a/src/io/socket/WebsocketTransport.java +++ b/src/io/socket/WebsocketTransport.java @@ -1,8 +1,10 @@ package io.socket; import java.io.IOException; +import java.lang.String; import java.net.URI; import java.net.URL; +import java.util.logging.Logger; import java.util.regex.Pattern; import javax.net.ssl.SSLContext; @@ -13,15 +15,17 @@ import org.java_websocket.handshake.ServerHandshake; class WebsocketTransport extends WebSocketClient implements IOTransport { + static final Logger logger = Logger.getLogger("io.socket"); + private final static Pattern PATTERN_HTTP = Pattern.compile("^http"); public static final String TRANSPORT_NAME = "websocket"; private IOConnection connection; - public static IOTransport create(URL url, IOConnection connection) { + public static IOTransport create(URL url, String query, IOConnection connection) { URI uri = URI.create( PATTERN_HTTP.matcher(url.toString()).replaceFirst("ws") + IOConnection.SOCKET_IO_1 + TRANSPORT_NAME - + "/" + connection.getSessionId()); - + + "/" + connection.getSessionId() + "?" + query); + logger.info( "websocket uri:" + uri.toString() ); return new WebsocketTransport(uri, connection); } @@ -72,18 +76,21 @@ public void invalidate() { @Override public void onClose(int code, String reason, boolean remote) { + logger.info( "onClose: code=" + String.valueOf(code) + ", reason=" + reason + ", remote=" + String.valueOf(remote)); if(connection != null) connection.transportDisconnected(); } @Override public void onMessage(String text) { + logger.info( "onMessage: " + text ); if(connection != null) connection.transportMessage(text); } @Override public void onOpen(ServerHandshake handshakedata) { + logger.info("onOpen: "); if(connection != null) connection.transportConnected(); } @@ -96,6 +103,6 @@ public String getName() { @Override public void onError(Exception ex) { // TODO Auto-generated method stub - + logger.warning( "onError: " + ex.toString() ); } } \ No newline at end of file diff --git a/src/io/socket/XhrTransport.java b/src/io/socket/XhrTransport.java index 1b03cb4..d83e188 100644 --- a/src/io/socket/XhrTransport.java +++ b/src/io/socket/XhrTransport.java @@ -141,10 +141,10 @@ public void run() { * the connection * @return the iO transport */ - public static IOTransport create(URL url, IOConnection connection) { + public static IOTransport create(URL url, String query, IOConnection connection) { try { URL xhrUrl = new URL(url.toString() + IOConnection.SOCKET_IO_1 - + TRANSPORT_NAME + "/" + connection.getSessionId()); + + TRANSPORT_NAME + "/" + connection.getSessionId() + "?" + query ); return new XhrTransport(xhrUrl, connection); } catch (MalformedURLException e) { throw new RuntimeException( From 7b4ea53dd26279e8736539ddd4a181bca3f40f99 Mon Sep 17 00:00:00 2001 From: Takuya Fujii Date: Thu, 29 May 2014 17:15:34 +0900 Subject: [PATCH 04/10] Fix build gradle --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2850de3..b638cab 100644 --- a/build.gradle +++ b/build.gradle @@ -10,10 +10,12 @@ buildscript { } repositories { + mavenCentral() } dependencies { - compile fileTree('libs') + compile 'org.json:json:20140107@jar' + compile 'org.java-websocket:Java-WebSocket:1.3.0@jar' } sourceSets { From 9763d62ad3d073cb6a962a4ac11e6c16f1f16d90 Mon Sep 17 00:00:00 2001 From: Takuya Fujii Date: Tue, 3 Jun 2014 22:11:33 +0900 Subject: [PATCH 05/10] add gradlew --- .gradle/1.11/taskArtifacts/cache.properties | 1 - .../1.11/taskArtifacts/cache.properties.lock | Bin 17 -> 0 bytes .gradle/1.4/taskArtifacts/cache.properties | 1 + .../1.4/taskArtifacts/cache.properties.lock | 1 + .gradle/1.4/taskArtifacts/fileHashes.bin | Bin 0 -> 20096 bytes .gradle/1.4/taskArtifacts/fileSnapshots.bin | Bin 0 -> 24395 bytes .../taskArtifacts/outputFileStates.bin} | Bin 18571 -> 18824 bytes .../taskArtifacts/taskArtifacts.bin | Bin 18614 -> 21028 bytes build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45336 bytes gradle/wrapper/gradle-wrapper.properties | 6 ++++++ gradlew | 10 +++++----- 12 files changed, 14 insertions(+), 7 deletions(-) delete mode 100644 .gradle/1.11/taskArtifacts/cache.properties delete mode 100644 .gradle/1.11/taskArtifacts/cache.properties.lock create mode 100644 .gradle/1.4/taskArtifacts/cache.properties create mode 100644 .gradle/1.4/taskArtifacts/cache.properties.lock create mode 100644 .gradle/1.4/taskArtifacts/fileHashes.bin create mode 100644 .gradle/1.4/taskArtifacts/fileSnapshots.bin rename .gradle/{1.11/taskArtifacts/fileSnapshots.bin => 1.4/taskArtifacts/outputFileStates.bin} (97%) rename .gradle/{1.11 => 1.4}/taskArtifacts/taskArtifacts.bin (87%) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties diff --git a/.gradle/1.11/taskArtifacts/cache.properties b/.gradle/1.11/taskArtifacts/cache.properties deleted file mode 100644 index 5c9bcfc..0000000 --- a/.gradle/1.11/taskArtifacts/cache.properties +++ /dev/null @@ -1 +0,0 @@ -#Wed May 28 22:27:36 JST 2014 diff --git a/.gradle/1.11/taskArtifacts/cache.properties.lock b/.gradle/1.11/taskArtifacts/cache.properties.lock deleted file mode 100644 index 7935d626860007ad1723eb8d2e2102d1aa4a4869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZQ>P%{4OD!SE`0RlJxCyxU% diff --git a/.gradle/1.4/taskArtifacts/cache.properties b/.gradle/1.4/taskArtifacts/cache.properties new file mode 100644 index 0000000..aa667b8 --- /dev/null +++ b/.gradle/1.4/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Tue Jun 03 22:09:37 JST 2014 diff --git a/.gradle/1.4/taskArtifacts/cache.properties.lock b/.gradle/1.4/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000..40fdece --- /dev/null +++ b/.gradle/1.4/taskArtifacts/cache.properties.lock @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.gradle/1.4/taskArtifacts/fileHashes.bin b/.gradle/1.4/taskArtifacts/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..d2fff9558b64e59ae30b7f16313e14fe5323bc27 GIT binary patch literal 20096 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 v&YRA>Q@5(n(cK)=(3?0b literal 0 HcmV?d00001 diff --git a/.gradle/1.11/taskArtifacts/fileSnapshots.bin b/.gradle/1.4/taskArtifacts/outputFileStates.bin similarity index 97% rename from .gradle/1.11/taskArtifacts/fileSnapshots.bin rename to .gradle/1.4/taskArtifacts/outputFileStates.bin index 32a162d36f4f846884104ec5e0bd2d6618f428a8..4f0a796d72634360325155abf9deb8435c43452e 100644 GIT binary patch literal 18824 zcmeI(ze~eF6u|K_l0`*2NkK$G=OPqbgy`T7^-pgyovJky3 z*0k}|*nfXk4lbOW(20AK@K(*utai$WPJFn_jZd{-2P;nlN-aO)#@)9a|4=rMopqiF zAbhsf4ZN0GF(Y#ejTfZHo7H3y(U-rUxWqZ%1!M2cBb#|q^`PFk&wCm(Ek#Vo; SluMV{&oeV;*U>l5Z+-v`Wv@p7 delta 119 zcmeB}%-B7Vaf7{tBGZmyPp|roI};edz$5!V478t5QORvxHn~DVhNb6c%A1Xff5kT% sTo#`k;K6Ff3slVt!i*4o3=AGeudAIg2J(b}m2Pm1@BrDw5gQ)*wVMX|^$mYg3wd=|$hpyzIVY_Pz1V zn`Aa%(Sr&Ww3b#W=uuC-ic&C81&gpADk$hh1ra?ccq-^YfA7uCW>;fqp?Z+t!0gPt zfAjr)et+I!nP!QQ!NMP{gLE8ke)#FH9gld61dsp{Kmter2_OL^fCP{L5*zV+KbYd-L6wy=R&$gbeS1N9WvH&s8T`&8K5dT+04Q zc>Vm?q4(bXSWfQT}}Je8;{JV{rHOnkN^@u0!RP}AOR$R1dsp{Kmter2_OL^ zfCP{L55UYbm#XSk74-w=(vZ7cXr=@WT(3q&mHA9FPje~U3F_6@G3qTb zf1XB5Q#{gAHBPZmM%>&T>}VZ%^yTQM`i(0N$(6}YPl^RzjTJTPM4A-Ji*%V5W6gtN z8I~DMLJ%@w8eP-qjw?kQrYCvf^Zl2u(YNy?H%)pXzRHpih~-v#;I|JZoxW}A%XGD2 zEI6Jp4@5{YUj6;TJ8SzU9O9J89xlRIPx638bApCZP3mdCZAk#6ie)LPqh)fJjP>7# zK1lv)DSKZz|LW1T>)RZXFOywX%1I?drZi{3b5{q?Cus;Gws(l=?w?~C z`tQ(S=|n&yn7uolZEcv-ih~u_AN}k8n4(b)7Vh2p_0^B}K65=!oJrCbNa{~g4_rSD z>(vwkD1o1ZkB!-w9$eW5*8_0&YqC#<*7vT@DsgqT_28uf9{39rqb+hhSq}lXTk4ph z$(>ybK>(yGjd=H%lmVmSvjgh+FW&m?7l^&nq<5JHF$7Hxe3eaYt*k-~&T2_viDn`K zua~%rprb9A3onR$HUqJFDi)g8S!8_KPc*qZo4g>^(rmX)hc>loa(#j(_hrj;v9S+j zw#))h)0WPJCw=e`wB3_U>wNp-a(!G?BP-E<_LC+`(y@e@R)<7tn{n?(3o)Aov=T6Q z)qtj|%Jc+y1X8%d1FjpI?8y~!X6v!pviur`9 z&`L{ZaVNl49#k%V%nT`q@AvJ80vX95O64JBi@Fh1siU-VhXgbyBW z40)#1g3}If3dzJ|3)Isk=1Hip%m>4E+QhXfVQbRa@6R<~yZ;-=hnXxN6e+9^IuX|^ zOucmZ;{NRyzC8;clGz#y){~rNJZx^^a1!(T)klvnnvEp?9GtN^aU<#425}>S&G0sE zBs=UzQZTW1t7!|x;fb41!$qn#PUxY-?yw8JkdYggtx7EX0LrpEL)E{Oig}xgyA1_6 LdTc5>b@Ah$u=SVV delta 139 zcmZ3ogmK$M#trrooQ!SpuQ?y2dC#7lAR)uTR#K_3QSq<%MuXSllLI_hk{BWw7#IRT znDNZpJFj&AI*TpSJI=|_wjgL%eo?w!dQoCZPO4sFL8e|wVsUn{UP@+SdR~5UNoI1f iUIM|t& diff --git a/build.gradle b/build.gradle index b638cab..9a43b73 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ repositories { dependencies { compile 'org.json:json:20140107@jar' - compile 'org.java-websocket:Java-WebSocket:1.3.0@jar' + compile fileTree(dir: 'libs', include: 'WebSocket.jar' ) } sourceSets { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cf8ca39e94d65e8ecb49956e8e2e0643308f00e6 GIT binary patch literal 45336 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3d698f8 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Feb 13 00:13:35 GMT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.4-bin.zip diff --git a/gradlew b/gradlew index 91a7e26..ae91ed9 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash ############################################################################## ## @@ -61,9 +61,9 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -101,13 +101,13 @@ if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + warn "Could not query businessSystem 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\"" + JAVA_OPTS="$JAVA_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin, switch paths to Windows format before running java From 1181b5277c5b056a4ba7dfa0ee8868c175f96481 Mon Sep 17 00:00:00 2001 From: Takuya Fujii Date: Tue, 3 Jun 2014 22:52:54 +0900 Subject: [PATCH 06/10] Upgrade jar --- .gitignore | 3 +- .gradle/1.4/taskArtifacts/cache.properties | 1 - .../1.4/taskArtifacts/cache.properties.lock | 1 - .gradle/1.4/taskArtifacts/fileHashes.bin | Bin 20096 -> 0 bytes .gradle/1.4/taskArtifacts/fileSnapshots.bin | Bin 24395 -> 0 bytes .../1.4/taskArtifacts/outputFileStates.bin | Bin 18824 -> 0 bytes .gradle/1.4/taskArtifacts/taskArtifacts.bin | Bin 21028 -> 0 bytes build.gradle | 2 +- build.xml | 104 ------------------ libs/Java-WebSocket-1.3.1-SNAPSHOT.jar | Bin 0 -> 99339 bytes libs/WebSocket.jar | Bin 93556 -> 0 bytes src/io/socket/WebsocketTransport.java | 9 +- 12 files changed, 10 insertions(+), 110 deletions(-) delete mode 100644 .gradle/1.4/taskArtifacts/cache.properties delete mode 100644 .gradle/1.4/taskArtifacts/cache.properties.lock delete mode 100644 .gradle/1.4/taskArtifacts/fileHashes.bin delete mode 100644 .gradle/1.4/taskArtifacts/fileSnapshots.bin delete mode 100644 .gradle/1.4/taskArtifacts/outputFileStates.bin delete mode 100644 .gradle/1.4/taskArtifacts/taskArtifacts.bin delete mode 100644 build.xml create mode 100644 libs/Java-WebSocket-1.3.1-SNAPSHOT.jar delete mode 100644 libs/WebSocket.jar diff --git a/.gitignore b/.gitignore index 3e7ab8e..b7db714 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ bin/ jar/ build/ *.iml -.idea/* \ No newline at end of file +.idea/* +.gradle/ \ No newline at end of file diff --git a/.gradle/1.4/taskArtifacts/cache.properties b/.gradle/1.4/taskArtifacts/cache.properties deleted file mode 100644 index aa667b8..0000000 --- a/.gradle/1.4/taskArtifacts/cache.properties +++ /dev/null @@ -1 +0,0 @@ -#Tue Jun 03 22:09:37 JST 2014 diff --git a/.gradle/1.4/taskArtifacts/cache.properties.lock b/.gradle/1.4/taskArtifacts/cache.properties.lock deleted file mode 100644 index 40fdece..0000000 --- a/.gradle/1.4/taskArtifacts/cache.properties.lock +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/.gradle/1.4/taskArtifacts/fileHashes.bin b/.gradle/1.4/taskArtifacts/fileHashes.bin deleted file mode 100644 index d2fff9558b64e59ae30b7f16313e14fe5323bc27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20096 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 v&YRA>Q@5(n(cK)=(3?0b diff --git a/.gradle/1.4/taskArtifacts/outputFileStates.bin b/.gradle/1.4/taskArtifacts/outputFileStates.bin deleted file mode 100644 index 4f0a796d72634360325155abf9deb8435c43452e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18824 zcmeI(ze~eF6u|K_l0`*2NkK$G=OPqbgy`T7^-pgyovJky3 z*0k}|*nfXk4lbOW(20AK@K(*utai$WPJFn_jZd{-2P;nlN-aO)#@)9a|4=rMopqiF zAbhsf4ZN0GF(Y#ejTfZHo7H3y(U-rUxWqZ%1!M2cBb#|q^`PFk&wCm(Ek#Vo; SluMV{&oeV;*U>l5Z+-v`Wv@p7 diff --git a/.gradle/1.4/taskArtifacts/taskArtifacts.bin b/.gradle/1.4/taskArtifacts/taskArtifacts.bin deleted file mode 100644 index 4b92f311afda770725e470cc8f5b9b79e5e652ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21028 zcmeI3PiP!f9LL|zCT&e?yJ>2Pm1@BrDw5gQ)*wVMX|^$mYg3wd=|$hpyzIVY_Pz1V zn`Aa%(Sr&Ww3b#W=uuC-ic&C81&gpADk$hh1ra?ccq-^YfA7uCW>;fqp?Z+t!0gPt zfAjr)et+I!nP!QQ!NMP{gLE8ke)#FH9gld61dsp{Kmter2_OL^fCP{L5*zV+KbYd-L6wy=R&$gbeS1N9WvH&s8T`&8K5dT+04Q zc>Vm?q4(bXSWfQT}}Je8;{JV{rHOnkN^@u0!RP}AOR$R1dsp{Kmter2_OL^ zfCP{L55UYbm#XSk74-w=(vZ7cXr=@WT(3q&mHA9FPje~U3F_6@G3qTb zf1XB5Q#{gAHBPZmM%>&T>}VZ%^yTQM`i(0N$(6}YPl^RzjTJTPM4A-Ji*%V5W6gtN z8I~DMLJ%@w8eP-qjw?kQrYCvf^Zl2u(YNy?H%)pXzRHpih~-v#;I|JZoxW}A%XGD2 zEI6Jp4@5{YUj6;TJ8SzU9O9J89xlRIPx638bApCZP3mdCZAk#6ie)LPqh)fJjP>7# zK1lv)DSKZz|LW1T>)RZXFOywX%1I?drZi{3b5{q?Cus;Gws(l=?w?~C z`tQ(S=|n&yn7uolZEcv-ih~u_AN}k8n4(b)7Vh2p_0^B}K65=!oJrCbNa{~g4_rSD z>(vwkD1o1ZkB!-w9$eW5*8_0&YqC#<*7vT@DsgqT_28uf9{39rqb+hhSq}lXTk4ph z$(>ybK>(yGjd=H%lmVmSvjgh+FW&m?7l^&nq<5JHF$7Hxe3eaYt*k-~&T2_viDn`K zua~%rprb9A3onR$HUqJFDi)g8S!8_KPc*qZo4g>^(rmX)hc>loa(#j(_hrj;v9S+j zw#))h)0WPJCw=e`wB3_U>wNp-a(!G?BP-E<_LC+`(y@e@R)<7tn{n?(3o)Aov=T6Q z)qtj|%Jc+y1X8%d1FjpI?8y~!X6v!pviur`9 z&`L{ZaVNl49#k%V%nT`q@AvJ80vX95O64JBi@Fh1siU-VhXgbyBW z40)#1g3}If3dzJ|3)Isk=1Hip%m>4E+QhXfVQbRa@6R<~yZ;-=hnXxN6e+9^IuX|^ zOucmZ;{NRyzC8;clGz#y){~rNJZx^^a1!(T)klvnnvEp?9GtN^aU<#425}>S&G0sE zBs=UzQZTW1t7!|x;fb41!$qn#PUxY-?yw8JkdYggtx7EX0LrpEL)E{Oig}xgyA1_6 LdTc5>b@Ah$u=SVV diff --git a/build.gradle b/build.gradle index 9a43b73..4201c93 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ repositories { dependencies { compile 'org.json:json:20140107@jar' - compile fileTree(dir: 'libs', include: 'WebSocket.jar' ) + compile fileTree(dir: 'libs', include: 'Java-WebSocket-1.3.1-SNAPSHOT.jar' ) } sourceSets { diff --git a/build.xml b/build.xml deleted file mode 100644 index 87106ff..0000000 --- a/build.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/Java-WebSocket-1.3.1-SNAPSHOT.jar b/libs/Java-WebSocket-1.3.1-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..7e70a4774d7368d27ebd71563895e19a87311bd2 GIT binary patch literal 99339 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 NAt9mJ0z)R!{{h_ezuy1= literal 0 HcmV?d00001 diff --git a/libs/WebSocket.jar b/libs/WebSocket.jar deleted file mode 100644 index ef3637901d8f12bdc1fa8c30808082d7b82a327e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93556 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

*dje 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 z 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 Date: Fri, 23 Mar 2018 12:17:10 +0900 Subject: [PATCH 07/10] gradle versionup --- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- libs/json-org.jar | Bin 36480 -> 0 bytes 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 libs/json-org.jar diff --git a/build.gradle b/build.gradle index 4201c93..4657115 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ repositories { } dependencies { - compile 'org.json:json:20140107@jar' - compile fileTree(dir: 'libs', include: 'Java-WebSocket-1.3.1-SNAPSHOT.jar' ) + implementation 'org.json:json:20180130@jar' + implementation fileTree(dir: 'libs', include: 'Java-WebSocket-1.3.1-SNAPSHOT.jar' ) } sourceSets { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3d698f8..47bb3be 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Feb 13 00:13:35 GMT 2013 +#Thu Mar 22 16:18:29 JST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip diff --git a/libs/json-org.jar b/libs/json-org.jar deleted file mode 100644 index 3e53d2e59eef2ba27599242fbbd5ef4e3b4d9d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36480 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%0A(%ttmqfH_sst#@H{`7{!jNcH9rW9!T&{+yp| zs#V<&ytM*=bz6$S8md=w~b-^F&`lNg+DdRU507_ z+igOpFPl`-{n`z{GyN9Lf`)rUw-0B?dY7}3*Dh;+J7iZQ@3={8 z+PBwg*X8`a9$92~X|;*)zaxgWSJy7h?NE8Gz3cG*ryN_>e)!KJQu+VVigW(vfBIJ( ziVcd7+3_b!wf4@zO$+uL-#G7=-(a%Ks{NORn8ZuowofN>kCv$l6~<2fDY~nA$@YTh zdUGfLuwwsyK`p)G(>EoJ|NeLS&ezsPN z;bgUB_KW@3_Ubi%RVk@ulU`y{d~>_%-i54JinhNlvof=&<4SE#=G$7vB6+PiYj3qO z?_x35n~h$#*fmaQa(xoW`gtYy;Ngsin=hR@zOFz2Zk|nBqFs6QOjU2muTNS9k4FSc zJd9C0bGl(_7P4m=tZWQre9J_r}OXRJ{Z<|Xt^lUz%FPF5l`RIpT=AOrb zp0nOL@F?--nIh%W(|+#iQ_b8RT6OK}`Lz4-2e$oW+O#}nR?h707v4rU=_Vv|-?+hK zwymKTnW=EuXPwP-+vpqjoFn{y>pZnPuQDsu%C=oY{-I_}!md3hOe#5#|M+vaJG{_7 z?r?L(ThY~SwrtJ%3Cd}~*K$s|?|H|z^JH9kvftFCE|Hx9pH4Y!%xk|h^Na4h zlW*1+Z$BIJ?fK7)`;QdQc4o9kElK$ma%;{Zv*jDkW}bRxvQ_EmvK+s}*}*rSsk~+` zs|~mo6!tngt~~hN7FpdB)m(D7?g!p0*L+_+<@@(3-}(3O{__Z^KNR?fRsEygyTkD> zf1A%+%U{v=&oA@;LHo}CM~r`%|6fqs!7cJdRB?i!>W_sQM@0kM=5vVO6V$5H40{-! zWLl@a>chGfg0_pozI0m|YUBwhZmjg=(%9qk`_1qFEv11>%+oLKSs%5N*(j{<{BKL=j(=Sc>&P!v==MV zegZdNRPrz|fJU_t;24mZUzDz&Rh*xv@9Y8{<3iVud`Y?}LNk!{pAA`metvdlDrDOR zx)I2iLxY+z2(T6CD1;NhMj-B1M>huf3Rcif(nvr6$r!}F(&z>tU$O~0-UR_30>c*W z4v+yTtt)hMkZ(%??ejta2XQ2G&@SjiHwF2!575mj2(Vuj%@nkIR?tmCzEcBqXb=Lp zsiT>MdQ}LzLCA+-p+=OZ23CWx$2aonOrR695a6H#R%28U=Vzfi3HhibR43&-p_zqz zx)ZuF$Y=hb29cgKR%2k>yU`6o-Z74vhSs>C8H6_tA@3qY_1AVkG;@%5o1;4id3zOV zQhXhPWDME{M08V-$HY-{mShB)DcEBixeJ3@$gC Date: Tue, 31 Mar 2020 15:58:25 +0900 Subject: [PATCH 08/10] Updated websocket and json jars used in socket.io. --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 4657115..e4605ff 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ repositories { } dependencies { - implementation 'org.json:json:20180130@jar' - implementation fileTree(dir: 'libs', include: 'Java-WebSocket-1.3.1-SNAPSHOT.jar' ) + implementation 'org.json:json:20190722' + implementation 'org.java-websocket:Java-WebSocket:1.4.1' } sourceSets { From 5807adf8bbbcdf74e0bc5c615720cfc72256cd92 Mon Sep 17 00:00:00 2001 From: junya Date: Mon, 1 Jun 2020 02:50:33 +0900 Subject: [PATCH 09/10] Downgraded a java websocket. --- build.gradle | 4 ++-- libs/Java-WebSocket-1.3.1-SNAPSHOT.jar | Bin 99339 -> 0 bytes libs/java-websocket-1.3.1.jar | Bin 0 -> 167042 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 libs/Java-WebSocket-1.3.1-SNAPSHOT.jar create mode 100644 libs/java-websocket-1.3.1.jar diff --git a/build.gradle b/build.gradle index e4605ff..e7b0fa4 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ repositories { } dependencies { - implementation 'org.json:json:20190722' - implementation 'org.java-websocket:Java-WebSocket:1.4.1' + implementation 'org.json:json:20190722@jar' + implementation fileTree(dir: 'libs', include: 'java-websocket-1.3.1.jar' ) } sourceSets { diff --git a/libs/Java-WebSocket-1.3.1-SNAPSHOT.jar b/libs/Java-WebSocket-1.3.1-SNAPSHOT.jar deleted file mode 100644 index 7e70a4774d7368d27ebd71563895e19a87311bd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99339 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 NAt9mJ0z)R!{{h_ezuy1= diff --git a/libs/java-websocket-1.3.1.jar b/libs/java-websocket-1.3.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3c9279f7cd59cf12fff8b8af0600d2f0fa786de GIT binary patch literal 167042 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 VxcSIC=Etb5IS~LoXvDtC`3F=`lr{hW literal 0 HcmV?d00001 From 1812f34bfa5c37452fc7dfabe93ac77c50d84c1a Mon Sep 17 00:00:00 2001 From: junya Date: Mon, 1 Jun 2020 04:14:35 +0900 Subject: [PATCH 10/10] Removed the jar and add the source --- build.gradle | 1 - libs/java-websocket-1.3.1.jar | Bin 167042 -> 0 bytes .../AbstractWrappedByteChannel.java | 75 + src/org/java_websocket/SSLSocketChannel2.java | 385 +++ .../java_websocket/SocketChannelIOHelper.java | 70 + src/org/java_websocket/WebSocket.java | 123 + src/org/java_websocket/WebSocketAdapter.java | 99 + src/org/java_websocket/WebSocketFactory.java | 12 + src/org/java_websocket/WebSocketImpl.java | 734 ++++++ src/org/java_websocket/WebSocketListener.java | 151 ++ .../java_websocket/WrappedByteChannel.java | 26 + .../client/AbstractClientProxyChannel.java | 38 + .../client/WebSocketClient.java | 454 ++++ src/org/java_websocket/drafts/Draft.java | 228 ++ src/org/java_websocket/drafts/Draft_10.java | 387 +++ src/org/java_websocket/drafts/Draft_17.java | 28 + src/org/java_websocket/drafts/Draft_75.java | 206 ++ src/org/java_websocket/drafts/Draft_76.java | 242 ++ .../IncompleteHandshakeException.java | 45 + .../exceptions/InvalidDataException.java | 70 + .../exceptions/InvalidFrameException.java | 57 + .../exceptions/InvalidHandshakeException.java | 58 + .../exceptions/LimitExedeedException.java | 35 + .../exceptions/NotSendableException.java | 48 + .../WebsocketNotConnectedException.java | 19 + .../java_websocket/framing/CloseFrame.java | 98 + .../framing/CloseFrameBuilder.java | 123 + .../java_websocket/framing/FrameBuilder.java | 17 + src/org/java_websocket/framing/Framedata.java | 17 + .../framing/FramedataImpl1.java | 110 + .../handshake/ClientHandshake.java | 6 + .../handshake/ClientHandshakeBuilder.java | 5 + .../handshake/HandshakeBuilder.java | 6 + .../handshake/HandshakeImpl1Client.java | 18 + .../handshake/HandshakeImpl1Server.java | 29 + .../handshake/Handshakedata.java | 10 + .../handshake/HandshakedataImpl1.java | 60 + .../handshake/ServerHandshake.java | 6 + .../handshake/ServerHandshakeBuilder.java | 6 + .../DefaultSSLWebSocketServerFactory.java | 55 + .../server/DefaultWebSocketServerFactory.java | 29 + .../server/WebSocketServer.java | 765 ++++++ src/org/java_websocket/util/Base64.java | 2065 +++++++++++++++++ .../java_websocket/util/Charsetfunctions.java | 90 + 44 files changed, 7105 insertions(+), 1 deletion(-) delete mode 100644 libs/java-websocket-1.3.1.jar create mode 100644 src/org/java_websocket/AbstractWrappedByteChannel.java create mode 100644 src/org/java_websocket/SSLSocketChannel2.java create mode 100644 src/org/java_websocket/SocketChannelIOHelper.java create mode 100644 src/org/java_websocket/WebSocket.java create mode 100644 src/org/java_websocket/WebSocketAdapter.java create mode 100644 src/org/java_websocket/WebSocketFactory.java create mode 100644 src/org/java_websocket/WebSocketImpl.java create mode 100644 src/org/java_websocket/WebSocketListener.java create mode 100644 src/org/java_websocket/WrappedByteChannel.java create mode 100644 src/org/java_websocket/client/AbstractClientProxyChannel.java create mode 100644 src/org/java_websocket/client/WebSocketClient.java create mode 100644 src/org/java_websocket/drafts/Draft.java create mode 100644 src/org/java_websocket/drafts/Draft_10.java create mode 100644 src/org/java_websocket/drafts/Draft_17.java create mode 100644 src/org/java_websocket/drafts/Draft_75.java create mode 100644 src/org/java_websocket/drafts/Draft_76.java create mode 100644 src/org/java_websocket/exceptions/IncompleteHandshakeException.java create mode 100644 src/org/java_websocket/exceptions/InvalidDataException.java create mode 100644 src/org/java_websocket/exceptions/InvalidFrameException.java create mode 100644 src/org/java_websocket/exceptions/InvalidHandshakeException.java create mode 100644 src/org/java_websocket/exceptions/LimitExedeedException.java create mode 100644 src/org/java_websocket/exceptions/NotSendableException.java create mode 100644 src/org/java_websocket/exceptions/WebsocketNotConnectedException.java create mode 100644 src/org/java_websocket/framing/CloseFrame.java create mode 100644 src/org/java_websocket/framing/CloseFrameBuilder.java create mode 100644 src/org/java_websocket/framing/FrameBuilder.java create mode 100644 src/org/java_websocket/framing/Framedata.java create mode 100644 src/org/java_websocket/framing/FramedataImpl1.java create mode 100644 src/org/java_websocket/handshake/ClientHandshake.java create mode 100644 src/org/java_websocket/handshake/ClientHandshakeBuilder.java create mode 100644 src/org/java_websocket/handshake/HandshakeBuilder.java create mode 100644 src/org/java_websocket/handshake/HandshakeImpl1Client.java create mode 100644 src/org/java_websocket/handshake/HandshakeImpl1Server.java create mode 100644 src/org/java_websocket/handshake/Handshakedata.java create mode 100644 src/org/java_websocket/handshake/HandshakedataImpl1.java create mode 100644 src/org/java_websocket/handshake/ServerHandshake.java create mode 100644 src/org/java_websocket/handshake/ServerHandshakeBuilder.java create mode 100644 src/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java create mode 100644 src/org/java_websocket/server/DefaultWebSocketServerFactory.java create mode 100644 src/org/java_websocket/server/WebSocketServer.java create mode 100644 src/org/java_websocket/util/Base64.java create mode 100644 src/org/java_websocket/util/Charsetfunctions.java diff --git a/build.gradle b/build.gradle index e7b0fa4..dca82d6 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,6 @@ repositories { dependencies { implementation 'org.json:json:20190722@jar' - implementation fileTree(dir: 'libs', include: 'java-websocket-1.3.1.jar' ) } sourceSets { diff --git a/libs/java-websocket-1.3.1.jar b/libs/java-websocket-1.3.1.jar deleted file mode 100644 index f3c9279f7cd59cf12fff8b8af0600d2f0fa786de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167042 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 VxcSIC=Etb5IS~LoXvDtC`3F=`lr{hW diff --git a/src/org/java_websocket/AbstractWrappedByteChannel.java b/src/org/java_websocket/AbstractWrappedByteChannel.java new file mode 100644 index 0000000..8d0721a --- /dev/null +++ b/src/org/java_websocket/AbstractWrappedByteChannel.java @@ -0,0 +1,75 @@ +package org.java_websocket; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; +import java.nio.channels.SocketChannel; + +import javax.net.ssl.SSLException; + + +public class AbstractWrappedByteChannel implements WrappedByteChannel { + + private final ByteChannel channel; + + public AbstractWrappedByteChannel( ByteChannel towrap ) { + this.channel = towrap; + } + + public AbstractWrappedByteChannel( WrappedByteChannel towrap ) { + this.channel = towrap; + } + + @Override + public int read( ByteBuffer dst ) throws IOException { + return channel.read( dst ); + } + + @Override + public boolean isOpen() { + return channel.isOpen(); + } + + @Override + public void close() throws IOException { + channel.close(); + } + + @Override + public int write( ByteBuffer src ) throws IOException { + return channel.write( src ); + } + + @Override + public boolean isNeedWrite() { + return channel instanceof WrappedByteChannel && ((WrappedByteChannel) channel).isNeedWrite(); + } + + @Override + public void writeMore() throws IOException { + if( channel instanceof WrappedByteChannel ) + ( (WrappedByteChannel) channel ).writeMore(); + + } + + @Override + public boolean isNeedRead() { + return channel instanceof WrappedByteChannel && ((WrappedByteChannel) channel).isNeedRead(); + + } + + @Override + public int readMore( ByteBuffer dst ) throws SSLException { + return channel instanceof WrappedByteChannel ? ( (WrappedByteChannel) channel ).readMore( dst ) : 0; + } + + @Override + public boolean isBlocking() { + if( channel instanceof SocketChannel ) + return ( (SocketChannel) channel ).isBlocking(); + else if( channel instanceof WrappedByteChannel ) + return ( (WrappedByteChannel) channel ).isBlocking(); + return false; + } + +} diff --git a/src/org/java_websocket/SSLSocketChannel2.java b/src/org/java_websocket/SSLSocketChannel2.java new file mode 100644 index 0000000..404e2c0 --- /dev/null +++ b/src/org/java_websocket/SSLSocketChannel2.java @@ -0,0 +1,385 @@ +/** + * Copyright (C) 2003 Alexander Kout + * Originally from the jFxp project (http://jfxp.sourceforge.net/). + * Copied with permission June 11, 2012 by Femi Omojola (fomojola@ideasynthesis.com). + */ +package org.java_websocket; + +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLEngineResult; +import javax.net.ssl.SSLEngineResult.HandshakeStatus; +import javax.net.ssl.SSLEngineResult.Status; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLSession; +import java.io.EOFException; +import java.io.IOException; +import java.net.Socket; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +/** + * Implements the relevant portions of the SocketChannel interface with the SSLEngine wrapper. + */ +public class SSLSocketChannel2 implements ByteChannel, WrappedByteChannel { + /** + * This object is used to feed the {@link SSLEngine}'s wrap and unwrap methods during the handshake phase. + **/ + protected static ByteBuffer emptybuffer = ByteBuffer.allocate( 0 ); + + protected ExecutorService exec; + + protected List> tasks; + + /** raw payload incomming */ + protected ByteBuffer inData; + /** encrypted data outgoing */ + protected ByteBuffer outCrypt; + /** encrypted data incoming */ + protected ByteBuffer inCrypt; + + /** the underlying channel */ + protected SocketChannel socketChannel; + /** used to set interestOP SelectionKey.OP_WRITE for the underlying channel */ + protected SelectionKey selectionKey; + + protected SSLEngine sslEngine; + protected SSLEngineResult readEngineResult; + protected SSLEngineResult writeEngineResult; + + /** + * Should be used to count the buffer allocations. + * But because of #190 where HandshakeStatus.FINISHED is not properly returned by nio wrap/unwrap this variable is used to check whether {@link #createBuffers(SSLSession)} needs to be called. + **/ + protected int bufferallocations = 0; + + public SSLSocketChannel2( SocketChannel channel , SSLEngine sslEngine , ExecutorService exec , SelectionKey key ) throws IOException { + if( channel == null || sslEngine == null || exec == null ) + throw new IllegalArgumentException( "parameter must not be null" ); + + this.socketChannel = channel; + this.sslEngine = sslEngine; + this.exec = exec; + + readEngineResult = writeEngineResult = new SSLEngineResult( Status.BUFFER_UNDERFLOW, sslEngine.getHandshakeStatus(), 0, 0 ); // init to prevent NPEs + + tasks = new ArrayList>( 3 ); + if( key != null ) { + key.interestOps( key.interestOps() | SelectionKey.OP_WRITE ); + this.selectionKey = key; + } + createBuffers( sslEngine.getSession() ); + // kick off handshake + socketChannel.write( wrap( emptybuffer ) );// initializes res + processHandshake(); + } + + private void consumeFutureUninterruptible( Future f ) { + try { + boolean interrupted = false; + while ( true ) { + try { + f.get(); + break; + } catch ( InterruptedException e ) { + interrupted = true; + } + } + if( interrupted ) + Thread.currentThread().interrupt(); + } catch ( ExecutionException e ) { + throw new RuntimeException( e ); + } + } + + /** + * This method will do whatever necessary to process the sslengine handshake. + * Thats why it's called both from the {@link #read(ByteBuffer)} and {@link #write(ByteBuffer)} + **/ + private synchronized void processHandshake() throws IOException { + if( sslEngine.getHandshakeStatus() == HandshakeStatus.NOT_HANDSHAKING ) + return; // since this may be called either from a reading or a writing thread and because this method is synchronized it is necessary to double check if we are still handshaking. + if( !tasks.isEmpty() ) { + Iterator> it = tasks.iterator(); + while ( it.hasNext() ) { + Future f = it.next(); + if( f.isDone() ) { + it.remove(); + } else { + if( isBlocking() ) + consumeFutureUninterruptible( f ); + return; + } + } + } + + if( sslEngine.getHandshakeStatus() == SSLEngineResult.HandshakeStatus.NEED_UNWRAP ) { + if( !isBlocking() || readEngineResult.getStatus() == Status.BUFFER_UNDERFLOW ) { + inCrypt.compact(); + int read = socketChannel.read( inCrypt ); + if( read == -1 ) { + throw new IOException( "connection closed unexpectedly by peer" ); + } + inCrypt.flip(); + } + inData.compact(); + unwrap(); + if( readEngineResult.getHandshakeStatus() == HandshakeStatus.FINISHED ) { + createBuffers( sslEngine.getSession() ); + return; + } + } + consumeDelegatedTasks(); + if( tasks.isEmpty() || sslEngine.getHandshakeStatus() == SSLEngineResult.HandshakeStatus.NEED_WRAP ) { + socketChannel.write( wrap( emptybuffer ) ); + if( writeEngineResult.getHandshakeStatus() == HandshakeStatus.FINISHED ) { + createBuffers( sslEngine.getSession() ); + return; + } + } + assert ( sslEngine.getHandshakeStatus() != HandshakeStatus.NOT_HANDSHAKING );// this function could only leave NOT_HANDSHAKING after createBuffers was called unless #190 occurs which means that nio wrap/unwrap never return HandshakeStatus.FINISHED + + bufferallocations = 1; // look at variable declaration why this line exists and #190. Without this line buffers would not be be recreated when #190 AND a rehandshake occur. + } + private synchronized ByteBuffer wrap( ByteBuffer b ) throws SSLException { + outCrypt.compact(); + writeEngineResult = sslEngine.wrap( b, outCrypt ); + outCrypt.flip(); + return outCrypt; + } + + /** + * performs the unwrap operation by unwrapping from {@link #inCrypt} to {@link #inData} + **/ + private synchronized ByteBuffer unwrap() throws SSLException { + int rem; + do { + rem = inData.remaining(); + readEngineResult = sslEngine.unwrap( inCrypt, inData ); + } while ( readEngineResult.getStatus() == SSLEngineResult.Status.OK && ( rem != inData.remaining() || sslEngine.getHandshakeStatus() == HandshakeStatus.NEED_UNWRAP ) ); + inData.flip(); + return inData; + } + + protected void consumeDelegatedTasks() { + Runnable task; + while ( ( task = sslEngine.getDelegatedTask() ) != null ) { + tasks.add( exec.submit( task ) ); + // task.run(); + } + } + + protected void createBuffers( SSLSession session ) { + int netBufferMax = session.getPacketBufferSize(); + int appBufferMax = Math.max(session.getApplicationBufferSize(), netBufferMax); + + if( inData == null ) { + inData = ByteBuffer.allocate( appBufferMax ); + outCrypt = ByteBuffer.allocate( netBufferMax ); + inCrypt = ByteBuffer.allocate( netBufferMax ); + } else { + if( inData.capacity() != appBufferMax ) + inData = ByteBuffer.allocate( appBufferMax ); + if( outCrypt.capacity() != netBufferMax ) + outCrypt = ByteBuffer.allocate( netBufferMax ); + if( inCrypt.capacity() != netBufferMax ) + inCrypt = ByteBuffer.allocate( netBufferMax ); + } + inData.rewind(); + inData.flip(); + inCrypt.rewind(); + inCrypt.flip(); + outCrypt.rewind(); + outCrypt.flip(); + bufferallocations++; + } + + public int write( ByteBuffer src ) throws IOException { + if( !isHandShakeComplete() ) { + processHandshake(); + return 0; + } + // assert ( bufferallocations > 1 ); //see #190 + //if( bufferallocations <= 1 ) { + // createBuffers( sslEngine.getSession() ); + //} + int num = socketChannel.write( wrap( src ) ); + if (writeEngineResult.getStatus() == SSLEngineResult.Status.CLOSED) { + throw new EOFException("Connection is closed"); + } + return num; + + } + + /** + * Blocks when in blocking mode until at least one byte has been decoded.
+ * When not in blocking mode 0 may be returned. + * + * @return the number of bytes read. + **/ + public int read( ByteBuffer dst ) throws IOException { + if( !dst.hasRemaining() ) + return 0; + if( !isHandShakeComplete() ) { + if( isBlocking() ) { + while ( !isHandShakeComplete() ) { + processHandshake(); + } + } else { + processHandshake(); + if( !isHandShakeComplete() ) { + return 0; + } + } + } + // assert ( bufferallocations > 1 ); //see #190 + //if( bufferallocations <= 1 ) { + // createBuffers( sslEngine.getSession() ); + //} + /* 1. When "dst" is smaller than "inData" readRemaining will fill "dst" with data decoded in a previous read call. + * 2. When "inCrypt" contains more data than "inData" has remaining space, unwrap has to be called on more time(readRemaining) + */ + int purged = readRemaining( dst ); + if( purged != 0 ) + return purged; + + /* We only continue when we really need more data from the network. + * Thats the case if inData is empty or inCrypt holds to less data than necessary for decryption + */ + assert ( inData.position() == 0 ); + inData.clear(); + + if( !inCrypt.hasRemaining() ) + inCrypt.clear(); + else + inCrypt.compact(); + + if( isBlocking() || readEngineResult.getStatus() == Status.BUFFER_UNDERFLOW ) + if( socketChannel.read( inCrypt ) == -1 ) { + return -1; + } + inCrypt.flip(); + unwrap(); + + int transfered = transfereTo( inData, dst ); + if( transfered == 0 && isBlocking() ) { + return read( dst ); // "transfered" may be 0 when not enough bytes were received or during rehandshaking + } + return transfered; + } + /** + * {@link #read(ByteBuffer)} may not be to leave all buffers(inData, inCrypt) + **/ + private int readRemaining( ByteBuffer dst ) throws SSLException { + if( inData.hasRemaining() ) { + return transfereTo( inData, dst ); + } + if( !inData.hasRemaining() ) + inData.clear(); + // test if some bytes left from last read (e.g. BUFFER_UNDERFLOW) + if( inCrypt.hasRemaining() ) { + unwrap(); + int amount = transfereTo( inData, dst ); + if (readEngineResult.getStatus() == SSLEngineResult.Status.CLOSED) { + return -1; + } + if( amount > 0 ) + return amount; + } + return 0; + } + + public boolean isConnected() { + return socketChannel.isConnected(); + } + + public void close() throws IOException { + sslEngine.closeOutbound(); + sslEngine.getSession().invalidate(); + if( socketChannel.isOpen() ) + socketChannel.write( wrap( emptybuffer ) );// FIXME what if not all bytes can be written + socketChannel.close(); + } + + private boolean isHandShakeComplete() { + HandshakeStatus status = sslEngine.getHandshakeStatus(); + return status == SSLEngineResult.HandshakeStatus.FINISHED || status == SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING; + } + + public SelectableChannel configureBlocking( boolean b ) throws IOException { + return socketChannel.configureBlocking( b ); + } + + public boolean connect( SocketAddress remote ) throws IOException { + return socketChannel.connect( remote ); + } + + public boolean finishConnect() throws IOException { + return socketChannel.finishConnect(); + } + + public Socket socket() { + return socketChannel.socket(); + } + + public boolean isInboundDone() { + return sslEngine.isInboundDone(); + } + + @Override + public boolean isOpen() { + return socketChannel.isOpen(); + } + + @Override + public boolean isNeedWrite() { + return outCrypt.hasRemaining() || !isHandShakeComplete(); // FIXME this condition can cause high cpu load during handshaking when network is slow + } + + @Override + public void writeMore() throws IOException { + write( outCrypt ); + } + + @Override + public boolean isNeedRead() { + return inData.hasRemaining() || ( inCrypt.hasRemaining() && readEngineResult.getStatus() != Status.BUFFER_UNDERFLOW && readEngineResult.getStatus() != Status.CLOSED ); + } + + @Override + public int readMore( ByteBuffer dst ) throws SSLException { + return readRemaining( dst ); + } + + private int transfereTo( ByteBuffer from, ByteBuffer to ) { + int fremain = from.remaining(); + int toremain = to.remaining(); + if( fremain > toremain ) { + // FIXME there should be a more efficient transfer method + int limit = Math.min( fremain, toremain ); + for( int i = 0 ; i < limit ; i++ ) { + to.put( from.get() ); + } + return limit; + } else { + to.put( from ); + return fremain; + } + + } + + @Override + public boolean isBlocking() { + return socketChannel.isBlocking(); + } + +} \ No newline at end of file diff --git a/src/org/java_websocket/SocketChannelIOHelper.java b/src/org/java_websocket/SocketChannelIOHelper.java new file mode 100644 index 0000000..7d389a4 --- /dev/null +++ b/src/org/java_websocket/SocketChannelIOHelper.java @@ -0,0 +1,70 @@ +package org.java_websocket; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; + +import org.java_websocket.WebSocket.Role; + +public class SocketChannelIOHelper { + + public static boolean read( final ByteBuffer buf, WebSocketImpl ws, ByteChannel channel ) throws IOException { + buf.clear(); + int read = channel.read( buf ); + buf.flip(); + + if( read == -1 ) { + ws.eot(); + return false; + } + return read != 0; + } + + /** + * @see WrappedByteChannel#readMore(ByteBuffer) + * @return returns whether there is more data left which can be obtained via {@link #readMore(ByteBuffer, WebSocketImpl, WrappedByteChannel)} + **/ + public static boolean readMore( final ByteBuffer buf, WebSocketImpl ws, WrappedByteChannel channel ) throws IOException { + buf.clear(); + int read = channel.readMore( buf ); + buf.flip(); + + if( read == -1 ) { + ws.eot(); + return false; + } + return channel.isNeedRead(); + } + + /** Returns whether the whole outQueue has been flushed */ + public static boolean batch( WebSocketImpl ws, ByteChannel sockchannel ) throws IOException { + ByteBuffer buffer = ws.outQueue.peek(); + WrappedByteChannel c = null; + + if( buffer == null ) { + if( sockchannel instanceof WrappedByteChannel ) { + c = (WrappedByteChannel) sockchannel; + if( c.isNeedWrite() ) { + c.writeMore(); + } + } + } else { + do {// FIXME writing as much as possible is unfair!! + /*int written = */sockchannel.write( buffer ); + if( buffer.remaining() > 0 ) { + return false; + } else { + ws.outQueue.poll(); // Buffer finished. Remove it. + buffer = ws.outQueue.peek(); + } + } while ( buffer != null ); + } + + if( ws != null && ws.outQueue.isEmpty() && ws.isFlushAndClose() && ws.getDraft() != null && ws.getDraft().getRole() != null && ws.getDraft().getRole() == Role.SERVER ) {// + synchronized ( ws ) { + ws.closeConnection(); + } + } + return c == null || !((WrappedByteChannel) sockchannel).isNeedWrite(); + } +} diff --git a/src/org/java_websocket/WebSocket.java b/src/org/java_websocket/WebSocket.java new file mode 100644 index 0000000..3bd4c9f --- /dev/null +++ b/src/org/java_websocket/WebSocket.java @@ -0,0 +1,123 @@ +package org.java_websocket; + +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.NotYetConnectedException; + +import org.java_websocket.drafts.Draft; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; + +public interface WebSocket { + public enum Role { + CLIENT, SERVER + } + + public enum READYSTATE { + NOT_YET_CONNECTED, CONNECTING, OPEN, CLOSING, CLOSED + } + + /** + * The default port of WebSockets, as defined in the spec. If the nullary + * constructor is used, DEFAULT_PORT will be the port the WebSocketServer + * is binded to. Note that ports under 1024 usually require root permissions. + */ + public static final int DEFAULT_PORT = 80; + + public static final int DEFAULT_WSS_PORT = 443; + + /** + * sends the closing handshake. + * may be send in response to an other handshake. + */ + public void close( int code, String message ); + + public void close( int code ); + + /** Convenience function which behaves like close(CloseFrame.NORMAL) */ + public void close(); + + /** + * This will close the connection immediately without a proper close handshake. + * The code and the message therefore won't be transfered over the wire also they will be forwarded to onClose/onWebsocketClose. + **/ + public abstract void closeConnection( int code, String message ); + + /** + * Send Text data to the other end. + * + * @throws NotYetConnectedException websocket is not yet connected + */ + public abstract void send( String text ) throws NotYetConnectedException; + + /** + * Send Binary data (plain bytes) to the other end. + * + * @throws IllegalArgumentException the data is null + * @throws NotYetConnectedException websocket is not yet connected + */ + public abstract void send( ByteBuffer bytes ) throws IllegalArgumentException , NotYetConnectedException; + + public abstract void send( byte[] bytes ) throws IllegalArgumentException , NotYetConnectedException; + + public abstract void sendFrame( Framedata framedata ); + + /** + * Allows to send continuous/fragmented frames conveniently.
+ * For more into on this frame type see http://tools.ietf.org/html/rfc6455#section-5.4
+ * + * If the first frame you send is also the last then it is not a fragmented frame and will received via onMessage instead of onFragmented even though it was send by this method. + * + * @param op + * This is only important for the first frame in the sequence. Opcode.TEXT, Opcode.BINARY are allowed. + * @param buffer + * The buffer which contains the payload. It may have no bytes remaining. + * @param fin + * true means the current frame is the last in the sequence. + **/ + public abstract void sendFragmentedFrame( Opcode op, ByteBuffer buffer, boolean fin ); + + public abstract boolean hasBufferedData(); + + /** + * @return never returns null + */ + public abstract InetSocketAddress getRemoteSocketAddress(); + + /** + * @return never returns null + */ + public abstract InetSocketAddress getLocalSocketAddress(); + + public abstract boolean isConnecting(); + + public abstract boolean isOpen(); + + public abstract boolean isClosing(); + + /** + * Returns true when no further frames may be submitted
+ * This happens before the socket connection is closed. + */ + public abstract boolean isFlushAndClose(); + + /** Returns whether the close handshake has been completed and the socket is closed. */ + public abstract boolean isClosed(); + + public abstract Draft getDraft(); + + /** + * Retrieve the WebSocket 'readyState'. + * This represents the state of the connection. + * It returns a numerical value, as per W3C WebSockets specs. + * + * @return Returns '0 = CONNECTING', '1 = OPEN', '2 = CLOSING' or '3 = CLOSED' + */ + public abstract READYSTATE getReadyState(); + + /** + * Returns the HTTP Request-URI as defined by http://tools.ietf.org/html/rfc2616#section-5.1.2
+ * If the opening handshake has not yet happened it will return null. + **/ + public abstract String getResourceDescriptor(); +} \ No newline at end of file diff --git a/src/org/java_websocket/WebSocketAdapter.java b/src/org/java_websocket/WebSocketAdapter.java new file mode 100644 index 0000000..49b72c6 --- /dev/null +++ b/src/org/java_websocket/WebSocketAdapter.java @@ -0,0 +1,99 @@ +package org.java_websocket; + +import java.net.InetSocketAddress; + +import org.java_websocket.drafts.Draft; +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidHandshakeException; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; +import org.java_websocket.framing.FramedataImpl1; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.HandshakeImpl1Server; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.handshake.ServerHandshakeBuilder; + +/** + * This class default implements all methods of the WebSocketListener that can be overridden optionally when advances functionalities is needed.
+ **/ +public abstract class WebSocketAdapter implements WebSocketListener { + + /** + * This default implementation does not do anything. Go ahead and overwrite it. + * + * @see org.java_websocket.WebSocketListener#onWebsocketHandshakeReceivedAsServer(WebSocket, Draft, ClientHandshake) + */ + @Override + public ServerHandshakeBuilder onWebsocketHandshakeReceivedAsServer( WebSocket conn, Draft draft, ClientHandshake request ) throws InvalidDataException { + return new HandshakeImpl1Server(); + } + + @Override + public void onWebsocketHandshakeReceivedAsClient( WebSocket conn, ClientHandshake request, ServerHandshake response ) throws InvalidDataException { + } + + /** + * This default implementation does not do anything which will cause the connections to always progress. + * + * @see org.java_websocket.WebSocketListener#onWebsocketHandshakeSentAsClient(WebSocket, ClientHandshake) + */ + @Override + public void onWebsocketHandshakeSentAsClient( WebSocket conn, ClientHandshake request ) throws InvalidDataException { + } + + /** + * This default implementation does not do anything. Go ahead and overwrite it + * + * @see org.java_websocket.WebSocketListener#onWebsocketMessageFragment(WebSocket, Framedata) + */ + @Override + public void onWebsocketMessageFragment( WebSocket conn, Framedata frame ) { + } + + /** + * This default implementation will send a pong in response to the received ping. + * The pong frame will have the same payload as the ping frame. + * + * @see org.java_websocket.WebSocketListener#onWebsocketPing(WebSocket, Framedata) + */ + @Override + public void onWebsocketPing( WebSocket conn, Framedata f ) { + FramedataImpl1 resp = new FramedataImpl1( f ); + resp.setOptcode( Opcode.PONG ); + conn.sendFrame( resp ); + } + + /** + * This default implementation does not do anything. Go ahead and overwrite it. + * + * @see org.java_websocket.WebSocketListener#onWebsocketPong(WebSocket, Framedata) + */ + @Override + public void onWebsocketPong( WebSocket conn, Framedata f ) { + } + + /** + * Gets the XML string that should be returned if a client requests a Flash + * security policy. + * + * The default implementation allows access from all remote domains, but + * only on the port that this WebSocketServer is listening on. + * + * This is specifically implemented for gitime's WebSocket client for Flash: + * http://github.com/gimite/web-socket-js + * + * @return An XML String that comforts to Flash's security policy. You MUST + * not include the null char at the end, it is appended automatically. + * @throws InvalidDataException thrown when some data that is required to generate the flash-policy like the websocket local port could not be obtained e.g because the websocket is not connected. + */ + @Override + public String getFlashPolicy( WebSocket conn ) throws InvalidDataException { + InetSocketAddress adr = conn.getLocalSocketAddress(); + if(null == adr){ + throw new InvalidHandshakeException( "socket not bound" ); + } + + return "\0"; + } + +} diff --git a/src/org/java_websocket/WebSocketFactory.java b/src/org/java_websocket/WebSocketFactory.java new file mode 100644 index 0000000..651e974 --- /dev/null +++ b/src/org/java_websocket/WebSocketFactory.java @@ -0,0 +1,12 @@ +package org.java_websocket; + +import java.net.Socket; +import java.util.List; + +import org.java_websocket.drafts.Draft; + +public interface WebSocketFactory { + public WebSocket createWebSocket( WebSocketAdapter a, Draft d, Socket s ); + public WebSocket createWebSocket( WebSocketAdapter a, List drafts, Socket s ); + +} diff --git a/src/org/java_websocket/WebSocketImpl.java b/src/org/java_websocket/WebSocketImpl.java new file mode 100644 index 0000000..3a705e7 --- /dev/null +++ b/src/org/java_websocket/WebSocketImpl.java @@ -0,0 +1,734 @@ +package org.java_websocket; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; +import java.nio.channels.NotYetConnectedException; +import java.nio.channels.SelectionKey; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +import org.java_websocket.drafts.Draft; +import org.java_websocket.drafts.Draft.CloseHandshakeType; +import org.java_websocket.drafts.Draft.HandshakeState; +import org.java_websocket.drafts.Draft_10; +import org.java_websocket.drafts.Draft_17; +import org.java_websocket.drafts.Draft_75; +import org.java_websocket.drafts.Draft_76; +import org.java_websocket.exceptions.IncompleteHandshakeException; +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidHandshakeException; +import org.java_websocket.exceptions.WebsocketNotConnectedException; +import org.java_websocket.framing.CloseFrame; +import org.java_websocket.framing.CloseFrameBuilder; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.ClientHandshakeBuilder; +import org.java_websocket.handshake.Handshakedata; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.handshake.ServerHandshakeBuilder; +import org.java_websocket.server.WebSocketServer.WebSocketWorker; +import org.java_websocket.util.Charsetfunctions; + +/** + * Represents one end (client or server) of a single WebSocketImpl connection. + * Takes care of the "handshake" phase, then allows for easy sending of + * text frames, and receiving frames through an event-based model. + * + */ +public class WebSocketImpl implements WebSocket { + + public static int RCVBUF = 16384; + + public static/*final*/boolean DEBUG = false; // must be final in the future in order to take advantage of VM optimization + + public static final List defaultdraftlist = new ArrayList( 4 ); + static { + defaultdraftlist.add( new Draft_17() ); + defaultdraftlist.add( new Draft_10() ); + defaultdraftlist.add( new Draft_76() ); + defaultdraftlist.add( new Draft_75() ); + } + + public SelectionKey key; + + /** the possibly wrapped channel object whose selection is controlled by {@link #key} */ + public ByteChannel channel; + /** + * Queue of buffers that need to be sent to the client. + */ + public final BlockingQueue outQueue; + /** + * Queue of buffers that need to be processed + */ + public final BlockingQueue inQueue; + + /** + * Helper variable meant to store the thread which ( exclusively ) triggers this objects decode method. + **/ + public volatile WebSocketWorker workerThread; // TODO reset worker? + + /** When true no further frames may be submitted to be sent */ + private volatile boolean flushandclosestate = false; + + private READYSTATE readystate = READYSTATE.NOT_YET_CONNECTED; + + /** + * The listener to notify of WebSocket events. + */ + private final WebSocketListener wsl; + + private List knownDrafts; + + private Draft draft = null; + + private Role role; + + private Opcode current_continuous_frame_opcode = null; + + /** the bytes of an incomplete received handshake */ + private ByteBuffer tmpHandshakeBytes = ByteBuffer.allocate( 0 ); + + /** stores the handshake sent by this websocket ( Role.CLIENT only ) */ + private ClientHandshake handshakerequest = null; + + private String closemessage = null; + private Integer closecode = null; + private Boolean closedremotely = null; + + private String resourceDescriptor = null; + + /** + * creates a websocket with server role + */ + public WebSocketImpl( WebSocketListener listener , List drafts ) { + this( listener, (Draft) null ); + this.role = Role.SERVER; + // draft.copyInstance will be called when the draft is first needed + if( drafts == null || drafts.isEmpty() ) { + knownDrafts = defaultdraftlist; + } else { + knownDrafts = drafts; + } + } + + /** + * creates a websocket with client role + * + * @param listener + * may be unbound + */ + public WebSocketImpl( WebSocketListener listener , Draft draft ) { + if( listener == null || ( draft == null && role == Role.SERVER ) )// socket can be null because we want do be able to create the object without already having a bound channel + throw new IllegalArgumentException( "parameters must not be null" ); + this.outQueue = new LinkedBlockingQueue(); + inQueue = new LinkedBlockingQueue(); + this.wsl = listener; + this.role = Role.CLIENT; + if( draft != null ) + this.draft = draft.copyInstance(); + } + + @Deprecated + public WebSocketImpl( WebSocketListener listener , Draft draft , Socket socket ) { + this( listener, draft ); + } + + @Deprecated + public WebSocketImpl( WebSocketListener listener , List drafts , Socket socket ) { + this( listener, drafts ); + } + + /** + * + */ + public void decode( ByteBuffer socketBuffer ) { + assert ( socketBuffer.hasRemaining() ); + + if( DEBUG ) + System.out.println( "process(" + socketBuffer.remaining() + "): {" + ( socketBuffer.remaining() > 1000 ? "too big to display" : new String( socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining() ) ) + "}" ); + + if( readystate != READYSTATE.NOT_YET_CONNECTED ) { + decodeFrames( socketBuffer ); + } else { + if( decodeHandshake( socketBuffer ) ) { + assert ( tmpHandshakeBytes.hasRemaining() != socketBuffer.hasRemaining() || !socketBuffer.hasRemaining() ); // the buffers will never have remaining bytes at the same time + + if( socketBuffer.hasRemaining() ) { + decodeFrames( socketBuffer ); + } else if( tmpHandshakeBytes.hasRemaining() ) { + decodeFrames( tmpHandshakeBytes ); + } + } + } + assert ( isClosing() || isFlushAndClose() || !socketBuffer.hasRemaining() ); + } + /** + * Returns whether the handshake phase has is completed. + * In case of a broken handshake this will be never the case. + **/ + private boolean decodeHandshake( ByteBuffer socketBufferNew ) { + ByteBuffer socketBuffer; + if( tmpHandshakeBytes.capacity() == 0 ) { + socketBuffer = socketBufferNew; + } else { + if( tmpHandshakeBytes.remaining() < socketBufferNew.remaining() ) { + ByteBuffer buf = ByteBuffer.allocate( tmpHandshakeBytes.capacity() + socketBufferNew.remaining() ); + tmpHandshakeBytes.flip(); + buf.put( tmpHandshakeBytes ); + tmpHandshakeBytes = buf; + } + + tmpHandshakeBytes.put( socketBufferNew ); + tmpHandshakeBytes.flip(); + socketBuffer = tmpHandshakeBytes; + } + socketBuffer.mark(); + try { + if( draft == null ) { + HandshakeState isflashedgecase = isFlashEdgeCase( socketBuffer ); + if( isflashedgecase == HandshakeState.MATCHED ) { + try { + write( ByteBuffer.wrap( Charsetfunctions.utf8Bytes( wsl.getFlashPolicy( this ) ) ) ); + close( CloseFrame.FLASHPOLICY, "" ); + } catch ( InvalidDataException e ) { + close( CloseFrame.ABNORMAL_CLOSE, "remote peer closed connection before flashpolicy could be transmitted", true ); + } + return false; + } + } + HandshakeState handshakestate; + + try { + if( role == Role.SERVER ) { + if( draft == null ) { + for( Draft d : knownDrafts ) { + d = d.copyInstance(); + try { + d.setParseMode( role ); + socketBuffer.reset(); + Handshakedata tmphandshake = d.translateHandshake( socketBuffer ); + if(!(tmphandshake instanceof ClientHandshake)) { + flushAndClose( CloseFrame.PROTOCOL_ERROR, "wrong http function", false ); + return false; + } + ClientHandshake handshake = (ClientHandshake) tmphandshake; + handshakestate = d.acceptHandshakeAsServer( handshake ); + if( handshakestate == HandshakeState.MATCHED ) { + resourceDescriptor = handshake.getResourceDescriptor(); + ServerHandshakeBuilder response; + try { + response = wsl.onWebsocketHandshakeReceivedAsServer( this, d, handshake ); + } catch ( InvalidDataException e ) { + flushAndClose( e.getCloseCode(), e.getMessage(), false ); + return false; + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + flushAndClose( CloseFrame.NEVER_CONNECTED, e.getMessage(), false ); + return false; + } + write( d.createHandshake( d.postProcessHandshakeResponseAsServer( handshake, response ), role ) ); + draft = d; + open( handshake ); + return true; + } + } catch ( InvalidHandshakeException e ) { + // go on with an other draft + } + } + if( draft == null ) { + close( CloseFrame.PROTOCOL_ERROR, "no draft matches" ); + } + return false; + } else { + // special case for multiple step handshakes + Handshakedata tmphandshake = draft.translateHandshake( socketBuffer ); + if(!(tmphandshake instanceof ClientHandshake)) { + flushAndClose( CloseFrame.PROTOCOL_ERROR, "wrong http function", false ); + return false; + } + ClientHandshake handshake = (ClientHandshake) tmphandshake; + handshakestate = draft.acceptHandshakeAsServer( handshake ); + + if( handshakestate == HandshakeState.MATCHED ) { + open( handshake ); + return true; + } else { + close( CloseFrame.PROTOCOL_ERROR, "the handshake did finaly not match" ); + } + return false; + } + } else if( role == Role.CLIENT ) { + draft.setParseMode( role ); + Handshakedata tmphandshake = draft.translateHandshake( socketBuffer ); + if(!(tmphandshake instanceof ServerHandshake)) { + flushAndClose( CloseFrame.PROTOCOL_ERROR, "wrong http function", false ); + return false; + } + ServerHandshake handshake = (ServerHandshake) tmphandshake; + handshakestate = draft.acceptHandshakeAsClient( handshakerequest, handshake ); + if( handshakestate == HandshakeState.MATCHED ) { + try { + wsl.onWebsocketHandshakeReceivedAsClient( this, handshakerequest, handshake ); + } catch ( InvalidDataException e ) { + flushAndClose( e.getCloseCode(), e.getMessage(), false ); + return false; + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + flushAndClose( CloseFrame.NEVER_CONNECTED, e.getMessage(), false ); + return false; + } + open( handshake ); + return true; + } else { + close( CloseFrame.PROTOCOL_ERROR, "draft " + draft + " refuses handshake" ); + } + } + } catch ( InvalidHandshakeException e ) { + close( e ); + } + } catch ( IncompleteHandshakeException e ) { + if( tmpHandshakeBytes.capacity() == 0 ) { + socketBuffer.reset(); + int newsize = e.getPreferedSize(); + if( newsize == 0 ) { + newsize = socketBuffer.capacity() + 16; + } else { + assert ( e.getPreferedSize() >= socketBuffer.remaining() ); + } + tmpHandshakeBytes = ByteBuffer.allocate( newsize ); + + tmpHandshakeBytes.put( socketBufferNew ); + // tmpHandshakeBytes.flip(); + } else { + tmpHandshakeBytes.position( tmpHandshakeBytes.limit() ); + tmpHandshakeBytes.limit( tmpHandshakeBytes.capacity() ); + } + } + return false; + } + + private void decodeFrames( ByteBuffer socketBuffer ) { + + List frames; + try { + frames = draft.translateFrame( socketBuffer ); + for( Framedata f : frames ) { + if( DEBUG ) + System.out.println( "matched frame: " + f ); + Opcode curop = f.getOpcode(); + boolean fin = f.isFin(); + + if( curop == Opcode.CLOSING ) { + int code = CloseFrame.NOCODE; + String reason = ""; + if( f instanceof CloseFrame ) { + CloseFrame cf = (CloseFrame) f; + code = cf.getCloseCode(); + reason = cf.getMessage(); + } + if( readystate == READYSTATE.CLOSING ) { + // complete the close handshake by disconnecting + closeConnection( code, reason, true ); + } else { + // echo close handshake + if( draft.getCloseHandshakeType() == CloseHandshakeType.TWOWAY ) + close( code, reason, true ); + else + flushAndClose( code, reason, false ); + } + continue; + } else if( curop == Opcode.PING ) { + wsl.onWebsocketPing( this, f ); + continue; + } else if( curop == Opcode.PONG ) { + wsl.onWebsocketPong( this, f ); + continue; + } else if( !fin || curop == Opcode.CONTINUOUS ) { + if( curop != Opcode.CONTINUOUS ) { + if( current_continuous_frame_opcode != null ) + throw new InvalidDataException( CloseFrame.PROTOCOL_ERROR, "Previous continuous frame sequence not completed." ); + current_continuous_frame_opcode = curop; + } else if( fin ) { + if( current_continuous_frame_opcode == null ) + throw new InvalidDataException( CloseFrame.PROTOCOL_ERROR, "Continuous frame sequence was not started." ); + current_continuous_frame_opcode = null; + } else if( current_continuous_frame_opcode == null ) { + throw new InvalidDataException( CloseFrame.PROTOCOL_ERROR, "Continuous frame sequence was not started." ); + } + try { + wsl.onWebsocketMessageFragment( this, f ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + } + + } else if( current_continuous_frame_opcode != null ) { + throw new InvalidDataException( CloseFrame.PROTOCOL_ERROR, "Continuous frame sequence not completed." ); + } else if( curop == Opcode.TEXT ) { + try { + wsl.onWebsocketMessage( this, Charsetfunctions.stringUtf8( f.getPayloadData() ) ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + } + } else if( curop == Opcode.BINARY ) { + try { + wsl.onWebsocketMessage( this, f.getPayloadData() ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + } + } else { + throw new InvalidDataException( CloseFrame.PROTOCOL_ERROR, "non control or continious frame expected" ); + } + } + } catch ( InvalidDataException e1 ) { + wsl.onWebsocketError( this, e1 ); + close( e1 ); + return; + } + } + + private void close( int code, String message, boolean remote ) { + if( readystate != READYSTATE.CLOSING && readystate != READYSTATE.CLOSED ) { + if( readystate == READYSTATE.OPEN ) { + if( code == CloseFrame.ABNORMAL_CLOSE ) { + assert (!remote); + readystate = READYSTATE.CLOSING; + flushAndClose( code, message, false ); + return; + } + if( draft.getCloseHandshakeType() != CloseHandshakeType.NONE ) { + try { + if( !remote ) { + try { + wsl.onWebsocketCloseInitiated( this, code, message ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + } + } + sendFrame( new CloseFrameBuilder( code, message ) ); + } catch ( InvalidDataException e ) { + wsl.onWebsocketError( this, e ); + flushAndClose( CloseFrame.ABNORMAL_CLOSE, "generated frame is invalid", false ); + } + } + flushAndClose( code, message, remote ); + } else if( code == CloseFrame.FLASHPOLICY ) { + assert ( remote ); + flushAndClose( CloseFrame.FLASHPOLICY, message, true ); + } else { + flushAndClose( CloseFrame.NEVER_CONNECTED, message, false ); + } + if( code == CloseFrame.PROTOCOL_ERROR )// this endpoint found a PROTOCOL_ERROR + flushAndClose( code, message, remote ); + readystate = READYSTATE.CLOSING; + tmpHandshakeBytes = null; + return; + } + } + + @Override + public void close( int code, String message ) { + close( code, message, false ); + } + + /** + * + * @param remote + * Indicates who "generated" code.
+ * true means that this endpoint received the code from the other endpoint.
+ * false means this endpoint decided to send the given code,
+ * remote may also be true if this endpoint started the closing handshake since the other endpoint may not simply echo the code but close the connection the same time this endpoint does do but with an other code.
+ **/ + + protected synchronized void closeConnection( int code, String message, boolean remote ) { + if( readystate == READYSTATE.CLOSED ) { + return; + } + + if( key != null ) { + // key.attach( null ); //see issue #114 + key.cancel(); + } + if( channel != null ) { + try { + channel.close(); + } catch ( IOException e ) { + wsl.onWebsocketError( this, e ); + } + } + try { + this.wsl.onWebsocketClose( this, code, message, remote ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + } + if( draft != null ) + draft.reset(); + handshakerequest = null; + + readystate = READYSTATE.CLOSED; + this.outQueue.clear(); + } + + protected void closeConnection( int code, boolean remote ) { + closeConnection( code, "", remote ); + } + + public void closeConnection() { + if( closedremotely == null ) { + throw new IllegalStateException( "this method must be used in conjuction with flushAndClose" ); + } + closeConnection( closecode, closemessage, closedremotely ); + } + + public void closeConnection( int code, String message ) { + closeConnection( code, message, false ); + } + + protected synchronized void flushAndClose( int code, String message, boolean remote ) { + if( flushandclosestate ) { + return; + } + closecode = code; + closemessage = message; + closedremotely = remote; + + flushandclosestate = true; + + wsl.onWriteDemand( this ); // ensures that all outgoing frames are flushed before closing the connection + try { + wsl.onWebsocketClosing( this, code, message, remote ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + } + if( draft != null ) + draft.reset(); + handshakerequest = null; + } + + public void eot() { + if( getReadyState() == READYSTATE.NOT_YET_CONNECTED ) { + closeConnection( CloseFrame.NEVER_CONNECTED, true ); + } else if( flushandclosestate ) { + closeConnection( closecode, closemessage, closedremotely ); + } else if( draft.getCloseHandshakeType() == CloseHandshakeType.NONE ) { + closeConnection( CloseFrame.NORMAL, true ); + } else if( draft.getCloseHandshakeType() == CloseHandshakeType.ONEWAY ) { + if( role == Role.SERVER ) + closeConnection( CloseFrame.ABNORMAL_CLOSE, true ); + else + closeConnection( CloseFrame.NORMAL, true ); + } else { + closeConnection( CloseFrame.ABNORMAL_CLOSE, true ); + } + } + + @Override + public void close( int code ) { + close( code, "", false ); + } + + public void close( InvalidDataException e ) { + close( e.getCloseCode(), e.getMessage(), false ); + } + + /** + * Send Text data to the other end. + * @throws NotYetConnectedException websocket is not yet connected + */ + @Override + public void send( String text ) throws WebsocketNotConnectedException { + if( text == null ) + throw new IllegalArgumentException( "Cannot send 'null' data to a WebSocketImpl." ); + send( draft.createFrames( text, role == Role.CLIENT ) ); + } + + /** + * Send Binary data (plain bytes) to the other end. + * + * @throws IllegalArgumentException the data is null + * @throws NotYetConnectedException websocket is not yet connected + */ + @Override + public void send( ByteBuffer bytes ) throws IllegalArgumentException , WebsocketNotConnectedException { + if( bytes == null ) + throw new IllegalArgumentException( "Cannot send 'null' data to a WebSocketImpl." ); + send( draft.createFrames( bytes, role == Role.CLIENT ) ); + } + + @Override + public void send( byte[] bytes ) throws IllegalArgumentException , WebsocketNotConnectedException { + send( ByteBuffer.wrap( bytes ) ); + } + + private void send( Collection frames ) { + if( !isOpen() ) + throw new WebsocketNotConnectedException(); + for( Framedata f : frames ) { + sendFrame( f ); + } + } + + @Override + public void sendFragmentedFrame( Opcode op, ByteBuffer buffer, boolean fin ) { + send( draft.continuousFrame( op, buffer, fin ) ); + } + + @Override + public void sendFrame( Framedata framedata ) { + if( DEBUG ) + System.out.println( "send frame: " + framedata ); + write( draft.createBinaryFrame( framedata ) ); + } + + @Override + public boolean hasBufferedData() { + return !this.outQueue.isEmpty(); + } + + private HandshakeState isFlashEdgeCase( ByteBuffer request ) throws IncompleteHandshakeException { + request.mark(); + if( request.limit() > Draft.FLASH_POLICY_REQUEST.length ) { + return HandshakeState.NOT_MATCHED; + } else if( request.limit() < Draft.FLASH_POLICY_REQUEST.length ) { + throw new IncompleteHandshakeException( Draft.FLASH_POLICY_REQUEST.length ); + } else { + + for( int flash_policy_index = 0 ; request.hasRemaining() ; flash_policy_index++ ) { + if( Draft.FLASH_POLICY_REQUEST[ flash_policy_index ] != request.get() ) { + request.reset(); + return HandshakeState.NOT_MATCHED; + } + } + return HandshakeState.MATCHED; + } + } + + public void startHandshake( ClientHandshakeBuilder handshakedata ) throws InvalidHandshakeException { + assert ( readystate != READYSTATE.CONNECTING ) : "shall only be called once"; + + // Store the Handshake Request we are about to send + this.handshakerequest = draft.postProcessHandshakeRequestAsClient( handshakedata ); + + resourceDescriptor = handshakedata.getResourceDescriptor(); + assert( resourceDescriptor != null ); + + // Notify Listener + try { + wsl.onWebsocketHandshakeSentAsClient( this, this.handshakerequest ); + } catch ( InvalidDataException e ) { + // Stop if the client code throws an exception + throw new InvalidHandshakeException( "Handshake data rejected by client." ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + throw new InvalidHandshakeException( "rejected because of" + e ); + } + + // Send + write( draft.createHandshake( this.handshakerequest, role ) ); + } + + private void write( ByteBuffer buf ) { + if( DEBUG ) + System.out.println( "write(" + buf.remaining() + "): {" + ( buf.remaining() > 1000 ? "too big to display" : new String( buf.array() ) ) + "}" ); + + outQueue.add( buf ); + /*try { + outQueue.put( buf ); + } catch ( InterruptedException e ) { + write( buf ); + Thread.currentThread().interrupt(); // keep the interrupted status + e.printStackTrace(); + }*/ + wsl.onWriteDemand( this ); + } + + private void write( List bufs ) { + for( ByteBuffer b : bufs ) { + write( b ); + } + } + + private void open( Handshakedata d ) { + if( DEBUG ) + System.out.println( "open using draft: " + draft.getClass().getSimpleName() ); + readystate = READYSTATE.OPEN; + try { + wsl.onWebsocketOpen( this, d ); + } catch ( RuntimeException e ) { + wsl.onWebsocketError( this, e ); + } + } + + @Override + public boolean isConnecting() { + assert (!flushandclosestate || readystate == READYSTATE.CONNECTING); + return readystate == READYSTATE.CONNECTING; // ifflushandclosestate + } + + @Override + public boolean isOpen() { + assert (readystate != READYSTATE.OPEN || !flushandclosestate); + return readystate == READYSTATE.OPEN; + } + + @Override + public boolean isClosing() { + return readystate == READYSTATE.CLOSING; + } + + @Override + public boolean isFlushAndClose() { + return flushandclosestate; + } + + @Override + public boolean isClosed() { + return readystate == READYSTATE.CLOSED; + } + + @Override + public READYSTATE getReadyState() { + return readystate; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public String toString() { + return super.toString(); // its nice to be able to set breakpoints here + } + + @Override + public InetSocketAddress getRemoteSocketAddress() { + return wsl.getRemoteSocketAddress( this ); + } + + @Override + public InetSocketAddress getLocalSocketAddress() { + return wsl.getLocalSocketAddress( this ); + } + + @Override + public Draft getDraft() { + return draft; + } + + @Override + public void close() { + close( CloseFrame.NORMAL ); + } + + @Override + public String getResourceDescriptor() { + return resourceDescriptor; + } +} diff --git a/src/org/java_websocket/WebSocketListener.java b/src/org/java_websocket/WebSocketListener.java new file mode 100644 index 0000000..e16f69d --- /dev/null +++ b/src/org/java_websocket/WebSocketListener.java @@ -0,0 +1,151 @@ +package org.java_websocket; + +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; + +import org.java_websocket.drafts.Draft; +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.framing.Framedata; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.Handshakedata; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.handshake.ServerHandshakeBuilder; + +/** + * Implemented by WebSocketClient and WebSocketServer. + * The methods within are called by WebSocket. + * Almost every method takes a first parameter conn which represents the source of the respective event. + */ +public interface WebSocketListener { + + /** + * Called on the server side when the socket connection is first established, and the WebSocket + * handshake has been received. This method allows to deny connections based on the received handshake.
+ * By default this method only requires protocol compliance. + * + * @param conn + * The WebSocket related to this event + * @param draft + * The protocol draft the client uses to connect + * @param request + * The opening http message send by the client. Can be used to access additional fields like cookies. + * @return Returns an incomplete handshake containing all optional fields + * @throws InvalidDataException + * Throwing this exception will cause this handshake to be rejected + */ + public ServerHandshakeBuilder onWebsocketHandshakeReceivedAsServer( WebSocket conn, Draft draft, ClientHandshake request ) throws InvalidDataException; + + /** + * Called on the client side when the socket connection is first established, and the WebSocketImpl + * handshake response has been received. + * + * @param conn + * The WebSocket related to this event + * @param request + * The handshake initially send out to the server by this websocket. + * @param response + * The handshake the server sent in response to the request. + * @throws InvalidDataException + * Allows the client to reject the connection with the server in respect of its handshake response. + */ + public void onWebsocketHandshakeReceivedAsClient( WebSocket conn, ClientHandshake request, ServerHandshake response ) throws InvalidDataException; + + /** + * Called on the client side when the socket connection is first established, and the WebSocketImpl + * handshake has just been sent. + * + * @param conn + * The WebSocket related to this event + * @param request + * The handshake sent to the server by this websocket + * @throws InvalidDataException + * Allows the client to stop the connection from progressing + */ + public void onWebsocketHandshakeSentAsClient( WebSocket conn, ClientHandshake request ) throws InvalidDataException; + + /** + * Called when an entire text frame has been received. Do whatever you want + * here... + * + * @param conn + * The WebSocket instance this event is occurring on. + * @param message + * The UTF-8 decoded message that was received. + */ + public void onWebsocketMessage( WebSocket conn, String message ); + + /** + * Called when an entire binary frame has been received. Do whatever you want + * here... + * + * @param conn + * The WebSocket instance this event is occurring on. + * @param blob + * The binary message that was received. + */ + public void onWebsocketMessage( WebSocket conn, ByteBuffer blob ); + + public void onWebsocketMessageFragment( WebSocket conn, Framedata frame ); + + /** + * Called after onHandshakeReceived returns true. + * Indicates that a complete WebSocket connection has been established, + * and we are ready to send/receive data. + * + * @param conn + * The WebSocket instance this event is occuring on. + */ + public void onWebsocketOpen( WebSocket conn, Handshakedata d ); + + /** + * Called after WebSocket#close is explicity called, or when the + * other end of the WebSocket connection is closed. + * + * @param ws + * The WebSocket instance this event is occuring on. + */ + public void onWebsocketClose( WebSocket ws, int code, String reason, boolean remote ); + + /** called as soon as no further frames are accepted */ + public void onWebsocketClosing( WebSocket ws, int code, String reason, boolean remote ); + + /** send when this peer sends a close handshake */ + public void onWebsocketCloseInitiated( WebSocket ws, int code, String reason ); + + /** + * Called if an exception worth noting occurred. + * If an error causes the connection to fail onClose will be called additionally afterwards. + * + * @param ex + * The exception that occurred.
+ * Might be null if the exception is not related to any specific connection. For example if the server port could not be bound. + */ + public void onWebsocketError( WebSocket conn, Exception ex ); + + /** + * Called a ping frame has been received. + * This method must send a corresponding pong by itself. + * + * @param f + * The ping frame. Control frames may contain payload. + */ + public void onWebsocketPing( WebSocket conn, Framedata f ); + + /** + * Called when a pong frame is received. + **/ + public void onWebsocketPong( WebSocket conn, Framedata f ); + + /** + * Gets the XML string that should be returned if a client requests a Flash + * security policy. + * @throws InvalidDataException thrown when some data that is required to generate the flash-policy like the websocket local port could not be obtained. + */ + public String getFlashPolicy( WebSocket conn ) throws InvalidDataException; + + /** This method is used to inform the selector thread that there is data queued to be written to the socket. */ + public void onWriteDemand( WebSocket conn ); + + public InetSocketAddress getLocalSocketAddress( WebSocket conn ); + public InetSocketAddress getRemoteSocketAddress( WebSocket conn ); +} diff --git a/src/org/java_websocket/WrappedByteChannel.java b/src/org/java_websocket/WrappedByteChannel.java new file mode 100644 index 0000000..83a3290 --- /dev/null +++ b/src/org/java_websocket/WrappedByteChannel.java @@ -0,0 +1,26 @@ +package org.java_websocket; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; + +import javax.net.ssl.SSLException; + +public interface WrappedByteChannel extends ByteChannel { + public boolean isNeedWrite(); + public void writeMore() throws IOException; + + /** + * returns whether readMore should be called to fetch data which has been decoded but not yet been returned. + * + * @see #read(ByteBuffer) + * @see #readMore(ByteBuffer) + **/ + public boolean isNeedRead(); + /** + * This function does not read data from the underlying channel at all. It is just a way to fetch data which has already be received or decoded but was but was not yet returned to the user. + * This could be the case when the decoded data did not fit into the buffer the user passed to {@link #read(ByteBuffer)}. + **/ + public int readMore( ByteBuffer dst ) throws SSLException; + public boolean isBlocking(); +} diff --git a/src/org/java_websocket/client/AbstractClientProxyChannel.java b/src/org/java_websocket/client/AbstractClientProxyChannel.java new file mode 100644 index 0000000..bbac672 --- /dev/null +++ b/src/org/java_websocket/client/AbstractClientProxyChannel.java @@ -0,0 +1,38 @@ +package org.java_websocket.client; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; + +import org.java_websocket.AbstractWrappedByteChannel; + +public abstract class AbstractClientProxyChannel extends AbstractWrappedByteChannel { + protected final ByteBuffer proxyHandshake; + + + /** + * @param towrap + * The channel to the proxy server + **/ + public AbstractClientProxyChannel( ByteChannel towrap ) { + super( towrap ); + try { + proxyHandshake = ByteBuffer.wrap( buildHandShake().getBytes( "ASCII" ) ); + } catch ( UnsupportedEncodingException e ) { + throw new RuntimeException( e ); + } + } + + @Override + public int write( ByteBuffer src ) throws IOException { + if( !proxyHandshake.hasRemaining() ) { + return super.write( src ); + } else { + return super.write( proxyHandshake ); + } + } + + public abstract String buildHandShake(); + +} diff --git a/src/org/java_websocket/client/WebSocketClient.java b/src/org/java_websocket/client/WebSocketClient.java new file mode 100644 index 0000000..742395a --- /dev/null +++ b/src/org/java_websocket/client/WebSocketClient.java @@ -0,0 +1,454 @@ +package org.java_websocket.client; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.Socket; +import java.net.URI; +import java.nio.ByteBuffer; +import java.nio.channels.NotYetConnectedException; +import java.util.Map; +import java.util.concurrent.CountDownLatch; + +import org.java_websocket.WebSocket; +import org.java_websocket.WebSocketAdapter; +import org.java_websocket.WebSocketImpl; +import org.java_websocket.drafts.Draft; +import org.java_websocket.drafts.Draft_17; +import org.java_websocket.exceptions.InvalidHandshakeException; +import org.java_websocket.framing.CloseFrame; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; +import org.java_websocket.handshake.HandshakeImpl1Client; +import org.java_websocket.handshake.Handshakedata; +import org.java_websocket.handshake.ServerHandshake; + +/** + * A subclass must implement at least onOpen, onClose, and onMessage to be + * useful. At runtime the user is expected to establish a connection via {@link #connect()}, then receive events like {@link #onMessage(String)} via the overloaded methods and to {@link #send(String)} data to the server. + */ +public abstract class WebSocketClient extends WebSocketAdapter implements Runnable, WebSocket { + + /** + * The URI this channel is supposed to connect to. + */ + protected URI uri = null; + + private WebSocketImpl engine = null; + + private Socket socket = null; + + private InputStream istream; + + private OutputStream ostream; + + private Proxy proxy = Proxy.NO_PROXY; + + private Thread writeThread; + + private Draft draft; + + private Map headers; + + private CountDownLatch connectLatch = new CountDownLatch( 1 ); + + private CountDownLatch closeLatch = new CountDownLatch( 1 ); + + private int connectTimeout = 0; + + /** This open a websocket connection as specified by rfc6455 */ + public WebSocketClient( URI serverURI ) { + this( serverURI, new Draft_17() ); + } + + /** + * Constructs a WebSocketClient instance and sets it to the connect to the + * specified URI. The channel does not attampt to connect automatically. The connection + * will be established once you call connect. + */ + public WebSocketClient( URI serverUri , Draft draft ) { + this( serverUri, draft, null, 0 ); + } + + public WebSocketClient( URI serverUri , Draft protocolDraft , Map httpHeaders , int connectTimeout ) { + if( serverUri == null ) { + throw new IllegalArgumentException(); + } else if( protocolDraft == null ) { + throw new IllegalArgumentException( "null as draft is permitted for `WebSocketServer` only!" ); + } + this.uri = serverUri; + this.draft = protocolDraft; + this.headers = httpHeaders; + this.connectTimeout = connectTimeout; + this.engine = new WebSocketImpl( this, protocolDraft ); + } + + /** + * Returns the URI that this WebSocketClient is connected to. + */ + public URI getURI() { + return uri; + } + + /** + * Returns the protocol version this channel uses.
+ * For more infos see https://github.com/TooTallNate/Java-WebSocket/wiki/Drafts + */ + public Draft getDraft() { + return draft; + } + + /** + * Initiates the websocket connection. This method does not block. + */ + public void connect() { + if( writeThread != null ) + throw new IllegalStateException( "WebSocketClient objects are not reuseable" ); + writeThread = new Thread( this ); + writeThread.start(); + } + + /** + * Same as connect but blocks until the websocket connected or failed to do so.
+ * Returns whether it succeeded or not. + **/ + public boolean connectBlocking() throws InterruptedException { + connect(); + connectLatch.await(); + return engine.isOpen(); + } + + /** + * Initiates the websocket close handshake. This method does not block
+ * In oder to make sure the connection is closed use closeBlocking + */ + public void close() { + if( writeThread != null ) { + engine.close( CloseFrame.NORMAL ); + } + } + + public void closeBlocking() throws InterruptedException { + close(); + closeLatch.await(); + } + + /** + * Sends text to the connected websocket server. + * + * @param text + * The string which will be transmitted. + */ + public void send( String text ) throws NotYetConnectedException { + engine.send( text ); + } + + /** + * Sends binary data to the connected webSocket server. + * + * @param data + * The byte-Array of data to send to the WebSocket server. + */ + public void send( byte[] data ) throws NotYetConnectedException { + engine.send( data ); + } + + public void run() { + try { + if( socket == null ) { + socket = new Socket( proxy ); + } else if( socket.isClosed() ) { + throw new IOException(); + } + if( !socket.isBound() ) + socket.connect( new InetSocketAddress( uri.getHost(), getPort() ), connectTimeout ); + istream = socket.getInputStream(); + ostream = socket.getOutputStream(); + + sendHandshake(); + } catch ( /*IOException | SecurityException | UnresolvedAddressException | InvalidHandshakeException | ClosedByInterruptException | SocketTimeoutException */Exception e ) { + onWebsocketError( engine, e ); + engine.closeConnection( CloseFrame.NEVER_CONNECTED, e.getMessage() ); + return; + } + + writeThread = new Thread( new WebsocketWriteThread() ); + writeThread.start(); + + byte[] rawbuffer = new byte[ WebSocketImpl.RCVBUF ]; + int readBytes; + + try { + while ( !isClosing() && !isClosed() && ( readBytes = istream.read( rawbuffer ) ) != -1 ) { + engine.decode( ByteBuffer.wrap( rawbuffer, 0, readBytes ) ); + } + engine.eot(); + } catch ( IOException e ) { + engine.eot(); + } catch ( RuntimeException e ) { + // this catch case covers internal errors only and indicates a bug in this websocket implementation + onError( e ); + engine.closeConnection( CloseFrame.ABNORMAL_CLOSE, e.getMessage() ); + } + assert ( socket.isClosed() ); + } + private int getPort() { + int port = uri.getPort(); + if( port == -1 ) { + String scheme = uri.getScheme(); + if( scheme.equals( "wss" ) ) { + return WebSocket.DEFAULT_WSS_PORT; + } else if( scheme.equals( "ws" ) ) { + return WebSocket.DEFAULT_PORT; + } else { + throw new RuntimeException( "unknown scheme: " + scheme ); + } + } + return port; + } + + private void sendHandshake() throws InvalidHandshakeException { + String path; + String part1 = uri.getRawPath(); + String part2 = uri.getRawQuery(); + if( part1 == null || part1.length() == 0 ) + path = "/"; + else + path = part1; + if( part2 != null ) + path += "?" + part2; + int port = getPort(); + String host = uri.getHost() + ( port != WebSocket.DEFAULT_PORT ? ":" + port : "" ); + + HandshakeImpl1Client handshake = new HandshakeImpl1Client(); + handshake.setResourceDescriptor( path ); + handshake.put( "Host", host ); + if( headers != null ) { + for( Map.Entry kv : headers.entrySet() ) { + handshake.put( kv.getKey(), kv.getValue() ); + } + } + engine.startHandshake( handshake ); + } + + /** + * This represents the state of the connection. + */ + public READYSTATE getReadyState() { + return engine.getReadyState(); + } + + /** + * Calls subclass' implementation of onMessage. + */ + @Override + public final void onWebsocketMessage( WebSocket conn, String message ) { + onMessage( message ); + } + + @Override + public final void onWebsocketMessage( WebSocket conn, ByteBuffer blob ) { + onMessage( blob ); + } + + @Override + public void onWebsocketMessageFragment( WebSocket conn, Framedata frame ) { + onFragment( frame ); + } + + /** + * Calls subclass' implementation of onOpen. + */ + @Override + public final void onWebsocketOpen( WebSocket conn, Handshakedata handshake ) { + connectLatch.countDown(); + onOpen( (ServerHandshake) handshake ); + } + + /** + * Calls subclass' implementation of onClose. + */ + @Override + public final void onWebsocketClose( WebSocket conn, int code, String reason, boolean remote ) { + connectLatch.countDown(); + closeLatch.countDown(); + if( writeThread != null ) + writeThread.interrupt(); + try { + if( socket != null ) + socket.close(); + } catch ( IOException e ) { + onWebsocketError( this, e ); + } + onClose( code, reason, remote ); + } + + /** + * Calls subclass' implementation of onIOError. + */ + @Override + public final void onWebsocketError( WebSocket conn, Exception ex ) { + onError( ex ); + } + + @Override + public final void onWriteDemand( WebSocket conn ) { + // nothing to do + } + + @Override + public void onWebsocketCloseInitiated( WebSocket conn, int code, String reason ) { + onCloseInitiated( code, reason ); + } + + @Override + public void onWebsocketClosing( WebSocket conn, int code, String reason, boolean remote ) { + onClosing( code, reason, remote ); + } + + public void onCloseInitiated( int code, String reason ) { + } + + public void onClosing( int code, String reason, boolean remote ) { + } + + public WebSocket getConnection() { + return engine; + } + + @Override + public InetSocketAddress getLocalSocketAddress( WebSocket conn ) { + if( socket != null ) + return (InetSocketAddress) socket.getLocalSocketAddress(); + return null; + } + + @Override + public InetSocketAddress getRemoteSocketAddress( WebSocket conn ) { + if( socket != null ) + return (InetSocketAddress) socket.getRemoteSocketAddress(); + return null; + } + + // ABTRACT METHODS ///////////////////////////////////////////////////////// + public abstract void onOpen( ServerHandshake handshakedata ); + public abstract void onMessage( String message ); + public abstract void onClose( int code, String reason, boolean remote ); + public abstract void onError( Exception ex ); + public void onMessage( ByteBuffer bytes ) { + } + public void onFragment( Framedata frame ) { + } + + private class WebsocketWriteThread implements Runnable { + @Override + public void run() { + Thread.currentThread().setName( "WebsocketWriteThread" ); + try { + while ( !Thread.interrupted() ) { + ByteBuffer buffer = engine.outQueue.take(); + ostream.write( buffer.array(), 0, buffer.limit() ); + ostream.flush(); + } + } catch ( IOException e ) { + engine.eot(); + } catch ( InterruptedException e ) { + // this thread is regularly terminated via an interrupt + } + } + } + + public void setProxy( Proxy proxy ) { + if( proxy == null ) + throw new IllegalArgumentException(); + this.proxy = proxy; + } + + /** + * Accepts bound and unbound sockets.
+ * This method must be called before connect. + * If the given socket is not yet bound it will be bound to the uri specified in the constructor. + **/ + public void setSocket( Socket socket ) { + if( this.socket != null ) { + throw new IllegalStateException( "socket has already been set" ); + } + this.socket = socket; + } + + @Override + public void sendFragmentedFrame( Opcode op, ByteBuffer buffer, boolean fin ) { + engine.sendFragmentedFrame( op, buffer, fin ); + } + + @Override + public boolean isOpen() { + return engine.isOpen(); + } + + @Override + public boolean isFlushAndClose() { + return engine.isFlushAndClose(); + } + + @Override + public boolean isClosed() { + return engine.isClosed(); + } + + @Override + public boolean isClosing() { + return engine.isClosing(); + } + + @Override + public boolean isConnecting() { + return engine.isConnecting(); + } + + @Override + public boolean hasBufferedData() { + return engine.hasBufferedData(); + } + + @Override + public void close( int code ) { + engine.close(); + } + + @Override + public void close( int code, String message ) { + engine.close( code, message ); + } + + @Override + public void closeConnection( int code, String message ) { + engine.closeConnection( code, message ); + } + + @Override + public void send( ByteBuffer bytes ) throws IllegalArgumentException , NotYetConnectedException { + engine.send( bytes ); + } + + @Override + public void sendFrame( Framedata framedata ) { + engine.sendFrame( framedata ); + } + + @Override + public InetSocketAddress getLocalSocketAddress() { + return engine.getLocalSocketAddress(); + } + @Override + public InetSocketAddress getRemoteSocketAddress() { + return engine.getRemoteSocketAddress(); + } + + @Override + public String getResourceDescriptor() { + return uri.getPath(); + } +} diff --git a/src/org/java_websocket/drafts/Draft.java b/src/org/java_websocket/drafts/Draft.java new file mode 100644 index 0000000..c7a6c45 --- /dev/null +++ b/src/org/java_websocket/drafts/Draft.java @@ -0,0 +1,228 @@ +package org.java_websocket.drafts; + +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + +import org.java_websocket.WebSocket.Role; +import org.java_websocket.exceptions.IncompleteHandshakeException; +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidHandshakeException; +import org.java_websocket.exceptions.LimitExedeedException; +import org.java_websocket.framing.CloseFrame; +import org.java_websocket.framing.FrameBuilder; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; +import org.java_websocket.framing.FramedataImpl1; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.ClientHandshakeBuilder; +import org.java_websocket.handshake.HandshakeBuilder; +import org.java_websocket.handshake.HandshakeImpl1Client; +import org.java_websocket.handshake.HandshakeImpl1Server; +import org.java_websocket.handshake.Handshakedata; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.handshake.ServerHandshakeBuilder; +import org.java_websocket.util.Charsetfunctions; + +/** + * Base class for everything of a websocket specification which is not common such as the way the handshake is read or frames are transfered. + **/ +public abstract class Draft { + + public enum HandshakeState { + /** Handshake matched this Draft successfully */ + MATCHED, + /** Handshake is does not match this Draft */ + NOT_MATCHED + } + public enum CloseHandshakeType { + NONE, ONEWAY, TWOWAY + } + + public static int MAX_FAME_SIZE = 1000; + public static int INITIAL_FAMESIZE = 64; + + public static final byte[] FLASH_POLICY_REQUEST = Charsetfunctions.utf8Bytes( "\0" ); + + /** In some cases the handshake will be parsed different depending on whether */ + protected Role role = null; + + protected Opcode continuousFrameType = null; + + public static ByteBuffer readLine( ByteBuffer buf ) { + ByteBuffer sbuf = ByteBuffer.allocate( buf.remaining() ); + byte prev = '0'; + byte cur = '0'; + while ( buf.hasRemaining() ) { + prev = cur; + cur = buf.get(); + sbuf.put( cur ); + if( prev == (byte) '\r' && cur == (byte) '\n' ) { + sbuf.limit( sbuf.position() - 2 ); + sbuf.position( 0 ); + return sbuf; + + } + } + // ensure that there wont be any bytes skipped + buf.position( buf.position() - sbuf.position() ); + return null; + } + + public static String readStringLine( ByteBuffer buf ) { + ByteBuffer b = readLine( buf ); + return b == null ? null : Charsetfunctions.stringAscii( b.array(), 0, b.limit() ); + } + + public static HandshakeBuilder translateHandshakeHttp( ByteBuffer buf, Role role ) throws InvalidHandshakeException , IncompleteHandshakeException { + HandshakeBuilder handshake; + + String line = readStringLine( buf ); + if( line == null ) + throw new IncompleteHandshakeException( buf.capacity() + 128 ); + + String[] firstLineTokens = line.split( " ", 3 );// eg. HTTP/1.1 101 Switching the Protocols + if( firstLineTokens.length != 3 ) { + throw new InvalidHandshakeException(); + } + + if( role == Role.CLIENT ) { + // translating/parsing the response from the SERVER + handshake = new HandshakeImpl1Server(); + ServerHandshakeBuilder serverhandshake = (ServerHandshakeBuilder) handshake; + serverhandshake.setHttpStatus( Short.parseShort( firstLineTokens[ 1 ] ) ); + serverhandshake.setHttpStatusMessage( firstLineTokens[ 2 ] ); + } else { + // translating/parsing the request from the CLIENT + ClientHandshakeBuilder clienthandshake = new HandshakeImpl1Client(); + clienthandshake.setResourceDescriptor( firstLineTokens[ 1 ] ); + handshake = clienthandshake; + } + + line = readStringLine( buf ); + while ( line != null && line.length() > 0 ) { + String[] pair = line.split( ":", 2 ); + if( pair.length != 2 ) + throw new InvalidHandshakeException( "not an http header" ); + handshake.put( pair[ 0 ], pair[ 1 ].replaceFirst( "^ +", "" ) ); + line = readStringLine( buf ); + } + if( line == null ) + throw new IncompleteHandshakeException(); + return handshake; + } + + public abstract HandshakeState acceptHandshakeAsClient( ClientHandshake request, ServerHandshake response ) throws InvalidHandshakeException; + + public abstract HandshakeState acceptHandshakeAsServer( ClientHandshake handshakedata ) throws InvalidHandshakeException; + + protected boolean basicAccept( Handshakedata handshakedata ) { + return handshakedata.getFieldValue( "Upgrade" ).equalsIgnoreCase( "websocket" ) && handshakedata.getFieldValue( "Connection" ).toLowerCase( Locale.ENGLISH ).contains( "upgrade" ); + } + + public abstract ByteBuffer createBinaryFrame( Framedata framedata ); // TODO Allow to send data on the base of an Iterator or InputStream + + public abstract List createFrames( ByteBuffer binary, boolean mask ); + + public abstract List createFrames( String text, boolean mask ); + + public List continuousFrame( Opcode op, ByteBuffer buffer, boolean fin ) { + if(op != Opcode.BINARY && op != Opcode.TEXT) { + throw new IllegalArgumentException( "Only Opcode.BINARY or Opcode.TEXT are allowed" ); + } + + if( continuousFrameType != null ) { + continuousFrameType = Opcode.CONTINUOUS; + } else { + continuousFrameType = op; + } + + FrameBuilder bui = new FramedataImpl1( continuousFrameType ); + try { + bui.setPayload( buffer ); + } catch ( InvalidDataException e ) { + throw new RuntimeException( e ); // can only happen when one builds close frames(Opcode.Close) + } + bui.setFin( fin ); + if( fin ) { + continuousFrameType = null; + } else { + continuousFrameType = op; + } + return Collections.singletonList( (Framedata) bui ); + } + + public abstract void reset(); + + public List createHandshake( Handshakedata handshakedata, Role ownrole ) { + return createHandshake( handshakedata, ownrole, true ); + } + + public List createHandshake( Handshakedata handshakedata, Role ownrole, boolean withcontent ) { + StringBuilder bui = new StringBuilder( 100 ); + if( handshakedata instanceof ClientHandshake ) { + bui.append( "GET " ); + bui.append( ( (ClientHandshake) handshakedata ).getResourceDescriptor() ); + bui.append( " HTTP/1.1" ); + } else if( handshakedata instanceof ServerHandshake ) { + bui.append("HTTP/1.1 101 ").append(((ServerHandshake) handshakedata).getHttpStatusMessage()); + } else { + throw new RuntimeException( "unknown role" ); + } + bui.append( "\r\n" ); + Iterator it = handshakedata.iterateHttpFields(); + while ( it.hasNext() ) { + String fieldname = it.next(); + String fieldvalue = handshakedata.getFieldValue( fieldname ); + bui.append( fieldname ); + bui.append( ": " ); + bui.append( fieldvalue ); + bui.append( "\r\n" ); + } + bui.append( "\r\n" ); + byte[] httpheader = Charsetfunctions.asciiBytes( bui.toString() ); + + byte[] content = withcontent ? handshakedata.getContent() : null; + ByteBuffer bytebuffer = ByteBuffer.allocate( ( content == null ? 0 : content.length ) + httpheader.length ); + bytebuffer.put( httpheader ); + if( content != null ) + bytebuffer.put( content ); + bytebuffer.flip(); + return Collections.singletonList( bytebuffer ); + } + + public abstract ClientHandshakeBuilder postProcessHandshakeRequestAsClient( ClientHandshakeBuilder request ) throws InvalidHandshakeException; + + public abstract HandshakeBuilder postProcessHandshakeResponseAsServer( ClientHandshake request, ServerHandshakeBuilder response ) throws InvalidHandshakeException; + + public abstract List translateFrame( ByteBuffer buffer ) throws InvalidDataException; + + public abstract CloseHandshakeType getCloseHandshakeType(); + + /** + * Drafts must only be by one websocket at all. To prevent drafts to be used more than once the Websocket implementation should call this method in order to create a new usable version of a given draft instance.
+ * The copy can be safely used in conjunction with a new websocket connection. + * */ + public abstract Draft copyInstance(); + + public Handshakedata translateHandshake( ByteBuffer buf ) throws InvalidHandshakeException { + return translateHandshakeHttp( buf, role ); + } + + public int checkAlloc( int bytecount ) throws LimitExedeedException , InvalidDataException { + if( bytecount < 0 ) + throw new InvalidDataException( CloseFrame.PROTOCOL_ERROR, "Negative count" ); + return bytecount; + } + + public void setParseMode( Role role ) { + this.role = role; + } + + public Role getRole() { + return role; + } + +} diff --git a/src/org/java_websocket/drafts/Draft_10.java b/src/org/java_websocket/drafts/Draft_10.java new file mode 100644 index 0000000..44d369f --- /dev/null +++ b/src/org/java_websocket/drafts/Draft_10.java @@ -0,0 +1,387 @@ +package org.java_websocket.drafts; + +import org.java_websocket.WebSocket.Role; +import org.java_websocket.exceptions.*; +import org.java_websocket.framing.CloseFrameBuilder; +import org.java_websocket.framing.FrameBuilder; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; +import org.java_websocket.framing.FramedataImpl1; +import org.java_websocket.handshake.*; +import org.java_websocket.util.Base64; +import org.java_websocket.util.Charsetfunctions; + +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +public class Draft_10 extends Draft { + + private class IncompleteException extends Throwable { + + /** + * It's Serializable. + */ + private static final long serialVersionUID = 7330519489840500997L; + + private int preferedsize; + + public IncompleteException(int preferedsize) { + this.preferedsize = preferedsize; + } + + public int getPreferedSize() { + return preferedsize; + } + } + + public static int readVersion(Handshakedata handshakedata) { + String vers = handshakedata.getFieldValue("Sec-WebSocket-Version"); + if (vers.length() > 0) { + int v; + try { + v = new Integer(vers.trim()); + return v; + } catch (NumberFormatException e) { + return -1; + } + } + return -1; + } + + private ByteBuffer incompleteframe; + private Framedata fragmentedframe = null; + + private final Random reuseableRandom = new Random(); + + @Override + public HandshakeState acceptHandshakeAsClient(ClientHandshake request, ServerHandshake response) throws InvalidHandshakeException { + if (!request.hasFieldValue("Sec-WebSocket-Key") || !response.hasFieldValue("Sec-WebSocket-Accept")) + return HandshakeState.NOT_MATCHED; + + String seckey_answere = response.getFieldValue("Sec-WebSocket-Accept"); + String seckey_challenge = request.getFieldValue("Sec-WebSocket-Key"); + seckey_challenge = generateFinalKey(seckey_challenge); + + if (seckey_challenge.equals(seckey_answere)) + return HandshakeState.MATCHED; + return HandshakeState.NOT_MATCHED; + } + + @Override + public HandshakeState acceptHandshakeAsServer(ClientHandshake handshakedata) throws InvalidHandshakeException { + // Sec-WebSocket-Origin is only required for browser clients + int v = readVersion(handshakedata); + if (v == 7 || v == 8)// g + return basicAccept(handshakedata) ? HandshakeState.MATCHED : HandshakeState.NOT_MATCHED; + return HandshakeState.NOT_MATCHED; + } + + @Override + public ByteBuffer createBinaryFrame(Framedata framedata) { + ByteBuffer mes = framedata.getPayloadData(); + boolean mask = role == Role.CLIENT; // framedata.getTransfereMasked(); + int sizebytes = mes.remaining() <= 125 ? 1 : mes.remaining() <= 65535 ? 2 : 8; + ByteBuffer buf = ByteBuffer.allocate(1 + (sizebytes > 1 ? sizebytes + 1 : sizebytes) + (mask ? 4 : 0) + mes.remaining()); + byte optcode = fromOpcode(framedata.getOpcode()); + byte one = (byte) (framedata.isFin() ? -128 : 0); + one |= optcode; + buf.put(one); + byte[] payloadlengthbytes = toByteArray(mes.remaining(), sizebytes); + assert (payloadlengthbytes.length == sizebytes); + + if (sizebytes == 1) { + buf.put((byte) (payloadlengthbytes[0] | (mask ? (byte) -128 : 0))); + } else if (sizebytes == 2) { + buf.put((byte) ((byte) 126 | (mask ? (byte) -128 : 0))); + buf.put(payloadlengthbytes); + } else if (sizebytes == 8) { + buf.put((byte) ((byte) 127 | (mask ? (byte) -128 : 0))); + buf.put(payloadlengthbytes); + } else + throw new RuntimeException("Size representation not supported/specified"); + + if (mask) { + ByteBuffer maskkey = ByteBuffer.allocate(4); + maskkey.putInt(reuseableRandom.nextInt()); + buf.put(maskkey.array()); + for (int i = 0; mes.hasRemaining(); i++) { + buf.put((byte) (mes.get() ^ maskkey.get(i % 4))); + } + } else + buf.put(mes); + // translateFrame ( buf.array () , buf.array ().length ); + assert (buf.remaining() == 0) : buf.remaining(); + buf.flip(); + + return buf; + } + + @Override + public List createFrames(ByteBuffer binary, boolean mask) { + FrameBuilder curframe = new FramedataImpl1(); + try { + curframe.setPayload(binary); + } catch (InvalidDataException e) { + throw new NotSendableException(e); + } + curframe.setFin(true); + curframe.setOptcode(Opcode.BINARY); + curframe.setTransferemasked(mask); + return Collections.singletonList((Framedata) curframe); + } + + @Override + public List createFrames(String text, boolean mask) { + FrameBuilder curframe = new FramedataImpl1(); + try { + curframe.setPayload(ByteBuffer.wrap(Charsetfunctions.utf8Bytes(text))); + } catch (InvalidDataException e) { + throw new NotSendableException(e); + } + curframe.setFin(true); + curframe.setOptcode(Opcode.TEXT); + curframe.setTransferemasked(mask); + return Collections.singletonList((Framedata) curframe); + } + + private byte fromOpcode(Opcode opcode) { + if (opcode == Opcode.CONTINUOUS) + return 0; + else if (opcode == Opcode.TEXT) + return 1; + else if (opcode == Opcode.BINARY) + return 2; + else if (opcode == Opcode.CLOSING) + return 8; + else if (opcode == Opcode.PING) + return 9; + else if (opcode == Opcode.PONG) + return 10; + throw new RuntimeException("Don't know how to handle " + opcode.toString()); + } + + private String generateFinalKey(String in) { + String seckey = in.trim(); + String acc = seckey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + MessageDigest sh1; + try { + sh1 = MessageDigest.getInstance("SHA1"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + return Base64.encodeBytes(sh1.digest(acc.getBytes())); + } + + @Override + public ClientHandshakeBuilder postProcessHandshakeRequestAsClient(ClientHandshakeBuilder request) { + request.put("Upgrade", "websocket"); + request.put("Connection", "Upgrade"); // to respond to a Connection keep alives + request.put("Sec-WebSocket-Version", "8"); + + byte[] random = new byte[16]; + reuseableRandom.nextBytes(random); + request.put("Sec-WebSocket-Key", Base64.encodeBytes(random)); + + return request; + } + + @Override + public HandshakeBuilder postProcessHandshakeResponseAsServer(ClientHandshake request, ServerHandshakeBuilder response) throws InvalidHandshakeException { + response.put("Upgrade", "websocket"); + response.put("Connection", request.getFieldValue("Connection")); // to respond to a Connection keep alives + response.setHttpStatusMessage("Switching Protocols"); + String seckey = request.getFieldValue("Sec-WebSocket-Key"); + if (seckey == null) + throw new InvalidHandshakeException("missing Sec-WebSocket-Key"); + response.put("Sec-WebSocket-Accept", generateFinalKey(seckey)); + return response; + } + + private byte[] toByteArray(long val, int bytecount) { + byte[] buffer = new byte[bytecount]; + int highest = 8 * bytecount - 8; + for (int i = 0; i < bytecount; i++) { + buffer[i] = (byte) (val >>> (highest - 8 * i)); + } + return buffer; + } + + private Opcode toOpcode(byte opcode) throws InvalidFrameException { + switch (opcode) { + case 0: + return Opcode.CONTINUOUS; + case 1: + return Opcode.TEXT; + case 2: + return Opcode.BINARY; + // 3-7 are not yet defined + case 8: + return Opcode.CLOSING; + case 9: + return Opcode.PING; + case 10: + return Opcode.PONG; + // 11-15 are not yet defined + default: + throw new InvalidFrameException("unknow optcode " + (short) opcode); + } + } + + @Override + public List translateFrame(ByteBuffer buffer) throws LimitExedeedException, InvalidDataException { + List frames = new LinkedList(); + Framedata cur; + + if (incompleteframe != null) { + // complete an incomplete frame + try { + buffer.mark(); + int available_next_byte_count = buffer.remaining();// The number of bytes received + int expected_next_byte_count = incompleteframe.remaining();// The number of bytes to complete the incomplete frame + + if (expected_next_byte_count > available_next_byte_count) { + // did not receive enough bytes to complete the frame + incompleteframe.put(buffer.array(), buffer.position(), available_next_byte_count); + buffer.position(buffer.position() + available_next_byte_count); + return Collections.emptyList(); + } + incompleteframe.put(buffer.array(), buffer.position(), expected_next_byte_count); + buffer.position(buffer.position() + expected_next_byte_count); + + cur = translateSingleFrame((ByteBuffer) incompleteframe.duplicate().position(0)); + frames.add(cur); + incompleteframe = null; + } catch (IncompleteException e) { + // extending as much as suggested + int oldsize = incompleteframe.limit(); + ByteBuffer extendedframe = ByteBuffer.allocate(checkAlloc(e.getPreferedSize())); + assert (extendedframe.limit() > incompleteframe.limit()); + incompleteframe.rewind(); + extendedframe.put(incompleteframe); + incompleteframe = extendedframe; + return translateFrame(buffer); + } + } + + while (buffer.hasRemaining()) {// Read as much as possible full frames + buffer.mark(); + try { + cur = translateSingleFrame(buffer); + frames.add(cur); + } catch (IncompleteException e) { + // remember the incomplete data + buffer.reset(); + int pref = e.getPreferedSize(); + incompleteframe = ByteBuffer.allocate(checkAlloc(pref)); + incompleteframe.put(buffer); + break; + } + } + return frames; + } + + public Framedata translateSingleFrame(ByteBuffer buffer) throws IncompleteException, InvalidDataException { + int maxpacketsize = buffer.remaining(); + int realpacketsize = 2; + if (maxpacketsize < realpacketsize) + throw new IncompleteException(realpacketsize); + byte b1 = buffer.get( /*0*/); + boolean FIN = b1 >> 8 != 0; + byte rsv = (byte) ((b1 & ~(byte) 128) >> 4); + if (rsv != 0) + throw new InvalidFrameException("bad rsv " + rsv); + byte b2 = buffer.get( /*1*/); + boolean MASK = (b2 & -128) != 0; + int payloadlength = (byte) (b2 & ~(byte) 128); + Opcode optcode = toOpcode((byte) (b1 & 15)); + + if (!FIN) { + if (optcode == Opcode.PING || optcode == Opcode.PONG || optcode == Opcode.CLOSING) { + throw new InvalidFrameException("control frames may no be fragmented"); + } + } + + if (payloadlength >= 0 && payloadlength <= 125) { + } else { + if (optcode == Opcode.PING || optcode == Opcode.PONG || optcode == Opcode.CLOSING) { + throw new InvalidFrameException("more than 125 octets"); + } + if (payloadlength == 126) { + realpacketsize += 2; // additional length bytes + if (maxpacketsize < realpacketsize) + throw new IncompleteException(realpacketsize); + byte[] sizebytes = new byte[3]; + sizebytes[1] = buffer.get( /*1 + 1*/); + sizebytes[2] = buffer.get( /*1 + 2*/); + payloadlength = new BigInteger(sizebytes).intValue(); + } else { + realpacketsize += 8; // additional length bytes + if (maxpacketsize < realpacketsize) + throw new IncompleteException(realpacketsize); + byte[] bytes = new byte[8]; + for (int i = 0; i < 8; i++) { + bytes[i] = buffer.get( /*1 + i*/); + } + long length = new BigInteger(bytes).longValue(); + if (length > Integer.MAX_VALUE) { + throw new LimitExedeedException("Payloadsize is to big..."); + } else { + payloadlength = (int) length; + } + } + } + + // int maskskeystart = foff + realpacketsize; + realpacketsize += (MASK ? 4 : 0); + // int payloadstart = foff + realpacketsize; + realpacketsize += payloadlength; + + if (maxpacketsize < realpacketsize) + throw new IncompleteException(realpacketsize); + + ByteBuffer payload = ByteBuffer.allocate(checkAlloc(payloadlength)); + if (MASK) { + byte[] maskskey = new byte[4]; + buffer.get(maskskey); + for (int i = 0; i < payloadlength; i++) { + payload.put((byte) (buffer.get( /*payloadstart + i*/) ^ maskskey[i % 4])); + } + } else { + payload.put(buffer.array(), buffer.position(), payload.limit()); + buffer.position(buffer.position() + payload.limit()); + } + + FrameBuilder frame; + if (optcode == Opcode.CLOSING) { + frame = new CloseFrameBuilder(); + } else { + frame = new FramedataImpl1(); + frame.setFin(FIN); + frame.setOptcode(optcode); + } + payload.flip(); + frame.setPayload(payload); + return frame; + } + + @Override + public void reset() { + incompleteframe = null; + } + + @Override + public Draft copyInstance() { + return new Draft_10(); + } + + @Override + public CloseHandshakeType getCloseHandshakeType() { + return CloseHandshakeType.TWOWAY; + } +} diff --git a/src/org/java_websocket/drafts/Draft_17.java b/src/org/java_websocket/drafts/Draft_17.java new file mode 100644 index 0000000..5c4088f --- /dev/null +++ b/src/org/java_websocket/drafts/Draft_17.java @@ -0,0 +1,28 @@ +package org.java_websocket.drafts; + +import org.java_websocket.exceptions.InvalidHandshakeException; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.ClientHandshakeBuilder; + +public class Draft_17 extends Draft_10 { + @Override + public HandshakeState acceptHandshakeAsServer( ClientHandshake handshakedata ) throws InvalidHandshakeException { + int v = readVersion( handshakedata ); + if( v == 13 ) + return HandshakeState.MATCHED; + return HandshakeState.NOT_MATCHED; + } + + @Override + public ClientHandshakeBuilder postProcessHandshakeRequestAsClient( ClientHandshakeBuilder request ) { + super.postProcessHandshakeRequestAsClient( request ); + request.put( "Sec-WebSocket-Version", "13" );// overwriting the previous + return request; + } + + @Override + public Draft copyInstance() { + return new Draft_17(); + } + +} diff --git a/src/org/java_websocket/drafts/Draft_75.java b/src/org/java_websocket/drafts/Draft_75.java new file mode 100644 index 0000000..947a35e --- /dev/null +++ b/src/org/java_websocket/drafts/Draft_75.java @@ -0,0 +1,206 @@ +package org.java_websocket.drafts; + +import java.nio.ByteBuffer; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidFrameException; +import org.java_websocket.exceptions.InvalidHandshakeException; +import org.java_websocket.exceptions.LimitExedeedException; +import org.java_websocket.exceptions.NotSendableException; +import org.java_websocket.framing.CloseFrame; +import org.java_websocket.framing.FrameBuilder; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; +import org.java_websocket.framing.FramedataImpl1; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.ClientHandshakeBuilder; +import org.java_websocket.handshake.HandshakeBuilder; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.handshake.ServerHandshakeBuilder; +import org.java_websocket.util.Charsetfunctions; + +public class Draft_75 extends Draft { + + /** + * The byte representing CR, or Carriage Return, or \r + */ + public static final byte CR = (byte) 0x0D; + /** + * The byte representing LF, or Line Feed, or \n + */ + public static final byte LF = (byte) 0x0A; + /** + * The byte representing the beginning of a WebSocket text frame. + */ + public static final byte START_OF_FRAME = (byte) 0x00; + /** + * The byte representing the end of a WebSocket text frame. + */ + public static final byte END_OF_FRAME = (byte) 0xFF; + + /** Is only used to detect protocol violations */ + protected boolean readingState = false; + + protected List readyframes = new LinkedList(); + protected ByteBuffer currentFrame; + + private final Random reuseableRandom = new Random(); + + @Override + public HandshakeState acceptHandshakeAsClient( ClientHandshake request, ServerHandshake response ) { + return request.getFieldValue( "WebSocket-Origin" ).equals( response.getFieldValue( "Origin" ) ) && basicAccept( response ) ? HandshakeState.MATCHED : HandshakeState.NOT_MATCHED; + } + + @Override + public HandshakeState acceptHandshakeAsServer( ClientHandshake handshakedata ) { + if( handshakedata.hasFieldValue( "Origin" ) && basicAccept( handshakedata ) ) { + return HandshakeState.MATCHED; + } + return HandshakeState.NOT_MATCHED; + } + + @Override + public ByteBuffer createBinaryFrame( Framedata framedata ) { + if( framedata.getOpcode() != Opcode.TEXT ) { + throw new RuntimeException( "only text frames supported" ); + } + + ByteBuffer pay = framedata.getPayloadData(); + ByteBuffer b = ByteBuffer.allocate( pay.remaining() + 2 ); + b.put( START_OF_FRAME ); + pay.mark(); + b.put( pay ); + pay.reset(); + b.put( END_OF_FRAME ); + b.flip(); + return b; + } + + @Override + public List createFrames( ByteBuffer binary, boolean mask ) { + throw new RuntimeException( "not yet implemented" ); + } + + @Override + public List createFrames( String text, boolean mask ) { + FrameBuilder frame = new FramedataImpl1(); + try { + frame.setPayload( ByteBuffer.wrap( Charsetfunctions.utf8Bytes( text ) ) ); + } catch ( InvalidDataException e ) { + throw new NotSendableException( e ); + } + frame.setFin( true ); + frame.setOptcode( Opcode.TEXT ); + frame.setTransferemasked( mask ); + return Collections.singletonList( (Framedata) frame ); + } + + @Override + public ClientHandshakeBuilder postProcessHandshakeRequestAsClient( ClientHandshakeBuilder request ) throws InvalidHandshakeException { + request.put( "Upgrade", "WebSocket" ); + request.put( "Connection", "Upgrade" ); + if( !request.hasFieldValue( "Origin" ) ) { + request.put( "Origin", "random" + reuseableRandom.nextInt() ); + } + + return request; + } + + @Override + public HandshakeBuilder postProcessHandshakeResponseAsServer( ClientHandshake request, ServerHandshakeBuilder response ) throws InvalidHandshakeException { + response.setHttpStatusMessage( "Web Socket Protocol Handshake" ); + response.put( "Upgrade", "WebSocket" ); + response.put( "Connection", request.getFieldValue( "Connection" ) ); // to respond to a Connection keep alive + response.put( "WebSocket-Origin", request.getFieldValue( "Origin" ) ); + String location = "ws://" + request.getFieldValue( "Host" ) + request.getResourceDescriptor(); + response.put( "WebSocket-Location", location ); + // TODO handle Sec-WebSocket-Protocol and Set-Cookie + return response; + } + + protected List translateRegularFrame( ByteBuffer buffer ) throws InvalidDataException { + + while ( buffer.hasRemaining() ) { + byte newestByte = buffer.get(); + if( newestByte == START_OF_FRAME ) { // Beginning of Frame + if( readingState ) + throw new InvalidFrameException( "unexpected START_OF_FRAME" ); + readingState = true; + } else if( newestByte == END_OF_FRAME ) { // End of Frame + if( !readingState ) + throw new InvalidFrameException( "unexpected END_OF_FRAME" ); + // currentFrame will be null if END_OF_FRAME was send directly after + // START_OF_FRAME, thus we will send 'null' as the sent message. + if( this.currentFrame != null ) { + currentFrame.flip(); + FramedataImpl1 curframe = new FramedataImpl1(); + curframe.setPayload( currentFrame ); + curframe.setFin( true ); + curframe.setOptcode( Opcode.TEXT ); + readyframes.add( curframe ); + this.currentFrame = null; + buffer.mark(); + } + readingState = false; + } else if( readingState ) { // Regular frame data, add to current frame buffer //TODO This code is very expensive and slow + if( currentFrame == null ) { + currentFrame = createBuffer(); + } else if( !currentFrame.hasRemaining() ) { + currentFrame = increaseBuffer( currentFrame ); + } + currentFrame.put( newestByte ); + } else { + return null; + } + } + + // if no error occurred this block will be reached + /*if( readingState ) { + checkAlloc(currentFrame.position()+1); + }*/ + + List frames = readyframes; + readyframes = new LinkedList(); + return frames; + } + + @Override + public List translateFrame( ByteBuffer buffer ) throws InvalidDataException { + List frames = translateRegularFrame( buffer ); + if( frames == null ) { + throw new InvalidDataException( CloseFrame.PROTOCOL_ERROR ); + } + return frames; + } + + @Override + public void reset() { + readingState = false; + this.currentFrame = null; + } + + @Override + public CloseHandshakeType getCloseHandshakeType() { + return CloseHandshakeType.NONE; + } + + public ByteBuffer createBuffer() { + return ByteBuffer.allocate( INITIAL_FAMESIZE ); + } + + public ByteBuffer increaseBuffer( ByteBuffer full ) throws LimitExedeedException , InvalidDataException { + full.flip(); + ByteBuffer newbuffer = ByteBuffer.allocate( checkAlloc( full.capacity() * 2 ) ); + newbuffer.put( full ); + return newbuffer; + } + + @Override + public Draft copyInstance() { + return new Draft_75(); + } +} diff --git a/src/org/java_websocket/drafts/Draft_76.java b/src/org/java_websocket/drafts/Draft_76.java new file mode 100644 index 0000000..8966fa3 --- /dev/null +++ b/src/org/java_websocket/drafts/Draft_76.java @@ -0,0 +1,242 @@ +package org.java_websocket.drafts; + +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +import org.java_websocket.WebSocket.Role; +import org.java_websocket.exceptions.IncompleteHandshakeException; +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidFrameException; +import org.java_websocket.exceptions.InvalidHandshakeException; +import org.java_websocket.framing.CloseFrame; +import org.java_websocket.framing.CloseFrameBuilder; +import org.java_websocket.framing.Framedata; +import org.java_websocket.framing.Framedata.Opcode; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.ClientHandshakeBuilder; +import org.java_websocket.handshake.HandshakeBuilder; +import org.java_websocket.handshake.Handshakedata; +import org.java_websocket.handshake.ServerHandshake; +import org.java_websocket.handshake.ServerHandshakeBuilder; + +public class Draft_76 extends Draft_75 { + private boolean failed = false; + private static final byte[] closehandshake = { -1, 0 }; + + private final Random reuseableRandom = new Random(); + + + public static byte[] createChallenge( String key1, String key2, byte[] key3 ) throws InvalidHandshakeException { + byte[] part1 = getPart( key1 ); + byte[] part2 = getPart( key2 ); + byte[] challenge = new byte[ 16 ]; + challenge[ 0 ] = part1[ 0 ]; + challenge[ 1 ] = part1[ 1 ]; + challenge[ 2 ] = part1[ 2 ]; + challenge[ 3 ] = part1[ 3 ]; + challenge[ 4 ] = part2[ 0 ]; + challenge[ 5 ] = part2[ 1 ]; + challenge[ 6 ] = part2[ 2 ]; + challenge[ 7 ] = part2[ 3 ]; + challenge[ 8 ] = key3[ 0 ]; + challenge[ 9 ] = key3[ 1 ]; + challenge[ 10 ] = key3[ 2 ]; + challenge[ 11 ] = key3[ 3 ]; + challenge[ 12 ] = key3[ 4 ]; + challenge[ 13 ] = key3[ 5 ]; + challenge[ 14 ] = key3[ 6 ]; + challenge[ 15 ] = key3[ 7 ]; + MessageDigest md5; + try { + md5 = MessageDigest.getInstance( "MD5" ); + } catch ( NoSuchAlgorithmException e ) { + throw new RuntimeException( e ); + } + return md5.digest( challenge ); + } + + private static String generateKey() { + Random r = new Random(); + long maxNumber = 4294967295L; + long spaces = r.nextInt( 12 ) + 1; + int max = new Long( maxNumber / spaces ).intValue(); + max = Math.abs( max ); + int number = r.nextInt( max ) + 1; + long product = number * spaces; + String key = Long.toString( product ); + // always insert atleast one random character + int numChars = r.nextInt( 12 ) + 1; + for( int i = 0 ; i < numChars ; i++ ) { + int position = r.nextInt( key.length() ); + position = Math.abs( position ); + char randChar = (char) ( r.nextInt( 95 ) + 33 ); + // exclude numbers here + if( randChar >= 48 && randChar <= 57 ) { + randChar -= 15; + } + key = new StringBuilder( key ).insert( position, randChar ).toString(); + } + for( int i = 0 ; i < spaces ; i++ ) { + int position = r.nextInt( key.length() - 1 ) + 1; + position = Math.abs( position ); + key = new StringBuilder( key ).insert( position, "\u0020" ).toString(); + } + return key; + } + + private static byte[] getPart( String key ) throws InvalidHandshakeException { + try { + long keyNumber = Long.parseLong( key.replaceAll( "[^0-9]", "" ) ); + long keySpace = key.split( "\u0020" ).length - 1; + if( keySpace == 0 ) { + throw new InvalidHandshakeException( "invalid Sec-WebSocket-Key (/key2/)" ); + } + long part = keyNumber / keySpace; + return new byte[]{ (byte) ( part >> 24 ), (byte) ( ( part << 8 ) >> 24 ), (byte) ( ( part << 16 ) >> 24 ), (byte) ( ( part << 24 ) >> 24 ) }; + } catch ( NumberFormatException e ) { + throw new InvalidHandshakeException( "invalid Sec-WebSocket-Key (/key1/ or /key2/)" ); + } + } + + @Override + public HandshakeState acceptHandshakeAsClient( ClientHandshake request, ServerHandshake response ) { + if( failed ) { + return HandshakeState.NOT_MATCHED; + } + + try { + if( !response.getFieldValue( "Sec-WebSocket-Origin" ).equals( request.getFieldValue( "Origin" ) ) || !basicAccept( response ) ) { + return HandshakeState.NOT_MATCHED; + } + byte[] content = response.getContent(); + if( content == null || content.length == 0 ) { + throw new IncompleteHandshakeException(); + } + if( Arrays.equals( content, createChallenge( request.getFieldValue( "Sec-WebSocket-Key1" ), request.getFieldValue( "Sec-WebSocket-Key2" ), request.getContent() ) ) ) { + return HandshakeState.MATCHED; + } else { + return HandshakeState.NOT_MATCHED; + } + } catch ( InvalidHandshakeException e ) { + throw new RuntimeException( "bad handshakerequest", e ); + } + } + + @Override + public HandshakeState acceptHandshakeAsServer( ClientHandshake handshakedata ) { + if( handshakedata.getFieldValue( "Upgrade" ).equals( "WebSocket" ) && handshakedata.getFieldValue( "Connection" ).contains( "Upgrade" ) && handshakedata.getFieldValue( "Sec-WebSocket-Key1" ).length() > 0 && !handshakedata.getFieldValue( "Sec-WebSocket-Key2" ).isEmpty() && handshakedata.hasFieldValue( "Origin" ) ) + return HandshakeState.MATCHED; + return HandshakeState.NOT_MATCHED; + } + + @Override + public ClientHandshakeBuilder postProcessHandshakeRequestAsClient( ClientHandshakeBuilder request ) { + request.put( "Upgrade", "WebSocket" ); + request.put( "Connection", "Upgrade" ); + request.put( "Sec-WebSocket-Key1", generateKey() ); + request.put( "Sec-WebSocket-Key2", generateKey() ); + + if( !request.hasFieldValue( "Origin" ) ) { + request.put( "Origin", "random" + reuseableRandom.nextInt() ); + } + + byte[] key3 = new byte[ 8 ]; + reuseableRandom.nextBytes( key3 ); + request.setContent( key3 ); + return request; + + } + + @Override + public HandshakeBuilder postProcessHandshakeResponseAsServer( ClientHandshake request, ServerHandshakeBuilder response ) throws InvalidHandshakeException { + response.setHttpStatusMessage( "WebSocket Protocol Handshake" ); + response.put( "Upgrade", "WebSocket" ); + response.put( "Connection", request.getFieldValue( "Connection" ) ); // to respond to a Connection keep alive + response.put( "Sec-WebSocket-Origin", request.getFieldValue( "Origin" ) ); + String location = "ws://" + request.getFieldValue( "Host" ) + request.getResourceDescriptor(); + response.put( "Sec-WebSocket-Location", location ); + String key1 = request.getFieldValue( "Sec-WebSocket-Key1" ); + String key2 = request.getFieldValue( "Sec-WebSocket-Key2" ); + byte[] key3 = request.getContent(); + if( key1 == null || key2 == null || key3 == null || key3.length != 8 ) { + throw new InvalidHandshakeException( "Bad keys" ); + } + response.setContent( createChallenge( key1, key2, key3 ) ); + return response; + } + + @Override + public Handshakedata translateHandshake( ByteBuffer buf ) throws InvalidHandshakeException { + + HandshakeBuilder bui = translateHandshakeHttp( buf, role ); + // the first drafts are lacking a protocol number which makes them difficult to distinguish. Sec-WebSocket-Key1 is typical for draft76 + if( ( bui.hasFieldValue( "Sec-WebSocket-Key1" ) || role == Role.CLIENT ) && !bui.hasFieldValue( "Sec-WebSocket-Version" ) ) { + byte[] key3 = new byte[ role == Role.SERVER ? 8 : 16 ]; + try { + buf.get( key3 ); + } catch ( BufferUnderflowException e ) { + throw new IncompleteHandshakeException( buf.capacity() + 16 ); + } + bui.setContent( key3 ); + + } + return bui; + } + + @Override + public List translateFrame( ByteBuffer buffer ) throws InvalidDataException { + buffer.mark(); + List frames = super.translateRegularFrame( buffer ); + if( frames == null ) { + buffer.reset(); + frames = readyframes; + readingState = true; + if( currentFrame == null ) + currentFrame = ByteBuffer.allocate( 2 ); + else { + throw new InvalidFrameException(); + } + if( buffer.remaining() > currentFrame.remaining() ) { + throw new InvalidFrameException(); + } else { + currentFrame.put( buffer ); + } + if( !currentFrame.hasRemaining() ) { + if( Arrays.equals( currentFrame.array(), closehandshake ) ) { + frames.add( new CloseFrameBuilder( CloseFrame.NORMAL ) ); + return frames; + } + else{ + throw new InvalidFrameException(); + } + } else { + readyframes = new LinkedList(); + return frames; + } + } else { + return frames; + } + } + @Override + public ByteBuffer createBinaryFrame( Framedata framedata ) { + if( framedata.getOpcode() == Opcode.CLOSING ) + return ByteBuffer.wrap( closehandshake ); + return super.createBinaryFrame( framedata ); + } + + @Override + public CloseHandshakeType getCloseHandshakeType() { + return CloseHandshakeType.ONEWAY; + } + + @Override + public Draft copyInstance() { + return new Draft_76(); + } +} diff --git a/src/org/java_websocket/exceptions/IncompleteHandshakeException.java b/src/org/java_websocket/exceptions/IncompleteHandshakeException.java new file mode 100644 index 0000000..f9c6c7c --- /dev/null +++ b/src/org/java_websocket/exceptions/IncompleteHandshakeException.java @@ -0,0 +1,45 @@ +package org.java_websocket.exceptions; + +/** + * exception which indicates that a incomplete handshake was recieved + */ +public class IncompleteHandshakeException extends RuntimeException { + + /** + * Serializable + */ + private static final long serialVersionUID = 7906596804233893092L; + + /** + * attribut which size of handshake would have been prefered + */ + private int preferedSize; + + /** + * constructor for a IncompleteHandshakeException + *

+ * @param preferedSize the prefered size + */ + public IncompleteHandshakeException(int preferedSize) { + this.preferedSize = preferedSize; + } + + /** + * constructor for a IncompleteHandshakeException + *

+ * preferedSize will be 0 + */ + public IncompleteHandshakeException() { + this.preferedSize = 0; + } + + /** + * Getter preferedSize + * + * @return the preferedSize + */ + public int getPreferedSize() { + return preferedSize; + } + +} diff --git a/src/org/java_websocket/exceptions/InvalidDataException.java b/src/org/java_websocket/exceptions/InvalidDataException.java new file mode 100644 index 0000000..0e377f4 --- /dev/null +++ b/src/org/java_websocket/exceptions/InvalidDataException.java @@ -0,0 +1,70 @@ +package org.java_websocket.exceptions; + +/** + * exception which indicates that a invalid data was recieved + */ +public class InvalidDataException extends Exception { + + /** + * Serializable + */ + private static final long serialVersionUID = 3731842424390998726L; + + /** + * attribut which closecode will be returned + */ + private int closecode; + + /** + * constructor for a InvalidDataException + * + * @param closecode the closecode which will be returned + */ + public InvalidDataException(int closecode) { + this.closecode = closecode; + } + + /** + * constructor for a InvalidDataException. + * + * @param closecode the closecode which will be returned. + * @param s the detail message. + */ + public InvalidDataException(int closecode, String s) { + super(s); + this.closecode = closecode; + } + + /** + * constructor for a InvalidDataException. + * + * @param closecode the closecode which will be returned. + * @param t the throwable causing this exception. + */ + public InvalidDataException(int closecode, Throwable t) { + super(t); + this.closecode = closecode; + } + + /** + * constructor for a InvalidDataException. + * + * @param closecode the closecode which will be returned. + * @param s the detail message. + * @param t the throwable causing this exception. + */ + public InvalidDataException(int closecode, String s, Throwable t) { + super(s, t); + this.closecode = closecode; + } + + /** + * Getter closecode + * + * @return the closecode + */ + public int getCloseCode() { + return closecode; + } + +} diff --git a/src/org/java_websocket/exceptions/InvalidFrameException.java b/src/org/java_websocket/exceptions/InvalidFrameException.java new file mode 100644 index 0000000..8ae97c3 --- /dev/null +++ b/src/org/java_websocket/exceptions/InvalidFrameException.java @@ -0,0 +1,57 @@ +package org.java_websocket.exceptions; + +import org.java_websocket.framing.CloseFrame; + +/** + * exception which indicates that a invalid frame was recieved (CloseFrame.PROTOCOL_ERROR) + */ +public class InvalidFrameException extends InvalidDataException { + + /** + * Serializable + */ + private static final long serialVersionUID = -9016496369828887591L; + + /** + * constructor for a InvalidFrameException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + */ + public InvalidFrameException() { + super(CloseFrame.PROTOCOL_ERROR); + } + + /** + * constructor for a InvalidFrameException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + * + * @param s the detail message. + */ + public InvalidFrameException(String s) { + super(CloseFrame.PROTOCOL_ERROR, s); + } + + /** + * constructor for a InvalidFrameException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + * + * @param t the throwable causing this exception. + */ + public InvalidFrameException(Throwable t) { + super(CloseFrame.PROTOCOL_ERROR, t); + } + + /** + * constructor for a InvalidFrameException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + * + * @param s the detail message. + * @param t the throwable causing this exception. + */ + public InvalidFrameException(String s, Throwable t) { + super(CloseFrame.PROTOCOL_ERROR, s, t); + } +} diff --git a/src/org/java_websocket/exceptions/InvalidHandshakeException.java b/src/org/java_websocket/exceptions/InvalidHandshakeException.java new file mode 100644 index 0000000..015c4a6 --- /dev/null +++ b/src/org/java_websocket/exceptions/InvalidHandshakeException.java @@ -0,0 +1,58 @@ +package org.java_websocket.exceptions; + +import org.java_websocket.framing.CloseFrame; + +/** + * exception which indicates that a invalid handshake was recieved (CloseFrame.PROTOCOL_ERROR) + */ +public class InvalidHandshakeException extends InvalidDataException { + + /** + * Serializable + */ + private static final long serialVersionUID = -1426533877490484964L; + + /** + * constructor for a InvalidHandshakeException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + */ + public InvalidHandshakeException() { + super(CloseFrame.PROTOCOL_ERROR); + } + + /** + * constructor for a InvalidHandshakeException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + * + * @param s the detail message. + * @param t the throwable causing this exception. + */ + public InvalidHandshakeException(String s, Throwable t) { + super(CloseFrame.PROTOCOL_ERROR, s, t); + } + + /** + * constructor for a InvalidHandshakeException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + * + * @param s the detail message. + */ + public InvalidHandshakeException(String s) { + super(CloseFrame.PROTOCOL_ERROR, s); + } + + /** + * constructor for a InvalidHandshakeException + *

+ * calling InvalidDataException with closecode PROTOCOL_ERROR + * + * @param t the throwable causing this exception. + */ + public InvalidHandshakeException(Throwable t) { + super(CloseFrame.PROTOCOL_ERROR, t); + } + +} diff --git a/src/org/java_websocket/exceptions/LimitExedeedException.java b/src/org/java_websocket/exceptions/LimitExedeedException.java new file mode 100644 index 0000000..f7fd811 --- /dev/null +++ b/src/org/java_websocket/exceptions/LimitExedeedException.java @@ -0,0 +1,35 @@ +package org.java_websocket.exceptions; + +import org.java_websocket.framing.CloseFrame; + +/** + * exception which indicates that the message limited was exedeeded (CloseFrame.TOOBIG) + */ +public class LimitExedeedException extends InvalidDataException { + + /** + * Serializable + */ + private static final long serialVersionUID = 6908339749836826785L; + + /** + * constructor for a LimitExedeedException + *

+ * calling InvalidDataException with closecode TOOBIG + */ + public LimitExedeedException() { + super(CloseFrame.TOOBIG); + } + + /** + * constructor for a LimitExedeedException + *

+ * calling InvalidDataException with closecode TOOBIG + * + * @param s the detail message. + */ + public LimitExedeedException(String s) { + super(CloseFrame.TOOBIG, s); + } + +} diff --git a/src/org/java_websocket/exceptions/NotSendableException.java b/src/org/java_websocket/exceptions/NotSendableException.java new file mode 100644 index 0000000..94a26f8 --- /dev/null +++ b/src/org/java_websocket/exceptions/NotSendableException.java @@ -0,0 +1,48 @@ +package org.java_websocket.exceptions; + +/** + * exception which indicates the frame payload is not sendable + */ +public class NotSendableException extends RuntimeException { + + /** + * Serializable + */ + private static final long serialVersionUID = -6468967874576651628L; + + /** + * constructor for a NotSendableException + */ + public NotSendableException() { + super(); + } + + /** + * constructor for a NotSendableException + * + * @param s the detail message. + */ + public NotSendableException(String s) { + super(s); + } + + /** + * constructor for a NotSendableException + * + * @param t the throwable causing this exception. + */ + public NotSendableException(Throwable t) { + super(t); + } + + /** + * constructor for a NotSendableException + * + * @param s the detail message. + * @param t the throwable causing this exception. + */ + public NotSendableException(String s, Throwable t) { + super(s, t); + } + +} diff --git a/src/org/java_websocket/exceptions/WebsocketNotConnectedException.java b/src/org/java_websocket/exceptions/WebsocketNotConnectedException.java new file mode 100644 index 0000000..10c8720 --- /dev/null +++ b/src/org/java_websocket/exceptions/WebsocketNotConnectedException.java @@ -0,0 +1,19 @@ +package org.java_websocket.exceptions; + +/** + * exception which indicates the websocket is not yet connected (READYSTATE.OPEN) + */ +public class WebsocketNotConnectedException extends RuntimeException { + + /** + * Serializable + */ + private static final long serialVersionUID = -785314021592982715L; + + /** + * constructor for a WebsocketNotConnectedException + */ + public WebsocketNotConnectedException() { + super(); + } +} diff --git a/src/org/java_websocket/framing/CloseFrame.java b/src/org/java_websocket/framing/CloseFrame.java new file mode 100644 index 0000000..f253b8d --- /dev/null +++ b/src/org/java_websocket/framing/CloseFrame.java @@ -0,0 +1,98 @@ +package org.java_websocket.framing; + +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidFrameException; + +public interface CloseFrame extends Framedata { + /** + * indicates a normal closure, meaning whatever purpose the + * connection was established for has been fulfilled. + */ + public static final int NORMAL = 1000; + /** + * 1001 indicates that an endpoint is "going away", such as a server + * going down, or a browser having navigated away from a page. + */ + public static final int GOING_AWAY = 1001; + /** + * 1002 indicates that an endpoint is terminating the connection due + * to a protocol error. + */ + public static final int PROTOCOL_ERROR = 1002; + /** + * 1003 indicates that an endpoint is terminating the connection + * because it has received a type of data it cannot accept (e.g. an + * endpoint that understands only text data MAY send this if it + * receives a binary message). + */ + public static final int REFUSE = 1003; + /*1004: Reserved. The specific meaning might be defined in the future.*/ + /** + * 1005 is a reserved value and MUST NOT be set as a status code in a + * Close control frame by an endpoint. It is designated for use in + * applications expecting a status code to indicate that no status + * code was actually present. + */ + public static final int NOCODE = 1005; + /** + * 1006 is a reserved value and MUST NOT be set as a status code in a + * Close control frame by an endpoint. It is designated for use in + * applications expecting a status code to indicate that the + * connection was closed abnormally, e.g. without sending or + * receiving a Close control frame. + */ + public static final int ABNORMAL_CLOSE = 1006; + /** + * 1007 indicates that an endpoint is terminating the connection + * because it has received data within a message that was not + * consistent with the type of the message (e.g., non-UTF-8 [RFC3629] + * data within a text message). + */ + public static final int NO_UTF8 = 1007; + /** + * 1008 indicates that an endpoint is terminating the connection + * because it has received a message that violates its policy. This + * is a generic status code that can be returned when there is no + * other more suitable status code (e.g. 1003 or 1009), or if there + * is a need to hide specific details about the policy. + */ + public static final int POLICY_VALIDATION = 1008; + /** + * 1009 indicates that an endpoint is terminating the connection + * because it has received a message which is too big for it to + * process. + */ + public static final int TOOBIG = 1009; + /** + * 1010 indicates that an endpoint (client) is terminating the + * connection because it has expected the server to negotiate one or + * more extension, but the server didn't return them in the response + * message of the WebSocket handshake. The list of extensions which + * are needed SHOULD appear in the /reason/ part of the Close frame. + * Note that this status code is not used by the server, because it + * can fail the WebSocket handshake instead. + */ + public static final int EXTENSION = 1010; + /** + * 1011 indicates that a server is terminating the connection because + * it encountered an unexpected condition that prevented it from + * fulfilling the request. + **/ + public static final int UNEXPECTED_CONDITION = 1011; + /** + * 1015 is a reserved value and MUST NOT be set as a status code in a + * Close control frame by an endpoint. It is designated for use in + * applications expecting a status code to indicate that the + * connection was closed due to a failure to perform a TLS handshake + * (e.g., the server certificate can't be verified). + **/ + public static final int TLS_ERROR = 1015; + + /** The connection had never been established */ + public static final int NEVER_CONNECTED = -1; + public static final int BUGGYCLOSE = -2; + public static final int FLASHPOLICY = -3; + + public int getCloseCode() throws InvalidFrameException; + public String getMessage() throws InvalidDataException; +} diff --git a/src/org/java_websocket/framing/CloseFrameBuilder.java b/src/org/java_websocket/framing/CloseFrameBuilder.java new file mode 100644 index 0000000..fee1b54 --- /dev/null +++ b/src/org/java_websocket/framing/CloseFrameBuilder.java @@ -0,0 +1,123 @@ +package org.java_websocket.framing; + +import java.nio.ByteBuffer; + +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidFrameException; +import org.java_websocket.util.Charsetfunctions; + +public class CloseFrameBuilder extends FramedataImpl1 implements CloseFrame { + + static final ByteBuffer emptybytebuffer = ByteBuffer.allocate( 0 ); + + private int code; + private String reason; + + public CloseFrameBuilder() { + super( Opcode.CLOSING ); + setFin( true ); + } + + public CloseFrameBuilder( int code ) throws InvalidDataException { + super( Opcode.CLOSING ); + setFin( true ); + setCodeAndMessage( code, "" ); + } + + public CloseFrameBuilder( int code , String m ) throws InvalidDataException { + super( Opcode.CLOSING ); + setFin( true ); + setCodeAndMessage( code, m ); + } + + private void setCodeAndMessage( int code, String m ) throws InvalidDataException { + if( m == null ) { + m = ""; + } + // CloseFrame.TLS_ERROR is not allowed to be transfered over the wire + if( code == CloseFrame.TLS_ERROR ) { + code = CloseFrame.NOCODE; + m = ""; + } + if( code == CloseFrame.NOCODE ) { + if( 0 < m.length() ) { + throw new InvalidDataException( PROTOCOL_ERROR, "A close frame must have a closecode if it has a reason" ); + } + return;// empty payload + } + + byte[] by = Charsetfunctions.utf8Bytes( m ); + ByteBuffer buf = ByteBuffer.allocate( 4 ); + buf.putInt( code ); + buf.position( 2 ); + ByteBuffer pay = ByteBuffer.allocate( 2 + by.length ); + pay.put( buf ); + pay.put( by ); + pay.rewind(); + setPayload( pay ); + } + + private void initCloseCode() throws InvalidFrameException { + code = CloseFrame.NOCODE; + ByteBuffer payload = super.getPayloadData(); + payload.mark(); + if( payload.remaining() >= 2 ) { + ByteBuffer bb = ByteBuffer.allocate( 4 ); + bb.position( 2 ); + bb.putShort( payload.getShort() ); + bb.position( 0 ); + code = bb.getInt(); + + if( code == CloseFrame.ABNORMAL_CLOSE || code == CloseFrame.TLS_ERROR || code == CloseFrame.NOCODE || code > 4999 || code < 1000 || code == 1004 ) { + throw new InvalidFrameException( "closecode must not be sent over the wire: " + code ); + } + } + payload.reset(); + } + + @Override + public int getCloseCode() { + return code; + } + + private void initMessage() throws InvalidDataException { + if( code == CloseFrame.NOCODE ) { + reason = Charsetfunctions.stringUtf8( super.getPayloadData() ); + } else { + ByteBuffer b = super.getPayloadData(); + int mark = b.position();// because stringUtf8 also creates a mark + try { + b.position( b.position() + 2 ); + reason = Charsetfunctions.stringUtf8( b ); + } catch ( IllegalArgumentException e ) { + throw new InvalidFrameException( e ); + } finally { + b.position( mark ); + } + } + } + + @Override + public String getMessage() { + return reason; + } + + @Override + public String toString() { + return super.toString() + "code: " + code; + } + + @Override + public void setPayload( ByteBuffer payload ) throws InvalidDataException { + super.setPayload( payload ); + initCloseCode(); + initMessage(); + } + @Override + public ByteBuffer getPayloadData() { + if( code == NOCODE ) + return emptybytebuffer; + return super.getPayloadData(); + } + +} diff --git a/src/org/java_websocket/framing/FrameBuilder.java b/src/org/java_websocket/framing/FrameBuilder.java new file mode 100644 index 0000000..25a20de --- /dev/null +++ b/src/org/java_websocket/framing/FrameBuilder.java @@ -0,0 +1,17 @@ +package org.java_websocket.framing; + +import java.nio.ByteBuffer; + +import org.java_websocket.exceptions.InvalidDataException; + +public interface FrameBuilder extends Framedata { + + public abstract void setFin( boolean fin ); + + public abstract void setOptcode( Opcode optcode ); + + public abstract void setPayload( ByteBuffer payload ) throws InvalidDataException; + + public abstract void setTransferemasked( boolean transferemasked ); + +} \ No newline at end of file diff --git a/src/org/java_websocket/framing/Framedata.java b/src/org/java_websocket/framing/Framedata.java new file mode 100644 index 0000000..3dfa8c0 --- /dev/null +++ b/src/org/java_websocket/framing/Framedata.java @@ -0,0 +1,17 @@ +package org.java_websocket.framing; + +import java.nio.ByteBuffer; + +import org.java_websocket.exceptions.InvalidFrameException; + +public interface Framedata { + public enum Opcode { + CONTINUOUS, TEXT, BINARY, PING, PONG, CLOSING + // more to come + } + public boolean isFin(); + public boolean getTransfereMasked(); + public Opcode getOpcode(); + public ByteBuffer getPayloadData();// TODO the separation of the application data and the extension data is yet to be done + public abstract void append( Framedata nextframe ) throws InvalidFrameException; +} diff --git a/src/org/java_websocket/framing/FramedataImpl1.java b/src/org/java_websocket/framing/FramedataImpl1.java new file mode 100644 index 0000000..5fba075 --- /dev/null +++ b/src/org/java_websocket/framing/FramedataImpl1.java @@ -0,0 +1,110 @@ +package org.java_websocket.framing; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.exceptions.InvalidFrameException; +import org.java_websocket.util.Charsetfunctions; + +public class FramedataImpl1 implements FrameBuilder { + protected static byte[] emptyarray = {}; + protected boolean fin; + protected Opcode optcode; + private ByteBuffer unmaskedpayload; + protected boolean transferemasked; + + public FramedataImpl1() { + } + + public FramedataImpl1( Opcode op ) { + this.optcode = op; + unmaskedpayload = ByteBuffer.wrap( emptyarray ); + } + + /** + * Helper constructor which helps to create "echo" frames. + * The new object will use the same underlying payload data. + **/ + public FramedataImpl1( Framedata f ) { + fin = f.isFin(); + optcode = f.getOpcode(); + unmaskedpayload = f.getPayloadData(); + transferemasked = f.getTransfereMasked(); + } + + @Override + public boolean isFin() { + return fin; + } + + @Override + public Opcode getOpcode() { + return optcode; + } + + @Override + public boolean getTransfereMasked() { + return transferemasked; + } + + @Override + public ByteBuffer getPayloadData() { + return unmaskedpayload; + } + + @Override + public void setFin( boolean fin ) { + this.fin = fin; + } + + @Override + public void setOptcode( Opcode optcode ) { + this.optcode = optcode; + } + + @Override + public void setPayload( ByteBuffer payload ) throws InvalidDataException { + unmaskedpayload = payload; + } + + @Override + public void setTransferemasked( boolean transferemasked ) { + this.transferemasked = transferemasked; + } + + @Override + public void append( Framedata nextframe ) throws InvalidFrameException { + ByteBuffer b = nextframe.getPayloadData(); + if( unmaskedpayload == null ) { + unmaskedpayload = ByteBuffer.allocate( b.remaining() ); + b.mark(); + unmaskedpayload.put( b ); + b.reset(); + } else { + b.mark(); + unmaskedpayload.position( unmaskedpayload.limit() ); + unmaskedpayload.limit( unmaskedpayload.capacity() ); + + if( b.remaining() > unmaskedpayload.remaining() ) { + ByteBuffer tmp = ByteBuffer.allocate( b.remaining() + unmaskedpayload.capacity() ); + unmaskedpayload.flip(); + tmp.put( unmaskedpayload ); + tmp.put( b ); + unmaskedpayload = tmp; + + } else { + unmaskedpayload.put( b ); + } + unmaskedpayload.rewind(); + b.reset(); + } + fin = nextframe.isFin(); + } + + @Override + public String toString() { + return "Framedata{ optcode:" + getOpcode() + ", fin:" + isFin() + ", payloadlength:[pos:" + unmaskedpayload.position() + ", len:" + unmaskedpayload.remaining() + "], payload:" + Arrays.toString( Charsetfunctions.utf8Bytes( new String( unmaskedpayload.array() ) ) ) + "}"; + } + +} diff --git a/src/org/java_websocket/handshake/ClientHandshake.java b/src/org/java_websocket/handshake/ClientHandshake.java new file mode 100644 index 0000000..918d221 --- /dev/null +++ b/src/org/java_websocket/handshake/ClientHandshake.java @@ -0,0 +1,6 @@ +package org.java_websocket.handshake; + +public interface ClientHandshake extends Handshakedata { + /**returns the HTTP Request-URI as defined by http://tools.ietf.org/html/rfc2616#section-5.1.2*/ + public String getResourceDescriptor(); +} diff --git a/src/org/java_websocket/handshake/ClientHandshakeBuilder.java b/src/org/java_websocket/handshake/ClientHandshakeBuilder.java new file mode 100644 index 0000000..88ac4f2 --- /dev/null +++ b/src/org/java_websocket/handshake/ClientHandshakeBuilder.java @@ -0,0 +1,5 @@ +package org.java_websocket.handshake; + +public interface ClientHandshakeBuilder extends HandshakeBuilder, ClientHandshake { + public void setResourceDescriptor( String resourceDescriptor ); +} diff --git a/src/org/java_websocket/handshake/HandshakeBuilder.java b/src/org/java_websocket/handshake/HandshakeBuilder.java new file mode 100644 index 0000000..8a6236c --- /dev/null +++ b/src/org/java_websocket/handshake/HandshakeBuilder.java @@ -0,0 +1,6 @@ +package org.java_websocket.handshake; + +public interface HandshakeBuilder extends Handshakedata { + public abstract void setContent( byte[] content ); + public abstract void put( String name, String value ); +} diff --git a/src/org/java_websocket/handshake/HandshakeImpl1Client.java b/src/org/java_websocket/handshake/HandshakeImpl1Client.java new file mode 100644 index 0000000..15715e3 --- /dev/null +++ b/src/org/java_websocket/handshake/HandshakeImpl1Client.java @@ -0,0 +1,18 @@ +package org.java_websocket.handshake; + +public class HandshakeImpl1Client extends HandshakedataImpl1 implements ClientHandshakeBuilder { + private String resourceDescriptor = "*"; + + public HandshakeImpl1Client() { + } + + public void setResourceDescriptor( String resourceDescriptor ) throws IllegalArgumentException { + if(resourceDescriptor==null) + throw new IllegalArgumentException( "http resource descriptor must not be null" ); + this.resourceDescriptor = resourceDescriptor; + } + + public String getResourceDescriptor() { + return resourceDescriptor; + } +} diff --git a/src/org/java_websocket/handshake/HandshakeImpl1Server.java b/src/org/java_websocket/handshake/HandshakeImpl1Server.java new file mode 100644 index 0000000..7063b89 --- /dev/null +++ b/src/org/java_websocket/handshake/HandshakeImpl1Server.java @@ -0,0 +1,29 @@ +package org.java_websocket.handshake; + +public class HandshakeImpl1Server extends HandshakedataImpl1 implements ServerHandshakeBuilder { + private short httpstatus; + private String httpstatusmessage; + + public HandshakeImpl1Server() { + } + + @Override + public String getHttpStatusMessage() { + return httpstatusmessage; + } + + @Override + public short getHttpStatus() { + return httpstatus; + } + + public void setHttpStatusMessage( String message ) { + this.httpstatusmessage = message; + } + + public void setHttpStatus( short status ) { + httpstatus = status; + } + + +} diff --git a/src/org/java_websocket/handshake/Handshakedata.java b/src/org/java_websocket/handshake/Handshakedata.java new file mode 100644 index 0000000..577d6ce --- /dev/null +++ b/src/org/java_websocket/handshake/Handshakedata.java @@ -0,0 +1,10 @@ +package org.java_websocket.handshake; + +import java.util.Iterator; + +public interface Handshakedata { + public Iterator iterateHttpFields(); + public String getFieldValue( String name ); + public boolean hasFieldValue( String name ); + public byte[] getContent(); +} diff --git a/src/org/java_websocket/handshake/HandshakedataImpl1.java b/src/org/java_websocket/handshake/HandshakedataImpl1.java new file mode 100644 index 0000000..d4d9555 --- /dev/null +++ b/src/org/java_websocket/handshake/HandshakedataImpl1.java @@ -0,0 +1,60 @@ +package org.java_websocket.handshake; + +import java.util.Collections; +import java.util.Iterator; +import java.util.TreeMap; + +public class HandshakedataImpl1 implements HandshakeBuilder { + private byte[] content; + private TreeMap map; + + public HandshakedataImpl1() { + map = new TreeMap( String.CASE_INSENSITIVE_ORDER ); + } + + /*public HandshakedataImpl1( Handshakedata h ) { + httpstatusmessage = h.getHttpStatusMessage(); + resourcedescriptor = h.getResourceDescriptor(); + content = h.getContent(); + map = new LinkedHashMap(); + Iterator it = h.iterateHttpFields(); + while ( it.hasNext() ) { + String key = (String) it.next(); + map.put( key, h.getFieldValue( key ) ); + } + }*/ + + @Override + public Iterator iterateHttpFields() { + return Collections.unmodifiableSet( map.keySet() ).iterator();// Safety first + } + + @Override + public String getFieldValue( String name ) { + String s = map.get( name ); + if ( s == null ) { + return ""; + } + return s; + } + + @Override + public byte[] getContent() { + return content; + } + + @Override + public void setContent( byte[] content ) { + this.content = content; + } + + @Override + public void put( String name, String value ) { + map.put( name, value ); + } + + @Override + public boolean hasFieldValue( String name ) { + return map.containsKey( name ); + } +} diff --git a/src/org/java_websocket/handshake/ServerHandshake.java b/src/org/java_websocket/handshake/ServerHandshake.java new file mode 100644 index 0000000..880e9b2 --- /dev/null +++ b/src/org/java_websocket/handshake/ServerHandshake.java @@ -0,0 +1,6 @@ +package org.java_websocket.handshake; + +public interface ServerHandshake extends Handshakedata { + public short getHttpStatus(); + public String getHttpStatusMessage(); +} diff --git a/src/org/java_websocket/handshake/ServerHandshakeBuilder.java b/src/org/java_websocket/handshake/ServerHandshakeBuilder.java new file mode 100644 index 0000000..d518dfb --- /dev/null +++ b/src/org/java_websocket/handshake/ServerHandshakeBuilder.java @@ -0,0 +1,6 @@ +package org.java_websocket.handshake; + +public interface ServerHandshakeBuilder extends HandshakeBuilder, ServerHandshake { + public void setHttpStatus( short status ); + public void setHttpStatusMessage( String message ); +} diff --git a/src/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java b/src/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java new file mode 100644 index 0000000..32896f9 --- /dev/null +++ b/src/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java @@ -0,0 +1,55 @@ +package org.java_websocket.server; +import java.io.IOException; +import java.net.Socket; +import java.nio.channels.ByteChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; + +import org.java_websocket.SSLSocketChannel2; +import org.java_websocket.WebSocketAdapter; +import org.java_websocket.WebSocketImpl; +import org.java_websocket.drafts.Draft; + + +public class DefaultSSLWebSocketServerFactory implements WebSocketServer.WebSocketServerFactory { + protected SSLContext sslcontext; + protected ExecutorService exec; + + public DefaultSSLWebSocketServerFactory( SSLContext sslContext ) { + this( sslContext, Executors.newSingleThreadScheduledExecutor() ); + } + + public DefaultSSLWebSocketServerFactory( SSLContext sslContext , ExecutorService exec ) { + if( sslContext == null || exec == null ) + throw new IllegalArgumentException(); + this.sslcontext = sslContext; + this.exec = exec; + } + + @Override + public ByteChannel wrapChannel( SocketChannel channel, SelectionKey key ) throws IOException { + SSLEngine e = sslcontext.createSSLEngine(); + e.setUseClientMode( false ); + return new SSLSocketChannel2( channel, e, exec, key ); + } + + @Override + public WebSocketImpl createWebSocket( WebSocketAdapter a, Draft d, Socket c ) { + return new WebSocketImpl( a, d ); + } + + @Override + public WebSocketImpl createWebSocket( WebSocketAdapter a, List d, Socket s ) { + return new WebSocketImpl( a, d ); + } + @Override + public void close() { + exec.shutdown(); + } +} \ No newline at end of file diff --git a/src/org/java_websocket/server/DefaultWebSocketServerFactory.java b/src/org/java_websocket/server/DefaultWebSocketServerFactory.java new file mode 100644 index 0000000..4fcd55b --- /dev/null +++ b/src/org/java_websocket/server/DefaultWebSocketServerFactory.java @@ -0,0 +1,29 @@ +package org.java_websocket.server; + +import java.net.Socket; +import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; +import java.util.List; + +import org.java_websocket.WebSocketAdapter; +import org.java_websocket.WebSocketImpl; +import org.java_websocket.drafts.Draft; +import org.java_websocket.server.WebSocketServer.WebSocketServerFactory; + +public class DefaultWebSocketServerFactory implements WebSocketServerFactory { + @Override + public WebSocketImpl createWebSocket( WebSocketAdapter a, Draft d, Socket s ) { + return new WebSocketImpl( a, d ); + } + @Override + public WebSocketImpl createWebSocket( WebSocketAdapter a, List d, Socket s ) { + return new WebSocketImpl( a, d ); + } + @Override + public SocketChannel wrapChannel( SocketChannel channel, SelectionKey key ) { + return channel; + } + @Override + public void close() { + } +} \ No newline at end of file diff --git a/src/org/java_websocket/server/WebSocketServer.java b/src/org/java_websocket/server/WebSocketServer.java new file mode 100644 index 0000000..7a095f5 --- /dev/null +++ b/src/org/java_websocket/server/WebSocketServer.java @@ -0,0 +1,765 @@ +package org.java_websocket.server; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.nio.channels.ByteChannel; +import java.nio.channels.CancelledKeyException; +import java.nio.channels.ClosedByInterruptException; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import org.java_websocket.SocketChannelIOHelper; +import org.java_websocket.WebSocket; +import org.java_websocket.WebSocketAdapter; +import org.java_websocket.WebSocketFactory; +import org.java_websocket.WebSocketImpl; +import org.java_websocket.WrappedByteChannel; +import org.java_websocket.drafts.Draft; +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.framing.CloseFrame; +import org.java_websocket.framing.Framedata; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.handshake.Handshakedata; +import org.java_websocket.handshake.ServerHandshakeBuilder; + +/** + * WebSocketServer is an abstract class that only takes care of the + * HTTP handshake portion of WebSockets. It's up to a subclass to add + * functionality/purpose to the server. + * + */ +public abstract class WebSocketServer extends WebSocketAdapter implements Runnable { + + public static int DECODERS = Runtime.getRuntime().availableProcessors(); + + /** + * Holds the list of active WebSocket connections. "Active" means WebSocket + * handshake is complete and socket can be written to, or read from. + */ + private final Collection connections; + /** + * The port number that this WebSocket server should listen on. Default is + * WebSocket.DEFAULT_PORT. + */ + private final InetSocketAddress address; + /** + * The socket channel for this WebSocket server. + */ + private ServerSocketChannel server; + /** + * The 'Selector' used to get event keys from the underlying socket. + */ + private Selector selector; + /** + * The Draft of the WebSocket protocol the Server is adhering to. + */ + private List drafts; + + private Thread selectorthread; + + private final AtomicBoolean isclosed = new AtomicBoolean( false ); + + private List decoders; + + private List iqueue; + private BlockingQueue buffers; + private int queueinvokes = 0; + private final AtomicInteger queuesize = new AtomicInteger( 0 ); + + private WebSocketServerFactory wsf = new DefaultWebSocketServerFactory(); + + /** + * Creates a WebSocketServer that will attempt to + * listen on port WebSocket.DEFAULT_PORT. + * + * @see #WebSocketServer(InetSocketAddress, int, List, Collection) more details here + */ + public WebSocketServer() throws UnknownHostException { + this( new InetSocketAddress( WebSocket.DEFAULT_PORT ), DECODERS, null ); + } + + /** + * Creates a WebSocketServer that will attempt to bind/listen on the given address. + * + * @see #WebSocketServer(InetSocketAddress, int, List, Collection) more details here + */ + public WebSocketServer( InetSocketAddress address ) { + this( address, DECODERS, null ); + } + + /** + * @see #WebSocketServer(InetSocketAddress, int, List, Collection) more details here + */ + public WebSocketServer( InetSocketAddress address , int decoders ) { + this( address, decoders, null ); + } + + /** + * @see #WebSocketServer(InetSocketAddress, int, List, Collection) more details here + */ + public WebSocketServer( InetSocketAddress address , List drafts ) { + this( address, DECODERS, drafts ); + } + + /** + * @see #WebSocketServer(InetSocketAddress, int, List, Collection) more details here + */ + public WebSocketServer( InetSocketAddress address , int decodercount , List drafts ) { + this( address, decodercount, drafts, new HashSet() ); + } + + /** + * Creates a WebSocketServer that will attempt to bind/listen on the given address, + * and comply with Draft version draft. + * + * @param address + * The address (host:port) this server should listen on. + * @param decodercount + * The number of {@link WebSocketWorker}s that will be used to process the incoming network data. By default this will be Runtime.getRuntime().availableProcessors() + * @param drafts + * The versions of the WebSocket protocol that this server + * instance should comply to. Clients that use an other protocol version will be rejected. + * + * @param connectionscontainer + * Allows to specify a collection that will be used to store the websockets in.
+ * If you plan to often iterate through the currently connected websockets you may want to use a collection that does not require synchronization like a {@link CopyOnWriteArraySet}. In that case make sure that you overload {@link #removeConnection(WebSocket)} and {@link #addConnection(WebSocket)}.
+ * By default a {@link HashSet} will be used. + * + * @see #removeConnection(WebSocket) for more control over syncronized operation + * @see
more about drafts + */ + public WebSocketServer( InetSocketAddress address , int decodercount , List drafts , Collection connectionscontainer ) { + if( address == null || decodercount < 1 || connectionscontainer == null ) { + throw new IllegalArgumentException( "address and connectionscontainer must not be null and you need at least 1 decoder" ); + } + + if( drafts == null ) + this.drafts = Collections.emptyList(); + else + this.drafts = drafts; + + this.address = address; + this.connections = connectionscontainer; + + iqueue = new LinkedList(); + + decoders = new ArrayList( decodercount ); + buffers = new LinkedBlockingQueue(); + for( int i = 0 ; i < decodercount ; i++ ) { + WebSocketWorker ex = new WebSocketWorker(); + decoders.add( ex ); + ex.start(); + } + } + + /** + * Starts the server selectorthread that binds to the currently set port number and + * listeners for WebSocket connection requests. Creates a fixed thread pool with the size {@link WebSocketServer#DECODERS}
+ * May only be called once. + * + * Alternatively you can call {@link WebSocketServer#run()} directly. + * + * @throws IllegalStateException Starting an instance again + */ + public void start() { + if( selectorthread != null ) + throw new IllegalStateException( getClass().getName() + " can only be started once." ); + new Thread( this ).start(); + } + + /** + * Closes all connected clients sockets, then closes the underlying + * ServerSocketChannel, effectively killing the server socket selectorthread, + * freeing the port the server was bound to and stops all internal workerthreads. + * + * If this method is called before the server is started it will never start. + * + * @param timeout + * Specifies how many milliseconds the overall close handshaking may take altogether before the connections are closed without proper close handshaking.
+ * + * @throws InterruptedException Interrupt + */ + public void stop( int timeout ) throws InterruptedException { + if( !isclosed.compareAndSet( false, true ) ) { // this also makes sure that no further connections will be added to this.connections + return; + } + + List socketsToClose; + + // copy the connections in a list (prevent callback deadlocks) + synchronized ( connections ) { + socketsToClose = new ArrayList( connections ); + } + + for( WebSocket ws : socketsToClose ) { + ws.close( CloseFrame.GOING_AWAY ); + } + + wsf.close(); + + synchronized ( this ) { + if( selectorthread != null && selectorthread != Thread.currentThread() ) { + selectorthread.interrupt(); + selector.wakeup(); + selectorthread.join( timeout ); + } + } + } + public void stop() throws IOException , InterruptedException { + stop( 0 ); + } + + /** + * Returns a WebSocket[] of currently connected clients. + * Its iterators will be failfast and its not judicious + * to modify it. + * + * @return The currently connected clients. + */ + public Collection connections() { + return this.connections; + } + + public InetSocketAddress getAddress() { + return this.address; + } + + /** + * Gets the port number that this server listens on. + * + * @return The port number. + */ + public int getPort() { + int port = getAddress().getPort(); + if( port == 0 && server != null ) { + port = server.socket().getLocalPort(); + } + return port; + } + + public List getDraft() { + return Collections.unmodifiableList( drafts ); + } + + // Runnable IMPLEMENTATION ///////////////////////////////////////////////// + public void run() { + synchronized ( this ) { + if( selectorthread != null ) + throw new IllegalStateException( getClass().getName() + " can only be started once." ); + selectorthread = Thread.currentThread(); + if( isclosed.get() ) { + return; + } + } + selectorthread.setName( "WebsocketSelector" + selectorthread.getId() ); + try { + server = ServerSocketChannel.open(); + server.configureBlocking( false ); + ServerSocket socket = server.socket(); + socket.setReceiveBufferSize( WebSocketImpl.RCVBUF ); + socket.bind( address ); + selector = Selector.open(); + server.register( selector, server.validOps() ); + } catch ( IOException ex ) { + handleFatal( null, ex ); + return; + } + try { + while ( !selectorthread.isInterrupted() ) { + SelectionKey key = null; + WebSocketImpl conn = null; + try { + selector.select(); + Set keys = selector.selectedKeys(); + Iterator i = keys.iterator(); + + while ( i.hasNext() ) { + key = i.next(); + conn = null; + + if( !key.isValid() ) { + // Object o = key.attachment(); + continue; + } + + if( key.isAcceptable() ) { + if( !onConnect( key ) ) { + key.cancel(); + continue; + } + + SocketChannel channel = server.accept(); + if(channel==null){ + continue; + } + channel.configureBlocking( false ); + WebSocketImpl w = wsf.createWebSocket( this, drafts, channel.socket() ); + w.key = channel.register( selector, SelectionKey.OP_READ, w ); + try { + w.channel = wsf.wrapChannel( channel, w.key ); + i.remove(); + allocateBuffers( w ); + continue; + } catch (IOException ex) { + if( w.key != null ) + w.key.cancel(); + + handleIOException( w.key, null, ex ); + } + continue; + } + + if( key.isReadable() ) { + conn = (WebSocketImpl) key.attachment(); + ByteBuffer buf = takeBuffer(); + if(conn.channel == null){ + if( key != null ) + key.cancel(); + + handleIOException( key, conn, new IOException() ); + continue; + } + try { + if( SocketChannelIOHelper.read( buf, conn, conn.channel ) ) { + if( buf.hasRemaining() ) { + conn.inQueue.put( buf ); + queue( conn ); + i.remove(); + if( conn.channel instanceof WrappedByteChannel ) { + if( ( (WrappedByteChannel) conn.channel ).isNeedRead() ) { + iqueue.add( conn ); + } + } + } else + pushBuffer( buf ); + } else { + pushBuffer( buf ); + } + } catch ( IOException e ) { + pushBuffer( buf ); + throw e; + } + } + if( key.isWritable() ) { + conn = (WebSocketImpl) key.attachment(); + if( SocketChannelIOHelper.batch( conn, conn.channel ) ) { + if( key.isValid() ) + key.interestOps( SelectionKey.OP_READ ); + } + } + } + while ( !iqueue.isEmpty() ) { + conn = iqueue.remove( 0 ); + WrappedByteChannel c = ( (WrappedByteChannel) conn.channel ); + ByteBuffer buf = takeBuffer(); + try { + if( SocketChannelIOHelper.readMore( buf, conn, c ) ) + iqueue.add( conn ); + if( buf.hasRemaining() ) { + conn.inQueue.put( buf ); + queue( conn ); + } else { + pushBuffer( buf ); + } + } catch ( IOException e ) { + pushBuffer( buf ); + throw e; + } + + } + } catch ( CancelledKeyException e ) { + // an other thread may cancel the key + } catch ( ClosedByInterruptException e ) { + return; // do the same stuff as when InterruptedException is thrown + } catch ( IOException ex ) { + if( key != null ) + key.cancel(); + handleIOException( key, conn, ex ); + } catch ( InterruptedException e ) { + return;// FIXME controlled shutdown (e.g. take care of buffermanagement) + } + } + + } catch ( RuntimeException e ) { + // should hopefully never occur + handleFatal( null, e ); + } finally { + if( decoders != null ) { + for( WebSocketWorker w : decoders ) { + w.interrupt(); + } + } + if( selector != null ) { + try { + selector.close(); + } catch ( IOException e ) { + onError( null, e ); + } + } + if( server != null ) { + try { + server.close(); + } catch ( IOException e ) { + onError( null, e ); + } + } + } + } + protected void allocateBuffers( WebSocket c ) throws InterruptedException { + if( queuesize.get() >= 2 * decoders.size() + 1 ) { + return; + } + queuesize.incrementAndGet(); + buffers.put( createBuffer() ); + } + + protected void releaseBuffers( WebSocket c ) throws InterruptedException { + // queuesize.decrementAndGet(); + // takeBuffer(); + } + + public ByteBuffer createBuffer() { + return ByteBuffer.allocate( WebSocketImpl.RCVBUF ); + } + + private void queue( WebSocketImpl ws ) throws InterruptedException { + if( ws.workerThread == null ) { + ws.workerThread = decoders.get( queueinvokes % decoders.size() ); + queueinvokes++; + } + ws.workerThread.put( ws ); + } + + private ByteBuffer takeBuffer() throws InterruptedException { + return buffers.take(); + } + + private void pushBuffer( ByteBuffer buf ) throws InterruptedException { + if( buffers.size() > queuesize.intValue() ) + return; + buffers.put( buf ); + } + + private void handleIOException( SelectionKey key, WebSocket conn, IOException ex ) { + // onWebsocketError( conn, ex );// conn may be null here + if( conn != null ) { + conn.closeConnection( CloseFrame.ABNORMAL_CLOSE, ex.getMessage() ); + } else if( key != null ) { + SelectableChannel channel = key.channel(); + if( channel != null && channel.isOpen() ) { // this could be the case if the IOException ex is a SSLException + try { + channel.close(); + } catch ( IOException e ) { + // there is nothing that must be done here + } + if( WebSocketImpl.DEBUG ) + System.out.println("Connection closed because of " + ex); + } + } + } + + private void handleFatal( WebSocket conn, Exception e ) { + onError( conn, e ); + try { + stop(); + } catch ( IOException e1 ) { + onError( null, e1 ); + } catch ( InterruptedException e1 ) { + Thread.currentThread().interrupt(); + onError( null, e1 ); + } + } + + /** + * Gets the XML string that should be returned if a client requests a Flash + * security policy. + * + * The default implementation allows access from all remote domains, but + * only on the port that this WebSocketServer is listening on. + * + * This is specifically implemented for gitime's WebSocket client for Flash: + * http://github.com/gimite/web-socket-js + * + * @return An XML String that comforms to Flash's security policy. You MUST + * not include the null char at the end, it is appended automatically. + */ + protected String getFlashSecurityPolicy() { + return ""; + } + + @Override + public final void onWebsocketMessage( WebSocket conn, String message ) { + onMessage( conn, message ); + } + + @Override + @Deprecated + public/*final*/void onWebsocketMessageFragment( WebSocket conn, Framedata frame ) {// onFragment should be overloaded instead + onFragment( conn, frame ); + } + + @Override + public final void onWebsocketMessage( WebSocket conn, ByteBuffer blob ) { + onMessage( conn, blob ); + } + + @Override + public final void onWebsocketOpen( WebSocket conn, Handshakedata handshake ) { + if( addConnection( conn ) ) { + onOpen( conn, (ClientHandshake) handshake ); + } + } + + @Override + public final void onWebsocketClose( WebSocket conn, int code, String reason, boolean remote ) { + selector.wakeup(); + try { + if( removeConnection( conn ) ) { + onClose( conn, code, reason, remote ); + } + } finally { + try { + releaseBuffers( conn ); + } catch ( InterruptedException e ) { + Thread.currentThread().interrupt(); + } + } + + } + + /** + * This method performs remove operations on the connection and therefore also gives control over whether the operation shall be synchronized + *

+ * {@link #WebSocketServer(InetSocketAddress, int, List, Collection)} allows to specify a collection which will be used to store current connections in.
+ * Depending on the type on the connection, modifications of that collection may have to be synchronized. + **/ + protected boolean removeConnection( WebSocket ws ) { + boolean removed; + synchronized ( connections ) { + removed = this.connections.remove( ws ); + assert ( removed ); + } + if( isclosed.get() && connections.size() == 0 ) { + selectorthread.interrupt(); + } + return removed; + } + @Override + public ServerHandshakeBuilder onWebsocketHandshakeReceivedAsServer( WebSocket conn, Draft draft, ClientHandshake request ) throws InvalidDataException { + return super.onWebsocketHandshakeReceivedAsServer( conn, draft, request ); + } + + /** @see #removeConnection(WebSocket) */ + protected boolean addConnection( WebSocket ws ) { + if( !isclosed.get() ) { + synchronized ( connections ) { + boolean succ = this.connections.add( ws ); + assert ( succ ); + return succ; + } + } else { + // This case will happen when a new connection gets ready while the server is already stopping. + ws.close( CloseFrame.GOING_AWAY ); + return true;// for consistency sake we will make sure that both onOpen will be called + } + } + /** + * @param conn + * may be null if the error does not belong to a single connection + */ + @Override + public final void onWebsocketError( WebSocket conn, Exception ex ) { + onError( conn, ex ); + } + + @Override + public final void onWriteDemand( WebSocket w ) { + WebSocketImpl conn = (WebSocketImpl) w; + try { + conn.key.interestOps( SelectionKey.OP_READ | SelectionKey.OP_WRITE ); + } catch ( CancelledKeyException e ) { + // the thread which cancels key is responsible for possible cleanup + conn.outQueue.clear(); + } + selector.wakeup(); + } + + @Override + public void onWebsocketCloseInitiated( WebSocket conn, int code, String reason ) { + onCloseInitiated( conn, code, reason ); + } + + @Override + public void onWebsocketClosing( WebSocket conn, int code, String reason, boolean remote ) { + onClosing( conn, code, reason, remote ); + + } + + public void onCloseInitiated( WebSocket conn, int code, String reason ) { + } + + public void onClosing( WebSocket conn, int code, String reason, boolean remote ) { + + } + + public final void setWebSocketFactory( WebSocketServerFactory wsf ) { + this.wsf = wsf; + } + + public final WebSocketFactory getWebSocketFactory() { + return wsf; + } + + /** + * Returns whether a new connection shall be accepted or not.
+ * Therefore method is well suited to implement some kind of connection limitation.
+ * + * @see #onOpen(WebSocket, ClientHandshake) + * @see #onWebsocketHandshakeReceivedAsServer(WebSocket, Draft, ClientHandshake) + **/ + protected boolean onConnect( SelectionKey key ) { + return true; + } + + private Socket getSocket( WebSocket conn ) { + WebSocketImpl impl = (WebSocketImpl) conn; + return ( (SocketChannel) impl.key.channel() ).socket(); + } + + @Override + public InetSocketAddress getLocalSocketAddress( WebSocket conn ) { + return (InetSocketAddress) getSocket( conn ).getLocalSocketAddress(); + } + + @Override + public InetSocketAddress getRemoteSocketAddress( WebSocket conn ) { + return (InetSocketAddress) getSocket( conn ).getRemoteSocketAddress(); + } + + /** Called after an opening handshake has been performed and the given websocket is ready to be written on. */ + public abstract void onOpen( WebSocket conn, ClientHandshake handshake ); + /** + * Called after the websocket connection has been closed. + * + * @param code + * The codes can be looked up here: {@link CloseFrame} + * @param reason + * Additional information string + * @param remote + * Returns whether or not the closing of the connection was initiated by the remote host. + **/ + public abstract void onClose( WebSocket conn, int code, String reason, boolean remote ); + /** + * Callback for string messages received from the remote host + * + * @see #onMessage(WebSocket, ByteBuffer) + **/ + public abstract void onMessage( WebSocket conn, String message ); + /** + * Called when errors occurs. If an error causes the websocket connection to fail {@link #onClose(WebSocket, int, String, boolean)} will be called additionally.
+ * This method will be called primarily because of IO or protocol errors.
+ * If the given exception is an RuntimeException that probably means that you encountered a bug.
+ * + * @param conn + * Can be null if there error does not belong to one specific websocket. For example if the servers port could not be bound. + **/ + public abstract void onError( WebSocket conn, Exception ex ); + /** + * Callback for binary messages received from the remote host + * + * @see #onMessage(WebSocket, String) + **/ + public void onMessage( WebSocket conn, ByteBuffer message ) { + } + + /** + * @see WebSocket#sendFragmentedFrame(org.java_websocket.framing.Framedata.Opcode, ByteBuffer, boolean) + */ + public void onFragment( WebSocket conn, Framedata fragment ) { + } + + public class WebSocketWorker extends Thread { + + private BlockingQueue iqueue; + + public WebSocketWorker() { + iqueue = new LinkedBlockingQueue(); + setName( "WebSocketWorker-" + getId() ); + setUncaughtExceptionHandler( new UncaughtExceptionHandler() { + @Override + public void uncaughtException( Thread t, Throwable e ) { + System.err.print("Uncaught exception in thread \"" + + t.getName() + "\":"); + e.printStackTrace(System.err); + } + } ); + } + + public void put( WebSocketImpl ws ) throws InterruptedException { + iqueue.put( ws ); + } + + @Override + public void run() { + WebSocketImpl ws = null; + try { + while ( true ) { + ByteBuffer buf; + ws = iqueue.take(); + buf = ws.inQueue.poll(); + assert ( buf != null ); + try { + ws.decode( buf ); + } catch(Exception e){ + System.err.println("Error while reading from remote connection: " + e); + } + + finally { + pushBuffer( buf ); + } + } + } catch ( InterruptedException e ) { + } catch ( RuntimeException e ) { + handleFatal( ws, e ); + } + } + } + + public interface WebSocketServerFactory extends WebSocketFactory { + @Override + public WebSocketImpl createWebSocket( WebSocketAdapter a, Draft d, Socket s ); + + public WebSocketImpl createWebSocket( WebSocketAdapter a, List drafts, Socket s ); + + /** + * Allows to wrap the Socketchannel( key.channel() ) to insert a protocol layer( like ssl or proxy authentication) beyond the ws layer. + * + * @param key + * a SelectionKey of an open SocketChannel. + * @return The channel on which the read and write operations will be performed.
+ */ + public ByteChannel wrapChannel( SocketChannel channel, SelectionKey key ) throws IOException; + + public void close(); + } +} diff --git a/src/org/java_websocket/util/Base64.java b/src/org/java_websocket/util/Base64.java new file mode 100644 index 0000000..e3b40d4 --- /dev/null +++ b/src/org/java_websocket/util/Base64.java @@ -0,0 +1,2065 @@ +package org.java_websocket.util; + +/** + *

Encodes and decodes to and from Base64 notation.

+ *

Homepage: http://iharder.net/base64.

+ * + *

Example:

+ * + * String encoded = Base64.encode( myByteArray ); + *
+ * byte[] myByteArray = Base64.decode( encoded ); + * + *

The options parameter, which appears in a few places, is used to pass + * several pieces of information to the encoder. In the "higher level" methods such as + * encodeBytes( bytes, options ) the options parameter can be used to indicate such + * things as first gzipping the bytes before encoding them, not inserting linefeeds, + * and encoding using the URL-safe and Ordered dialects.

+ * + *

Note, according to RFC3548, + * Section 2.1, implementations should not add line feeds unless explicitly told + * to do so. I've got Base64 set to this behavior now, although earlier versions + * broke lines by default.

+ * + *

The constants defined in Base64 can be OR-ed together to combine options, so you + * might make a call like this:

+ * + * String encoded = Base64.encodeBytes( mybytes, Base64.GZIP | Base64.DO_BREAK_LINES ); + *

to compress the data before encoding it and then making the output have newline characters.

+ *

Also...

+ * String encoded = Base64.encodeBytes( crazyString.getBytes() ); + * + * + * + *

+ * Change Log: + *

+ *
    + *
  • v2.3.7 - Fixed subtle bug when base 64 input stream contained the + * value 01111111, which is an invalid base 64 character but should not + * throw an ArrayIndexOutOfBoundsException either. Led to discovery of + * mishandling (or potential for better handling) of other bad input + * characters. You should now get an IOException if you try decoding + * something that has bad characters in it.
  • + *
  • v2.3.6 - Fixed bug when breaking lines and the final byte of the encoded + * string ended in the last column; the buffer was not properly shrunk and + * contained an extra (null) byte that made it into the string.
  • + *
  • v2.3.5 - Fixed bug in {@link #encodeFromFile} where estimated buffer size + * was wrong for files of size 31, 34, and 37 bytes.
  • + *
  • v2.3.4 - Fixed bug when working with gzipped streams whereby flushing + * the Base64.OutputStream closed the Base64 encoding (by padding with equals + * signs) too soon. Also added an option to suppress the automatic decoding + * of gzipped streams. Also added experimental support for specifying a + * class loader when using the + * {@link #decodeToObject(java.lang.String, int, java.lang.ClassLoader)} + * method.
  • + *
  • v2.3.3 - Changed default char encoding to US-ASCII which reduces the internal Java + * footprint with its CharEncoders and so forth. Fixed some javadocs that were + * inconsistent. Removed imports and specified things like java.io.IOException + * explicitly inline.
  • + *
  • v2.3.2 - Reduced memory footprint! Finally refined the "guessing" of how big the + * final encoded data will be so that the code doesn't have to create two output + * arrays: an oversized initial one and then a final, exact-sized one. Big win + * when using the {@link #encodeBytesToBytes(byte[])} family of methods (and not + * using the gzip options which uses a different mechanism with streams and stuff).
  • + *
  • v2.3.1 - Added {@link #encodeBytesToBytes(byte[], int, int, int)} and some + * similar helper methods to be more efficient with memory by not returning a + * String but just a byte array.
  • + *
  • v2.3 - This is not a drop-in replacement! This is two years of comments + * and bug fixes queued up and finally executed. Thanks to everyone who sent + * me stuff, and I'm sorry I wasn't able to distribute your fixes to everyone else. + * Much bad coding was cleaned up including throwing exceptions where necessary + * instead of returning null values or something similar. Here are some changes + * that may affect you: + *
      + *
    • Does not break lines, by default. This is to keep in compliance with + * RFC3548.
    • + *
    • Throws exceptions instead of returning null values. Because some operations + * (especially those that may permit the GZIP option) use IO streams, there + * is a possiblity of an java.io.IOException being thrown. After some discussion and + * thought, I've changed the behavior of the methods to throw java.io.IOExceptions + * rather than return null if ever there's an error. I think this is more + * appropriate, though it will require some changes to your code. Sorry, + * it should have been done this way to begin with.
    • + *
    • Removed all references to System.out, System.err, and the like. + * Shame on me. All I can say is sorry they were ever there.
    • + *
    • Throws NullPointerExceptions and IllegalArgumentExceptions as needed + * such as when passed arrays are null or offsets are invalid.
    • + *
    • Cleaned up as much javadoc as I could to avoid any javadoc warnings. + * This was especially annoying before for people who were thorough in their + * own projects and then had gobs of javadoc warnings on this file.
    • + *
    + *
  • v2.2.1 - Fixed bug using URL_SAFE and ORDERED encodings. Fixed bug + * when using very small files (~< 40 bytes).
  • + *
  • v2.2 - Added some helper methods for encoding/decoding directly from + * one file to the next. Also added a main() method to support command line + * encoding/decoding from one file to the next. Also added these Base64 dialects: + *
      + *
    1. The default is RFC3548 format.
    2. + *
    3. Calling Base64.setFormat(Base64.BASE64_FORMAT.URLSAFE_FORMAT) generates + * URL and file name friendly format as described in Section 4 of RFC3548. + * http://www.faqs.org/rfcs/rfc3548.html
    4. + *
    5. Calling Base64.setFormat(Base64.BASE64_FORMAT.ORDERED_FORMAT) generates + * URL and file name friendly format that preserves lexical ordering as described + * in http://www.faqs.org/qa/rfcc-1940.html
    6. + *
    + * Special thanks to Jim Kellerman at http://www.powerset.com/ + * for contributing the new Base64 dialects. + *
  • + * + *
  • v2.1 - Cleaned up javadoc comments and unused variables and methods. Added + * some convenience methods for reading and writing to and from files.
  • + *
  • v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems + * with other encodings (like EBCDIC).
  • + *
  • v2.0.1 - Fixed an error when decoding a single byte, that is, when the + * encoded data was a single byte.
  • + *
  • v2.0 - I got rid of methods that used booleans to set options. + * Now everything is more consolidated and cleaner. The code now detects + * when data that's being decoded is gzip-compressed and will decompress it + * automatically. Generally things are cleaner. You'll probably have to + * change some method calls that you were making to support the new + * options format (ints that you "OR" together).
  • + *
  • v1.5.1 - Fixed bug when decompressing and decoding to a + * byte[] using decode( String s, boolean gzipCompressed ). + * Added the ability to "suspend" encoding in the Output Stream so + * you can turn on and off the encoding if you need to embed base64 + * data in an otherwise "normal" stream (like an XML file).
  • + *
  • v1.5 - Output stream pases on flush() command but doesn't do anything itself. + * This helps when using GZIP streams. + * Added the ability to GZip-compress objects before encoding them.
  • + *
  • v1.4 - Added helper methods to read/write files.
  • + *
  • v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.
  • + *
  • v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream + * where last buffer being read, if not completely full, was not returned.
  • + *
  • v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.
  • + *
  • v1.3.3 - Fixed I/O streams which were totally messed up.
  • + *
+ * + *

+ * I am placing this code in the Public Domain. Do with it as you will. + * This software comes with no guarantees or warranties but with + * plenty of well-wishing instead! + * Please visit http://iharder.net/base64 + * periodically to check for updates or to contribute improvements. + *

+ * + * @author Robert Harder + * @author rob@iharder.net + * @version 2.3.7 + */ +public class Base64 +{ + +/* ******** P U B L I C F I E L D S ******** */ + + + /** No options specified. Value is zero. */ + public final static int NO_OPTIONS = 0; + + /** Specify encoding in first bit. Value is one. */ + public final static int ENCODE = 1; + + + /** Specify decoding in first bit. Value is zero. */ + public final static int DECODE = 0; + + + /** Specify that data should be gzip-compressed in second bit. Value is two. */ + public final static int GZIP = 2; + + /** Specify that gzipped data should not be automatically gunzipped. */ + public final static int DONT_GUNZIP = 4; + + + /** Do break lines when encoding. Value is 8. */ + public final static int DO_BREAK_LINES = 8; + + /** + * Encode using Base64-like encoding that is URL- and Filename-safe as described + * in Section 4 of RFC3548: + * http://www.faqs.org/rfcs/rfc3548.html. + * It is important to note that data encoded this way is not officially valid Base64, + * or at the very least should not be called Base64 without also specifying that is + * was encoded using the URL- and Filename-safe dialect. + */ + public final static int URL_SAFE = 16; + + + /** + * Encode using the special "ordered" dialect of Base64 described here: + * http://www.faqs.org/qa/rfcc-1940.html. + */ + public final static int ORDERED = 32; + + +/* ******** P R I V A T E F I E L D S ******** */ + + + /** Maximum line length (76) of Base64 output. */ + private final static int MAX_LINE_LENGTH = 76; + + + /** The equals sign (=) as a byte. */ + private final static byte EQUALS_SIGN = (byte)'='; + + + /** The new line character (\n) as a byte. */ + private final static byte NEW_LINE = (byte)'\n'; + + + /** Preferred encoding. */ + private final static String PREFERRED_ENCODING = "US-ASCII"; + + + private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding + private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding + + +/* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */ + + /** The 64 valid Base64 values. */ + /* Host platform me be something funny like EBCDIC, so we hardcode these values. */ + private final static byte[] _STANDARD_ALPHABET = { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/' + }; + + + /** + * Translates a Base64 value to either its 6-bit reconstruction value + * or a negative number indicating some other meaning. + **/ + private final static byte[] _STANDARD_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + 62, // Plus sign at decimal 43 + -9,-9,-9, // Decimal 44 - 46 + 63, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9,-9,-9, // Decimal 91 - 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9,-9 // Decimal 123 - 127 + ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 + }; + + +/* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */ + + /** + * Used in the URL- and Filename-safe dialect described in Section 4 of RFC3548: + * http://www.faqs.org/rfcs/rfc3548.html. + * Notice that the last two bytes become "hyphen" and "underscore" instead of "plus" and "slash." + */ + private final static byte[] _URL_SAFE_ALPHABET = { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'-', (byte)'_' + }; + + /** + * Used in decoding URL- and Filename-safe dialects of Base64. + */ + private final static byte[] _URL_SAFE_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 62, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 63, // Underscore at decimal 95 + -9, // Decimal 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9,-9 // Decimal 123 - 127 + ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 + }; + + + +/* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */ + + /** + * I don't get the point of this technique, but someone requested it, + * and it is described here: + * http://www.faqs.org/qa/rfcc-1940.html. + */ + private final static byte[] _ORDERED_ALPHABET = { + (byte)'-', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', + (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'_', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' + }; + + /** + * Used in decoding the "ordered" dialect of Base64. + */ + private final static byte[] _ORDERED_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 0, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 1,2,3,4,5,6,7,8,9,10, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 11,12,13,14,15,16,17,18,19,20,21,22,23, // Letters 'A' through 'M' + 24,25,26,27,28,29,30,31,32,33,34,35,36, // Letters 'N' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 37, // Underscore at decimal 95 + -9, // Decimal 96 + 38,39,40,41,42,43,44,45,46,47,48,49,50, // Letters 'a' through 'm' + 51,52,53,54,55,56,57,58,59,60,61,62,63, // Letters 'n' through 'z' + -9,-9,-9,-9,-9 // Decimal 123 - 127 + ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 + }; + + +/* ******** D E T E R M I N E W H I C H A L H A B E T ******** */ + + + /** + * Returns one of the _SOMETHING_ALPHABET byte arrays depending on + * the options specified. + * It's possible, though silly, to specify ORDERED and URLSAFE + * in which case one of them will be picked, though there is + * no guarantee as to which one will be picked. + */ + private final static byte[] getAlphabet( int options ) { + if ((options & URL_SAFE) == URL_SAFE) { + return _URL_SAFE_ALPHABET; + } else if ((options & ORDERED) == ORDERED) { + return _ORDERED_ALPHABET; + } else { + return _STANDARD_ALPHABET; + } + } // end getAlphabet + + + /** + * Returns one of the _SOMETHING_DECODABET byte arrays depending on + * the options specified. + * It's possible, though silly, to specify ORDERED and URL_SAFE + * in which case one of them will be picked, though there is + * no guarantee as to which one will be picked. + */ + private final static byte[] getDecodabet( int options ) { + if( (options & URL_SAFE) == URL_SAFE) { + return _URL_SAFE_DECODABET; + } else if ((options & ORDERED) == ORDERED) { + return _ORDERED_DECODABET; + } else { + return _STANDARD_DECODABET; + } + } // end getAlphabet + + + + /** Defeats instantiation. */ + private Base64(){} + + + + +/* ******** E N C O D I N G M E T H O D S ******** */ + + + /** + * Encodes up to the first three bytes of array threeBytes + * and returns a four-byte array in Base64 notation. + * The actual number of significant bytes in your array is + * given by numSigBytes. + * The array threeBytes needs only be as big as + * numSigBytes. + * Code can reuse a byte array by passing a four-byte array as b4. + * + * @param b4 A reusable byte array to reduce array instantiation + * @param threeBytes the array to convert + * @param numSigBytes the number of significant bytes in your array + * @return four byte array in Base64 notation. + * @since 1.5.1 + */ + private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, int options ) { + encode3to4( threeBytes, 0, numSigBytes, b4, 0, options ); + return b4; + } // end encode3to4 + + + /** + *

Encodes up to three bytes of the array source + * and writes the resulting four Base64 bytes to destination. + * The source and destination arrays can be manipulated + * anywhere along their length by specifying + * srcOffset and destOffset. + * This method does not check to make sure your arrays + * are large enough to accomodate srcOffset + 3 for + * the source array or destOffset + 4 for + * the destination array. + * The actual number of significant bytes in your array is + * given by numSigBytes.

+ *

This is the lowest level of the encoding methods with + * all possible parameters.

+ * + * @param source the array to convert + * @param srcOffset the index where conversion begins + * @param numSigBytes the number of significant bytes in your array + * @param destination the array to hold the conversion + * @param destOffset the index where output will be put + * @return the destination array + * @since 1.3 + */ + private static byte[] encode3to4( + byte[] source, int srcOffset, int numSigBytes, + byte[] destination, int destOffset, int options ) { + + byte[] ALPHABET = getAlphabet( options ); + + // 1 2 3 + // 01234567890123456789012345678901 Bit position + // --------000000001111111122222222 Array position from threeBytes + // --------| || || || | Six bit groups to index ALPHABET + // >>18 >>12 >> 6 >> 0 Right shift necessary + // 0x3f 0x3f 0x3f Additional AND + + // Create buffer with zero-padding if there are only one or two + // significant bytes passed in the array. + // We have to shift left 24 in order to flush out the 1's that appear + // when Java treats a value as negative that is cast from a byte to an int. + int inBuff = ( numSigBytes > 0 ? ((source[ srcOffset ] << 24) >>> 8) : 0 ) + | ( numSigBytes > 1 ? ((source[ srcOffset + 1 ] << 24) >>> 16) : 0 ) + | ( numSigBytes > 2 ? ((source[ srcOffset + 2 ] << 24) >>> 24) : 0 ); + + switch( numSigBytes ) + { + case 3: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = ALPHABET[ (inBuff ) & 0x3f ]; + return destination; + + case 2: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + case 1: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = EQUALS_SIGN; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + default: + return destination; + } // end switch + } // end encode3to4 + + + + /** + * Performs Base64 encoding on the raw ByteBuffer, + * writing it to the encoded ByteBuffer. + * This is an experimental feature. Currently it does not + * pass along any options (such as {@link #DO_BREAK_LINES} + * or {@link #GZIP}. + * + * @param raw input buffer + * @param encoded output buffer + * @since 2.3 + */ + public static void encode( java.nio.ByteBuffer raw, java.nio.ByteBuffer encoded ){ + byte[] raw3 = new byte[3]; + byte[] enc4 = new byte[4]; + + while( raw.hasRemaining() ){ + int rem = Math.min(3,raw.remaining()); + raw.get(raw3,0,rem); + Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); + encoded.put(enc4); + } // end input remaining + } + + + /** + * Performs Base64 encoding on the raw ByteBuffer, + * writing it to the encoded CharBuffer. + * This is an experimental feature. Currently it does not + * pass along any options (such as {@link #DO_BREAK_LINES} + * or {@link #GZIP}. + * + * @param raw input buffer + * @param encoded output buffer + * @since 2.3 + */ + public static void encode( java.nio.ByteBuffer raw, java.nio.CharBuffer encoded ){ + byte[] raw3 = new byte[3]; + byte[] enc4 = new byte[4]; + + while( raw.hasRemaining() ){ + int rem = Math.min(3,raw.remaining()); + raw.get(raw3,0,rem); + Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); + for( int i = 0; i < 4; i++ ){ + encoded.put( (char)(enc4[i] & 0xFF) ); + } + } // end input remaining + } + + + + + /** + * Serializes an object and returns the Base64-encoded + * version of that serialized object. + * + *

As of v 2.3, if the object + * cannot be serialized or there is another error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * The object is not GZip-compressed before being encoded. + * + * @param serializableObject The object to encode + * @return The Base64-encoded object + * @throws java.io.IOException if there is an error + * @throws NullPointerException if serializedObject is null + * @since 1.4 + */ + public static String encodeObject( java.io.Serializable serializableObject ) + throws java.io.IOException { + return encodeObject( serializableObject, NO_OPTIONS ); + } // end encodeObject + + + + /** + * Serializes an object and returns the Base64-encoded + * version of that serialized object. + * + *

As of v 2.3, if the object + * cannot be serialized or there is another error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * The object is not GZip-compressed before being encoded. + *

+ * Example options:

+     *   GZIP: gzip-compresses object before encoding it.
+     *   DO_BREAK_LINES: break lines at 76 characters
+     * 
+ *

+ * Example: encodeObject( myObj, Base64.GZIP ) or + *

+ * Example: encodeObject( myObj, Base64.GZIP | Base64.DO_BREAK_LINES ) + * + * @param serializableObject The object to encode + * @param options Specified options + * @return The Base64-encoded object + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @since 2.0 + */ + public static String encodeObject( java.io.Serializable serializableObject, int options ) + throws java.io.IOException { + + if( serializableObject == null ){ + throw new NullPointerException( "Cannot serialize a null object." ); + } // end if: null + + // Streams + java.io.ByteArrayOutputStream baos = null; + java.io.OutputStream b64os = null; + java.util.zip.GZIPOutputStream gzos = null; + java.io.ObjectOutputStream oos = null; + + + try { + // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream + baos = new java.io.ByteArrayOutputStream(); + b64os = new Base64.OutputStream( baos, ENCODE | options ); + if( (options & GZIP) != 0 ){ + // Gzip + gzos = new java.util.zip.GZIPOutputStream(b64os); + oos = new java.io.ObjectOutputStream( gzos ); + } else { + // Not gzipped + oos = new java.io.ObjectOutputStream( b64os ); + } + oos.writeObject( serializableObject ); + } // end try + catch( java.io.IOException e ) { + // Catch it and then throw it immediately so that + // the finally{} block is called for cleanup. + throw e; + } // end catch + finally { + try{ oos.close(); } catch( Exception e ){} + try{ gzos.close(); } catch( Exception e ){} + try{ b64os.close(); } catch( Exception e ){} + try{ baos.close(); } catch( Exception e ){} + } // end finally + + // Return value according to relevant encoding. + try { + return new String( baos.toByteArray(), PREFERRED_ENCODING ); + } // end try + catch (java.io.UnsupportedEncodingException uue){ + // Fall back to some Java default + return new String( baos.toByteArray() ); + } // end catch + + } // end encode + + + + /** + * Encodes a byte array into Base64 notation. + * Does not GZip-compress data. + * + * @param source The data to convert + * @return The data in Base64-encoded form + * @throws NullPointerException if source array is null + * @since 1.4 + */ + public static String encodeBytes( byte[] source ) { + // Since we're not going to have the GZIP encoding turned on, + // we're not going to have an java.io.IOException thrown, so + // we should not force the user to have to catch it. + String encoded = null; + try { + encoded = encodeBytes(source, 0, source.length, NO_OPTIONS); + } catch (java.io.IOException ex) { + assert false : ex.getMessage(); + } // end catch + assert encoded != null; + return encoded; + } // end encodeBytes + + + + /** + * Encodes a byte array into Base64 notation. + *

+ * Example options:

+     *   GZIP: gzip-compresses object before encoding it.
+     *   DO_BREAK_LINES: break lines at 76 characters
+     *     Note: Technically, this makes your encoding non-compliant.
+     * 
+ *

+ * Example: encodeBytes( myData, Base64.GZIP ) or + *

+ * Example: encodeBytes( myData, Base64.GZIP | Base64.DO_BREAK_LINES ) + * + * + *

As of v 2.3, if there is an error with the GZIP stream, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * + * @param source The data to convert + * @param options Specified options + * @return The Base64-encoded data as a String + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @throws NullPointerException if source array is null + * @since 2.0 + */ + public static String encodeBytes( byte[] source, int options ) throws java.io.IOException { + return encodeBytes( source, 0, source.length, options ); + } // end encodeBytes + + + /** + * Encodes a byte array into Base64 notation. + * Does not GZip-compress data. + * + *

As of v 2.3, if there is an error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * + * @param source The data to convert + * @param off Offset in array where conversion should begin + * @param len Length of data to convert + * @return The Base64-encoded data as a String + * @throws NullPointerException if source array is null + * @throws IllegalArgumentException if source array, offset, or length are invalid + * @since 1.4 + */ + public static String encodeBytes( byte[] source, int off, int len ) { + // Since we're not going to have the GZIP encoding turned on, + // we're not going to have an java.io.IOException thrown, so + // we should not force the user to have to catch it. + String encoded = null; + try { + encoded = encodeBytes( source, off, len, NO_OPTIONS ); + } catch (java.io.IOException ex) { + assert false : ex.getMessage(); + } // end catch + assert encoded != null; + return encoded; + } // end encodeBytes + + + + /** + * Encodes a byte array into Base64 notation. + *

+ * Example options:

+     *   GZIP: gzip-compresses object before encoding it.
+     *   DO_BREAK_LINES: break lines at 76 characters
+     *     Note: Technically, this makes your encoding non-compliant.
+     * 
+ *

+ * Example: encodeBytes( myData, Base64.GZIP ) or + *

+ * Example: encodeBytes( myData, Base64.GZIP | Base64.DO_BREAK_LINES ) + * + * + *

As of v 2.3, if there is an error with the GZIP stream, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * + * @param source The data to convert + * @param off Offset in array where conversion should begin + * @param len Length of data to convert + * @param options Specified options + * @return The Base64-encoded data as a String + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @throws NullPointerException if source array is null + * @throws IllegalArgumentException if source array, offset, or length are invalid + * @since 2.0 + */ + public static String encodeBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { + byte[] encoded = encodeBytesToBytes( source, off, len, options ); + + // Return value according to relevant encoding. + try { + return new String( encoded, PREFERRED_ENCODING ); + } // end try + catch (java.io.UnsupportedEncodingException uue) { + return new String( encoded ); + } // end catch + + } // end encodeBytes + + + + + /** + * Similar to {@link #encodeBytes(byte[])} but returns + * a byte array instead of instantiating a String. This is more efficient + * if you're working with I/O streams and have large data sets to encode. + * + * + * @param source The data to convert + * @return The Base64-encoded data as a byte[] (of ASCII characters) + * @throws NullPointerException if source array is null + * @since 2.3.1 + */ + public static byte[] encodeBytesToBytes( byte[] source ) { + byte[] encoded = null; + try { + encoded = encodeBytesToBytes( source, 0, source.length, Base64.NO_OPTIONS ); + } catch( java.io.IOException ex ) { + assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); + } + return encoded; + } + + + /** + * Similar to {@link #encodeBytes(byte[], int, int, int)} but returns + * a byte array instead of instantiating a String. This is more efficient + * if you're working with I/O streams and have large data sets to encode. + * + * + * @param source The data to convert + * @param off Offset in array where conversion should begin + * @param len Length of data to convert + * @param options Specified options + * @return The Base64-encoded data as a String + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @throws NullPointerException if source array is null + * @throws IllegalArgumentException if source array, offset, or length are invalid + * @since 2.3.1 + */ + public static byte[] encodeBytesToBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { + + if( source == null ){ + throw new NullPointerException( "Cannot serialize a null array." ); + } // end if: null + + if( off < 0 ){ + throw new IllegalArgumentException( "Cannot have negative offset: " + off ); + } // end if: off < 0 + + if( len < 0 ){ + throw new IllegalArgumentException( "Cannot have length offset: " + len ); + } // end if: len < 0 + + if( off + len > source.length ){ + throw new IllegalArgumentException( + String.format( "Cannot have offset of %d and length of %d with array of length %d", off,len,source.length)); + } // end if: off < 0 + + + + // Compress? + if( (options & GZIP) != 0 ) { + java.io.ByteArrayOutputStream baos = null; + java.util.zip.GZIPOutputStream gzos = null; + Base64.OutputStream b64os = null; + + try { + // GZip -> Base64 -> ByteArray + baos = new java.io.ByteArrayOutputStream(); + b64os = new Base64.OutputStream( baos, ENCODE | options ); + gzos = new java.util.zip.GZIPOutputStream( b64os ); + + gzos.write( source, off, len ); + gzos.close(); + } // end try + catch( java.io.IOException e ) { + // Catch it and then throw it immediately so that + // the finally{} block is called for cleanup. + throw e; + } // end catch + finally { + try{ gzos.close(); } catch( Exception e ){} + try{ b64os.close(); } catch( Exception e ){} + try{ baos.close(); } catch( Exception e ){} + } // end finally + + return baos.toByteArray(); + } // end if: compress + + // Else, don't compress. Better not to use streams at all then. + else { + boolean breakLines = (options & DO_BREAK_LINES) != 0; + + //int len43 = len * 4 / 3; + //byte[] outBuff = new byte[ ( len43 ) // Main 4:3 + // + ( (len % 3) > 0 ? 4 : 0 ) // Account for padding + // + (breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0) ]; // New lines + // Try to determine more precisely how big the array needs to be. + // If we get it right, we don't have to do an array copy, and + // we save a bunch of memory. + int encLen = ( len / 3 ) * 4 + ( len % 3 > 0 ? 4 : 0 ); // Bytes needed for actual encoding + if( breakLines ){ + encLen += encLen / MAX_LINE_LENGTH; // Plus extra newline characters + } + byte[] outBuff = new byte[ encLen ]; + + + int d = 0; + int e = 0; + int len2 = len - 2; + int lineLength = 0; + for( ; d < len2; d+=3, e+=4 ) { + encode3to4( source, d+off, 3, outBuff, e, options ); + + lineLength += 4; + if( breakLines && lineLength >= MAX_LINE_LENGTH ) + { + outBuff[e+4] = NEW_LINE; + e++; + lineLength = 0; + } // end if: end of line + } // en dfor: each piece of array + + if( d < len ) { + encode3to4( source, d+off, len - d, outBuff, e, options ); + e += 4; + } // end if: some padding needed + + + // Only resize array if we didn't guess it right. + if( e <= outBuff.length - 1 ){ + // If breaking lines and the last byte falls right at + // the line length (76 bytes per line), there will be + // one extra byte, and the array will need to be resized. + // Not too bad of an estimate on array size, I'd say. + byte[] finalOut = new byte[e]; + System.arraycopy(outBuff,0, finalOut,0,e); + //System.err.println("Having to resize array from " + outBuff.length + " to " + e ); + return finalOut; + } else { + //System.err.println("No need to resize array."); + return outBuff; + } + + } // end else: don't compress + + } // end encodeBytesToBytes + + + + + +/* ******** D E C O D I N G M E T H O D S ******** */ + + + /** + * Decodes four bytes from array source + * and writes the resulting bytes (up to three of them) + * to destination. + * The source and destination arrays can be manipulated + * anywhere along their length by specifying + * srcOffset and destOffset. + * This method does not check to make sure your arrays + * are large enough to accomodate srcOffset + 4 for + * the source array or destOffset + 3 for + * the destination array. + * This method returns the actual number of bytes that + * were converted from the Base64 encoding. + *

This is the lowest level of the decoding methods with + * all possible parameters.

+ * + * + * @param source the array to convert + * @param srcOffset the index where conversion begins + * @param destination the array to hold the conversion + * @param destOffset the index where output will be put + * @param options alphabet type is pulled from this (standard, url-safe, ordered) + * @return the number of decoded bytes converted + * @throws NullPointerException if source or destination arrays are null + * @throws IllegalArgumentException if srcOffset or destOffset are invalid + * or there is not enough room in the array. + * @since 1.3 + */ + private static int decode4to3( + byte[] source, int srcOffset, + byte[] destination, int destOffset, int options ) { + + // Lots of error checking and exception throwing + if( source == null ){ + throw new NullPointerException( "Source array was null." ); + } // end if + if( destination == null ){ + throw new NullPointerException( "Destination array was null." ); + } // end if + if( srcOffset < 0 || srcOffset + 3 >= source.length ){ + throw new IllegalArgumentException( String.format( + "Source array with length %d cannot have offset of %d and still process four bytes.", source.length, srcOffset ) ); + } // end if + if( destOffset < 0 || destOffset +2 >= destination.length ){ + throw new IllegalArgumentException( String.format( + "Destination array with length %d cannot have offset of %d and still store three bytes.", destination.length, destOffset ) ); + } // end if + + + byte[] DECODABET = getDecodabet( options ); + + // Example: Dk== + if( source[ srcOffset + 2] == EQUALS_SIGN ) { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + return 1; + } + + // Example: DkL= + else if( source[ srcOffset + 3 ] == EQUALS_SIGN ) { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 ); + return 2; + } + + // Example: DkLE + else { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ) + // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6) + | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) ); + + + destination[ destOffset ] = (byte)( outBuff >> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >> 8 ); + destination[ destOffset + 2 ] = (byte)( outBuff ); + + return 3; + } + } // end decodeToBytes + + + + + + /** + * Low-level access to decoding ASCII characters in + * the form of a byte array. Ignores GUNZIP option, if + * it's set. This is not generally a recommended method, + * although it is used internally as part of the decoding process. + * Special case: if len = 0, an empty array is returned. Still, + * if you need more speed and reduced memory footprint (and aren't + * gzipping), consider this method. + * + * @param source The Base64 encoded data + * @return decoded data + * @since 2.3.1 + */ + public static byte[] decode( byte[] source ) + throws java.io.IOException { + byte[] decoded; +// try { + decoded = decode( source, 0, source.length, Base64.NO_OPTIONS ); +// } catch( java.io.IOException ex ) { +// assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); +// } + return decoded; + } + + + + /** + * Low-level access to decoding ASCII characters in + * the form of a byte array. Ignores GUNZIP option, if + * it's set. This is not generally a recommended method, + * although it is used internally as part of the decoding process. + * Special case: if len = 0, an empty array is returned. Still, + * if you need more speed and reduced memory footprint (and aren't + * gzipping), consider this method. + * + * @param source The Base64 encoded data + * @param off The offset of where to begin decoding + * @param len The length of characters to decode + * @param options Can specify options such as alphabet type to use + * @return decoded data + * @throws java.io.IOException If bogus characters exist in source data + * @since 1.3 + */ + public static byte[] decode( byte[] source, int off, int len, int options ) + throws java.io.IOException { + + // Lots of error checking and exception throwing + if( source == null ){ + throw new NullPointerException( "Cannot decode null source array." ); + } // end if + if( off < 0 || off + len > source.length ){ + throw new IllegalArgumentException( String.format( + "Source array with length %d cannot have offset of %d and process %d bytes.", source.length, off, len ) ); + } // end if + + if( len == 0 ){ + return new byte[0]; + }else if( len < 4 ){ + throw new IllegalArgumentException( + "Base64-encoded string must have at least four characters, but length specified was " + len ); + } // end if + + byte[] DECODABET = getDecodabet( options ); + + int len34 = len * 3 / 4; // Estimate on array size + byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output + int outBuffPosn = 0; // Keep track of where we're writing + + byte[] b4 = new byte[4]; // Four byte buffer from source, eliminating white space + int b4Posn = 0; // Keep track of four byte input buffer + int i; // Source array counter + byte sbiDecode; // Special value from DECODABET + + for( i = off; i < off+len; i++ ) { // Loop through source + + sbiDecode = DECODABET[ source[i]&0xFF ]; + + // White space, Equals sign, or legit Base64 character + // Note the values such as -5 and -9 in the + // DECODABETs at the top of the file. + if( sbiDecode >= WHITE_SPACE_ENC ) { + if( sbiDecode >= EQUALS_SIGN_ENC ) { + b4[ b4Posn++ ] = source[i]; // Save non-whitespace + if( b4Posn > 3 ) { // Time to decode? + outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn, options ); + b4Posn = 0; + + // If that was the equals sign, break out of 'for' loop + if( source[i] == EQUALS_SIGN ) { + break; + } // end if: equals sign + } // end if: quartet built + } // end if: equals sign or better + } // end if: white space, equals sign or better + else { + // There's a bad input character in the Base64 stream. + throw new java.io.IOException( String.format( + "Bad Base64 input character decimal %d in array position %d", ((int)source[i])&0xFF, i ) ); + } // end else: + } // each input character + + byte[] out = new byte[ outBuffPosn ]; + System.arraycopy( outBuff, 0, out, 0, outBuffPosn ); + return out; + } // end decode + + + + + /** + * Decodes data from Base64 notation, automatically + * detecting gzip-compressed data and decompressing it. + * + * @param s the string to decode + * @return the decoded data + * @throws java.io.IOException If there is a problem + * @since 1.4 + */ + public static byte[] decode( String s ) throws java.io.IOException { + return decode( s, NO_OPTIONS ); + } + + + + /** + * Decodes data from Base64 notation, automatically + * detecting gzip-compressed data and decompressing it. + * + * @param s the string to decode + * @param options encode options such as URL_SAFE + * @return the decoded data + * @throws java.io.IOException if there is an error + * @throws NullPointerException if s is null + * @since 1.4 + */ + public static byte[] decode( String s, int options ) throws java.io.IOException { + + if( s == null ){ + throw new NullPointerException( "Input string was null." ); + } // end if + + byte[] bytes; + try { + bytes = s.getBytes( PREFERRED_ENCODING ); + } // end try + catch( java.io.UnsupportedEncodingException uee ) { + bytes = s.getBytes(); + } // end catch + // + + // Decode + bytes = decode( bytes, 0, bytes.length, options ); + + // Check to see if it's gzip-compressed + // GZIP Magic Two-Byte Number: 0x8b1f (35615) + boolean dontGunzip = (options & DONT_GUNZIP) != 0; + if( (bytes != null) && (bytes.length >= 4) && (!dontGunzip) ) { + + int head = ((int)bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00); + if( java.util.zip.GZIPInputStream.GZIP_MAGIC == head ) { + java.io.ByteArrayInputStream bais = null; + java.util.zip.GZIPInputStream gzis = null; + java.io.ByteArrayOutputStream baos = null; + byte[] buffer = new byte[2048]; + int length; + + try { + baos = new java.io.ByteArrayOutputStream(); + bais = new java.io.ByteArrayInputStream( bytes ); + gzis = new java.util.zip.GZIPInputStream( bais ); + + while( ( length = gzis.read( buffer ) ) >= 0 ) { + baos.write(buffer,0,length); + } // end while: reading input + + // No error? Get new bytes. + bytes = baos.toByteArray(); + + } // end try + catch( java.io.IOException e ) { + e.printStackTrace(); + // Just return originally-decoded bytes + } // end catch + finally { + try{ baos.close(); } catch( Exception e ){} + try{ gzis.close(); } catch( Exception e ){} + try{ bais.close(); } catch( Exception e ){} + } // end finally + + } // end if: gzipped + } // end if: bytes.length >= 2 + + return bytes; + } // end decode + + + + /** + * Attempts to decode Base64 data and deserialize a Java + * Object within. Returns null if there was an error. + * + * @param encodedObject The Base64 data to decode + * @return The decoded and deserialized object + * @throws NullPointerException if encodedObject is null + * @throws java.io.IOException if there is a general error + * @throws ClassNotFoundException if the decoded object is of a + * class that cannot be found by the JVM + * @since 1.5 + */ + public static Object decodeToObject( String encodedObject ) + throws java.io.IOException, java.lang.ClassNotFoundException { + return decodeToObject(encodedObject,NO_OPTIONS,null); + } + + + /** + * Attempts to decode Base64 data and deserialize a Java + * Object within. Returns null if there was an error. + * If loader is not null, it will be the class loader + * used when deserializing. + * + * @param encodedObject The Base64 data to decode + * @param options Various parameters related to decoding + * @param loader Optional class loader to use in deserializing classes. + * @return The decoded and deserialized object + * @throws NullPointerException if encodedObject is null + * @throws java.io.IOException if there is a general error + * @throws ClassNotFoundException if the decoded object is of a + * class that cannot be found by the JVM + * @since 2.3.4 + */ + public static Object decodeToObject( + String encodedObject, int options, final ClassLoader loader ) + throws java.io.IOException, java.lang.ClassNotFoundException { + + // Decode and gunzip if necessary + byte[] objBytes = decode( encodedObject, options ); + + java.io.ByteArrayInputStream bais = null; + java.io.ObjectInputStream ois = null; + Object obj; + + try { + bais = new java.io.ByteArrayInputStream( objBytes ); + + // If no custom class loader is provided, use Java's builtin OIS. + if( loader == null ){ + ois = new java.io.ObjectInputStream( bais ); + } // end if: no loader provided + + // Else make a customized object input stream that uses + // the provided class loader. + else { + ois = new java.io.ObjectInputStream(bais){ + @Override + public Class resolveClass(java.io.ObjectStreamClass streamClass) + throws java.io.IOException, ClassNotFoundException { + Class c = Class.forName(streamClass.getName(), false, loader); + if( c == null ){ + return super.resolveClass(streamClass); + } else { + return c; // Class loader knows of this class. + } // end else: not null + } // end resolveClass + }; // end ois + } // end else: no custom class loader + + obj = ois.readObject(); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw in order to execute finally{} + } // end catch + catch( java.lang.ClassNotFoundException e ) { + throw e; // Catch and throw in order to execute finally{} + } // end catch + finally { + try{ bais.close(); } catch( Exception e ){} + try{ ois.close(); } catch( Exception e ){} + } // end finally + + return obj; + } // end decodeObject + + + + /** + * Convenience method for encoding data to a file. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param dataToEncode byte array of data to encode in base64 form + * @param filename Filename for saving encoded data + * @throws java.io.IOException if there is an error + * @throws NullPointerException if dataToEncode is null + * @since 2.1 + */ + public static void encodeToFile( byte[] dataToEncode, String filename ) + throws java.io.IOException { + + if( dataToEncode == null ){ + throw new NullPointerException( "Data to encode was null." ); + } // end iff + + Base64.OutputStream bos = null; + try { + bos = new Base64.OutputStream( + new java.io.FileOutputStream( filename ), Base64.ENCODE ); + bos.write( dataToEncode ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw to execute finally{} block + } // end catch: java.io.IOException + finally { + try{ bos.close(); } catch( Exception e ){} + } // end finally + + } // end encodeToFile + + + /** + * Convenience method for decoding data to a file. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param dataToDecode Base64-encoded data as a string + * @param filename Filename for saving decoded data + * @throws java.io.IOException if there is an error + * @since 2.1 + */ + public static void decodeToFile( String dataToDecode, String filename ) + throws java.io.IOException { + + Base64.OutputStream bos = null; + try{ + bos = new Base64.OutputStream( + new java.io.FileOutputStream( filename ), Base64.DECODE ); + bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw to execute finally{} block + } // end catch: java.io.IOException + finally { + try{ bos.close(); } catch( Exception e ){} + } // end finally + + } // end decodeToFile + + + + + /** + * Convenience method for reading a base64-encoded + * file and decoding it. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param filename Filename for reading encoded data + * @return decoded byte array + * @throws java.io.IOException if there is an error + * @since 2.1 + */ + public static byte[] decodeFromFile( String filename ) + throws java.io.IOException { + + byte[] decodedData; + Base64.InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer; + int length = 0; + int numBytes; + + // Check for size of file + if( file.length() > Integer.MAX_VALUE ) + { + throw new java.io.IOException( "File is too big for this convenience method (" + file.length() + " bytes)." ); + } // end if: file too big for int index + buffer = new byte[ (int)file.length() ]; + + // Open a stream + bis = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.DECODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { + length += numBytes; + } // end while + + // Save in a variable to return + decodedData = new byte[ length ]; + System.arraycopy( buffer, 0, decodedData, 0, length ); + + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch: java.io.IOException + finally { + try{ bis.close(); } catch( Exception e) {} + } // end finally + + return decodedData; + } // end decodeFromFile + + + + /** + * Convenience method for reading a binary file + * and base64-encoding it. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param filename Filename for reading binary data + * @return base64-encoded string + * @throws java.io.IOException if there is an error + * @since 2.1 + */ + public static String encodeFromFile( String filename ) + throws java.io.IOException { + + String encodedData; + Base64.InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer = new byte[ Math.max((int)(file.length() * 1.4+1),40) ]; // Need max() for math on small files (v2.2.1); Need +1 for a few corner cases (v2.3.5) + int length = 0; + int numBytes; + + // Open a stream + bis = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.ENCODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { + length += numBytes; + } // end while + + // Save in a variable to return + encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING ); + + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch: java.io.IOException + finally { + try{ bis.close(); } catch( Exception e) {} + } // end finally + + return encodedData; + } // end encodeFromFile + + /** + * Reads infile and encodes it to outfile. + * + * @param infile Input file + * @param outfile Output file + * @throws java.io.IOException if there is an error + * @since 2.2 + */ + public static void encodeFileToFile( String infile, String outfile ) + throws java.io.IOException { + + String encoded = Base64.encodeFromFile( infile ); + java.io.OutputStream out = null; + try{ + out = new java.io.BufferedOutputStream( + new java.io.FileOutputStream( outfile ) ); + out.write( encoded.getBytes("US-ASCII") ); // Strict, 7-bit output. + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch + finally { + try { out.close(); } + catch( Exception ex ){} + } // end finally + } // end encodeFileToFile + + + /** + * Reads infile and decodes it to outfile. + * + * @param infile Input file + * @param outfile Output file + * @throws java.io.IOException if there is an error + * @since 2.2 + */ + public static void decodeFileToFile( String infile, String outfile ) + throws java.io.IOException { + + byte[] decoded = Base64.decodeFromFile( infile ); + java.io.OutputStream out = null; + try{ + out = new java.io.BufferedOutputStream( + new java.io.FileOutputStream( outfile ) ); + out.write( decoded ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch + finally { + try { out.close(); } + catch( Exception ex ){} + } // end finally + } // end decodeFileToFile + + + /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */ + + + + /** + * A {@link Base64.InputStream} will read data from another + * java.io.InputStream, given in the constructor, + * and encode/decode to/from Base64 notation on the fly. + * + * @see Base64 + * @since 1.3 + */ + public static class InputStream extends java.io.FilterInputStream { + + private boolean encode; // Encoding or decoding + private int position; // Current position in the buffer + private byte[] buffer; // Small buffer holding converted data + private int bufferLength; // Length of buffer (3 or 4) + private int numSigBytes; // Number of meaningful bytes in the buffer + private int lineLength; + private boolean breakLines; // Break lines at less than 80 characters + private int options; // Record options used to create the stream. + private byte[] decodabet; // Local copies to avoid extra method calls + + + /** + * Constructs a {@link Base64.InputStream} in DECODE mode. + * + * @param in the java.io.InputStream from which to read data. + * @since 1.3 + */ + public InputStream( java.io.InputStream in ) { + this( in, DECODE ); + } // end constructor + + + /** + * Constructs a {@link Base64.InputStream} in + * either ENCODE or DECODE mode. + *

+ * Valid options:

+         *   ENCODE or DECODE: Encode or Decode as data is read.
+         *   DO_BREAK_LINES: break lines at 76 characters
+         *     (only meaningful when encoding)
+         * 
+ *

+ * Example: new Base64.InputStream( in, Base64.DECODE ) + * + * + * @param in the java.io.InputStream from which to read data. + * @param options Specified options + * @see Base64#ENCODE + * @see Base64#DECODE + * @see Base64#DO_BREAK_LINES + * @since 2.0 + */ + public InputStream( java.io.InputStream in, int options ) { + + super( in ); + this.options = options; // Record for later + this.breakLines = (options & DO_BREAK_LINES) > 0; + this.encode = (options & ENCODE) > 0; + this.bufferLength = encode ? 4 : 3; + this.buffer = new byte[ bufferLength ]; + this.position = -1; + this.lineLength = 0; + this.decodabet = getDecodabet(options); + } // end constructor + + /** + * Reads enough of the input stream to convert + * to/from Base64 and returns the next byte. + * + * @return next byte + * @since 1.3 + */ + @Override + public int read() throws java.io.IOException { + + // Do we need to get data? + if( position < 0 ) { + if( encode ) { + byte[] b3 = new byte[3]; + int numBinaryBytes = 0; + for( int i = 0; i < 3; i++ ) { + int b = in.read(); + + // If end of stream, b is -1. + if( b >= 0 ) { + b3[i] = (byte)b; + numBinaryBytes++; + } else { + break; // out of for loop + } // end else: end of stream + + } // end for: each needed input byte + + if( numBinaryBytes > 0 ) { + encode3to4( b3, 0, numBinaryBytes, buffer, 0, options ); + position = 0; + numSigBytes = 4; + } // end if: got data + else { + return -1; // Must be end of stream + } // end else + } // end if: encoding + + // Else decoding + else { + byte[] b4 = new byte[4]; + int i; + for( i = 0; i < 4; i++ ) { + // Read four "meaningful" bytes: + int b; + do{ b = in.read(); } + while( b >= 0 && decodabet[ b & 0x7f ] <= WHITE_SPACE_ENC ); + + if( b < 0 ) { + break; // Reads a -1 if end of stream + } // end if: end of stream + + b4[i] = (byte)b; + } // end for: each needed input byte + + if( i == 4 ) { + numSigBytes = decode4to3( b4, 0, buffer, 0, options ); + position = 0; + } // end if: got four characters + else if( i == 0 ){ + return -1; + } // end else if: also padded correctly + else { + // Must have broken out from above. + throw new java.io.IOException( "Improperly padded Base64 input." ); + } // end + + } // end else: decode + } // end else: get data + + // Got data? + if( position >= 0 ) { + // End of relevant data? + if( /*!encode &&*/ position >= numSigBytes ){ + return -1; + } // end if: got data + + if( encode && breakLines && lineLength >= MAX_LINE_LENGTH ) { + lineLength = 0; + return '\n'; + } // end if + else { + lineLength++; // This isn't important when decoding + // but throwing an extra "if" seems + // just as wasteful. + + int b = buffer[ position++ ]; + + if( position >= bufferLength ) { + position = -1; + } // end if: end + + return b & 0xFF; // This is how you "cast" a byte that's + // intended to be unsigned. + } // end else + } // end if: position >= 0 + + // Else error + else { + throw new java.io.IOException( "Error in Base64 code reading stream." ); + } // end else + } // end read + + + /** + * Calls {@link #read()} repeatedly until the end of stream + * is reached or len bytes are read. + * Returns number of bytes read into array or -1 if + * end of stream is encountered. + * + * @param dest array to hold values + * @param off offset for array + * @param len max number of bytes to read into array + * @return bytes read into array or -1 if end of stream is encountered. + * @since 1.3 + */ + @Override + public int read( byte[] dest, int off, int len ) + throws java.io.IOException { + int i; + int b; + for( i = 0; i < len; i++ ) { + b = read(); + + if( b >= 0 ) { + dest[off + i] = (byte) b; + } + else if( i == 0 ) { + return -1; + } + else { + break; // Out of 'for' loop + } // Out of 'for' loop + } // end for: each byte read + return i; + } // end read + + } // end inner class InputStream + + + + + + + /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */ + + + + /** + * A {@link Base64.OutputStream} will write data to another + * java.io.OutputStream, given in the constructor, + * and encode/decode to/from Base64 notation on the fly. + * + * @see Base64 + * @since 1.3 + */ + public static class OutputStream extends java.io.FilterOutputStream { + + private boolean encode; + private int position; + private byte[] buffer; + private int bufferLength; + private int lineLength; + private boolean breakLines; + private byte[] b4; // Scratch used in a few places + private boolean suspendEncoding; + private int options; // Record for later + private byte[] decodabet; // Local copies to avoid extra method calls + + /** + * Constructs a {@link Base64.OutputStream} in ENCODE mode. + * + * @param out the java.io.OutputStream to which data will be written. + * @since 1.3 + */ + public OutputStream( java.io.OutputStream out ) { + this( out, ENCODE ); + } // end constructor + + + /** + * Constructs a {@link Base64.OutputStream} in + * either ENCODE or DECODE mode. + *

+ * Valid options:

+         *   ENCODE or DECODE: Encode or Decode as data is read.
+         *   DO_BREAK_LINES: don't break lines at 76 characters
+         *     (only meaningful when encoding)
+         * 
+ *

+ * Example: new Base64.OutputStream( out, Base64.ENCODE ) + * + * @param out the java.io.OutputStream to which data will be written. + * @param options Specified options. + * @see Base64#ENCODE + * @see Base64#DECODE + * @see Base64#DO_BREAK_LINES + * @since 1.3 + */ + public OutputStream( java.io.OutputStream out, int options ) { + super( out ); + this.breakLines = (options & DO_BREAK_LINES) != 0; + this.encode = (options & ENCODE) != 0; + this.bufferLength = encode ? 3 : 4; + this.buffer = new byte[ bufferLength ]; + this.position = 0; + this.lineLength = 0; + this.suspendEncoding = false; + this.b4 = new byte[4]; + this.options = options; + this.decodabet = getDecodabet(options); + } // end constructor + + + /** + * Writes the byte to the output stream after + * converting to/from Base64 notation. + * When encoding, bytes are buffered three + * at a time before the output stream actually + * gets a write() call. + * When decoding, bytes are buffered four + * at a time. + * + * @param theByte the byte to write + * @since 1.3 + */ + @Override + public void write(int theByte) + throws java.io.IOException { + // Encoding suspended? + if( suspendEncoding ) { + this.out.write( theByte ); + return; + } // end if: supsended + + // Encode? + if( encode ) { + buffer[ position++ ] = (byte)theByte; + if( position >= bufferLength ) { // Enough to encode. + + this.out.write( encode3to4( b4, buffer, bufferLength, options ) ); + + lineLength += 4; + if( breakLines && lineLength >= MAX_LINE_LENGTH ) { + this.out.write( NEW_LINE ); + lineLength = 0; + } // end if: end of line + + position = 0; + } // end if: enough to output + } // end if: encoding + + // Else, Decoding + else { + // Meaningful Base64 character? + if( decodabet[ theByte & 0x7f ] > WHITE_SPACE_ENC ) { + buffer[ position++ ] = (byte)theByte; + if( position >= bufferLength ) { // Enough to output. + + int len = Base64.decode4to3( buffer, 0, b4, 0, options ); + out.write( b4, 0, len ); + position = 0; + } // end if: enough to output + } // end if: meaningful base64 character + else if( decodabet[ theByte & 0x7f ] != WHITE_SPACE_ENC ) { + throw new java.io.IOException( "Invalid character in Base64 data." ); + } // end else: not white space either + } // end else: decoding + } // end write + + + + /** + * Calls {@link #write(int)} repeatedly until len + * bytes are written. + * + * @param theBytes array from which to read bytes + * @param off offset for array + * @param len max number of bytes to read into array + * @since 1.3 + */ + @Override + public void write( byte[] theBytes, int off, int len ) + throws java.io.IOException { + // Encoding suspended? + if( suspendEncoding ) { + this.out.write( theBytes, off, len ); + return; + } // end if: supsended + + for( int i = 0; i < len; i++ ) { + write( theBytes[ off + i ] ); + } // end for: each byte written + + } // end write + + + + /** + * Method added by PHIL. [Thanks, PHIL. -Rob] + * This pads the buffer without closing the stream. + * @throws java.io.IOException if there's an error. + */ + public void flushBase64() throws java.io.IOException { + if( position > 0 ) { + if( encode ) { + out.write( encode3to4( b4, buffer, position, options ) ); + position = 0; + } // end if: encoding + else { + throw new java.io.IOException( "Base64 input not properly padded." ); + } // end else: decoding + } // end if: buffer partially full + + } // end flush + + + /** + * Flushes and closes (I think, in the superclass) the stream. + * + * @since 1.3 + */ + @Override + public void close() throws java.io.IOException { + // 1. Ensure that pending characters are written + flushBase64(); + + // 2. Actually close the stream + // Base class both flushes and closes. + super.close(); + + buffer = null; + out = null; + } // end close + + + + /** + * Suspends encoding of the stream. + * May be helpful if you need to embed a piece of + * base64-encoded data in a stream. + * + * @throws java.io.IOException if there's an error flushing + * @since 1.5.1 + */ + public void suspendEncoding() throws java.io.IOException { + flushBase64(); + this.suspendEncoding = true; + } // end suspendEncoding + + + /** + * Resumes encoding of the stream. + * May be helpful if you need to embed a piece of + * base64-encoded data in a stream. + * + * @since 1.5.1 + */ + public void resumeEncoding() { + this.suspendEncoding = false; + } // end resumeEncoding + + + + } // end inner class OutputStream + + +} // end class Base64 diff --git a/src/org/java_websocket/util/Charsetfunctions.java b/src/org/java_websocket/util/Charsetfunctions.java new file mode 100644 index 0000000..bd8ad29 --- /dev/null +++ b/src/org/java_websocket/util/Charsetfunctions.java @@ -0,0 +1,90 @@ +package org.java_websocket.util; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; + +import org.java_websocket.exceptions.InvalidDataException; +import org.java_websocket.framing.CloseFrame; + +public class Charsetfunctions { + + public static CodingErrorAction codingErrorAction = CodingErrorAction.REPORT; + + /* + * @return UTF-8 encoding in bytes + */ + public static byte[] utf8Bytes( String s ) { + try { + return s.getBytes( "UTF8" ); + } catch ( UnsupportedEncodingException e ) { + throw new RuntimeException( e ); + } + } + + /* + * @return ASCII encoding in bytes + */ + public static byte[] asciiBytes( String s ) { + try { + return s.getBytes( "ASCII" ); + } catch ( UnsupportedEncodingException e ) { + throw new RuntimeException( e ); + } + } + + public static String stringAscii( byte[] bytes ) { + return stringAscii( bytes, 0, bytes.length ); + } + + public static String stringAscii( byte[] bytes, int offset, int length ){ + try { + return new String( bytes, offset, length, "ASCII" ); + } catch ( UnsupportedEncodingException e ) { + throw new RuntimeException( e ); + } + } + + public static String stringUtf8( byte[] bytes ) throws InvalidDataException { + return stringUtf8( ByteBuffer.wrap( bytes ) ); + } + + /*public static String stringUtf8( byte[] bytes, int off, int length ) throws InvalidDataException { + CharsetDecoder decode = Charset.forName( "UTF8" ).newDecoder(); + decode.onMalformedInput( codingErrorAction ); + decode.onUnmappableCharacter( codingErrorAction ); + //decode.replaceWith( "X" ); + String s; + try { + s = decode.decode( ByteBuffer.wrap( bytes, off, length ) ).toString(); + } catch ( CharacterCodingException e ) { + throw new InvalidDataException( CloseFrame.NO_UTF8, e ); + } + return s; + }*/ + + public static String stringUtf8( ByteBuffer bytes ) throws InvalidDataException { + CharsetDecoder decode = Charset.forName( "UTF8" ).newDecoder(); + decode.onMalformedInput( codingErrorAction ); + decode.onUnmappableCharacter( codingErrorAction ); + // decode.replaceWith( "X" ); + String s; + try { + bytes.mark(); + s = decode.decode( bytes ).toString(); + bytes.reset(); + } catch ( CharacterCodingException e ) { + throw new InvalidDataException( CloseFrame.NO_UTF8, e ); + } + return s; + } + + public static void main( String[] args ) throws InvalidDataException { + stringUtf8( utf8Bytes( "\0" ) ); + stringAscii( asciiBytes( "\0" ) ); + } + +}