Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Erdfelt2013-02-12 23:19:35 +0000
committerJoakim Erdfelt2013-02-12 23:19:35 +0000
commit43231d84510fde66c4a19a5aac4782eaef15de16 (patch)
tree5f2b0e0bc7b7958401c48036187802c3e382dc69
parent9ae3c94b22adcb2eef373ff0b3eede081fa849c3 (diff)
downloadorg.eclipse.jetty.project-43231d84510fde66c4a19a5aac4782eaef15de16.tar.gz
org.eclipse.jetty.project-43231d84510fde66c4a19a5aac4782eaef15de16.tar.xz
org.eclipse.jetty.project-43231d84510fde66c4a19a5aac4782eaef15de16.zip
393473 - Add support for JSR-356 (javax.websocket) draft
+ Restarting branch, copying over work from November with new JSR-356 Draft 012 api in mind.
-rw-r--r--jetty-websocket/javax-websocket-client-impl/pom.xml66
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyWebSocketContainer.java115
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrContainerProvider.java43
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java82
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrRemoteEndpoint.java173
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSendResultFuture.java71
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java232
-rw-r--r--jetty-websocket/javax-websocket-client-impl/src/main/resources/META-INF/services/javax.websocket.ContainerProvider1
-rw-r--r--jetty-websocket/javax-websocket-server-impl/pom.xml66
-rw-r--r--jetty-websocket/pom.xml2
-rw-r--r--jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java12
-rw-r--r--jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java6
-rw-r--r--jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java50
-rw-r--r--jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java4
-rw-r--r--jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java11
-rw-r--r--jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java16
-rw-r--r--jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/examples/SimpleEchoClient.java2
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java17
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java7
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java26
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AnnotatedEventDriver.java8
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/mux/MuxChannel.java14
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java12
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java2
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java2
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java2
-rw-r--r--jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleTextMessage.java2
-rw-r--r--jetty-websocket/websocket-common/src/test/java/examples/echo/AnnotatedEchoSocket.java2
-rw-r--r--jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/TextPayloadParserTest.java8
-rw-r--r--jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java4
-rw-r--r--jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java4
-rw-r--r--jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java14
-rw-r--r--jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/ServletWebSocketRequest.java10
-rw-r--r--jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/ABServlet.java3
-rw-r--r--jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/Fuzzer.java3
-rw-r--r--jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/examples/echo/BigEchoSocket.java2
-rw-r--r--jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SessionSocket.java5
-rw-r--r--jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java17
38 files changed, 1029 insertions, 87 deletions
diff --git a/jetty-websocket/javax-websocket-client-impl/pom.xml b/jetty-websocket/javax-websocket-client-impl/pom.xml
new file mode 100644
index 0000000000..d87d5360d4
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-parent</artifactId>
+ <version>9.0.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>javax-websocket-client-impl</artifactId>
+ <name>Jetty :: Websocket :: javax.websocket :: Client Implementation</name>
+
+ <properties>
+ <bundle-symbolic-name>${project.groupId}.javax.websocket</bundle-symbolic-name>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-client</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.drafts</groupId>
+ <artifactId>javax.websocket-client-api</artifactId>
+ <version>0.0.012.draft-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.toolchain</groupId>
+ <artifactId>jetty-test-helper</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+ <execution>
+ <id>ban-java-servlet-api</id>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <rules>
+ <bannedDependencies>
+ <includes>
+ <include>javax.servlet</include>
+ <include>servletapi</include>
+ <include>org.eclipse.jetty.orbit:javax.servlet</include>
+ <include>org.mortbay.jetty:servlet-api</include>
+ <include>jetty:servlet-api</include>
+ </includes>
+ </bannedDependencies>
+ </rules>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyWebSocketContainer.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyWebSocketContainer.java
new file mode 100644
index 0000000000..6cf8b2a619
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JettyWebSocketContainer.java
@@ -0,0 +1,115 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356;
+
+import java.net.URI;
+import java.util.Set;
+
+import javax.websocket.ClientEndpointConfiguration;
+import javax.websocket.DeploymentException;
+import javax.websocket.Endpoint;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
+
+public class JettyWebSocketContainer implements WebSocketContainer
+{
+ @Override
+ public Session connectToServer(Class<? extends Endpoint> endpointClass, ClientEndpointConfiguration cec, URI path) throws DeploymentException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Session connectToServer(Class<?> annotatedEndpointClass, URI path) throws DeploymentException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getDefaultAsyncSendTimeout()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public int getDefaultMaxBinaryMessageBufferSize()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public int getDefaultMaxTextMessageBufferSize()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public Set<String> getInstalledExtensions()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getMaxSessionIdleTimeout()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void setAsyncSendTimeout(long timeoutmillis)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setDefaultMaxBinaryMessageBufferSize(int max)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setDefaultMaxTextMessageBufferSize(int max)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setMaxSessionIdleTimeout(long timeout)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setMaxTextMessageBufferSize(long max)
+ {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrContainerProvider.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrContainerProvider.java
new file mode 100644
index 0000000000..f6d341e476
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrContainerProvider.java
@@ -0,0 +1,43 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356;
+
+import javax.websocket.ContainerProvider;
+import javax.websocket.WebSocketContainer;
+
+public class JsrContainerProvider extends ContainerProvider
+{
+ private final JettyWebSocketContainer websocketContainer;
+
+ public JsrContainerProvider()
+ {
+ websocketContainer = new JettyWebSocketContainer();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected <T> T getContainer(Class<T> containerClass)
+ {
+ if (WebSocketContainer.class.isAssignableFrom(containerClass))
+ {
+ return (T)websocketContainer;
+ }
+ return null;
+ }
+}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java
new file mode 100644
index 0000000000..35a5e1ce9f
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrExtension.java
@@ -0,0 +1,82 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.websocket.Extension;
+
+import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
+
+public class JsrExtension implements Extension
+{
+ private static class JsrParameter implements Extension.Parameter
+ {
+ private String name;
+ private String value;
+
+ private JsrParameter(String key, String value)
+ {
+ this.name = key;
+ this.value = value;
+ }
+
+ @Override
+ public String getName()
+ {
+ return this.name;
+ }
+
+ @Override
+ public String getValue()
+ {
+ return this.value;
+ }
+ }
+
+ private final String name;
+ private List<Parameter> parameters;
+
+ public JsrExtension(ExtensionConfig cfg)
+ {
+ this.name = cfg.getName();
+ this.parameters = new ArrayList<>();
+ if (cfg.getParameters() != null)
+ {
+ for (Map.Entry<String, String> entry : cfg.getParameters().entrySet())
+ {
+ parameters.add(new JsrParameter(entry.getKey(), entry.getValue()));
+ }
+ }
+ }
+
+ @Override
+ public String getName()
+ {
+ return name;
+ }
+
+ @Override
+ public List<Parameter> getParameters()
+ {
+ return parameters;
+ }
+}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrRemoteEndpoint.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrRemoteEndpoint.java
new file mode 100644
index 0000000000..639a427349
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrRemoteEndpoint.java
@@ -0,0 +1,173 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.nio.ByteBuffer;
+import java.util.concurrent.Future;
+
+import javax.websocket.EncodeException;
+import javax.websocket.RemoteEndpoint;
+import javax.websocket.SendHandler;
+import javax.websocket.SendResult;
+
+public class JsrRemoteEndpoint implements RemoteEndpoint
+{
+ private final org.eclipse.jetty.websocket.api.RemoteEndpoint jettyRemote;
+
+ protected JsrRemoteEndpoint(org.eclipse.jetty.websocket.api.RemoteEndpoint endpoint)
+ {
+ this.jettyRemote = endpoint;
+ }
+
+ @Override
+ public void flushBatch() throws IOException
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public long getAsyncSendTimeout()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public boolean getBatchingAllowed()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public OutputStream getSendStream() throws IOException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Writer getSendWriter() throws IOException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void sendBytes(ByteBuffer data) throws IOException
+ {
+ jettyRemote.sendBytes(data);
+ }
+
+ @Override
+ public void sendBytesByCompletion(ByteBuffer data, SendHandler completion)
+ {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public Future<SendResult> sendBytesByFuture(ByteBuffer data)
+ {
+ Future<Void> jettyFuture = jettyRemote.sendBytesByFuture(data);
+ return new JsrSendResultFuture(jettyFuture);
+ }
+
+ @Override
+ public void sendObject(Object o) throws IOException, EncodeException
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void sendObjectByCompletion(Object o, SendHandler handler)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Future<SendResult> sendObjectByFuture(Object o)
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void sendPartialBytes(ByteBuffer partialByte, boolean isLast) throws IOException
+ {
+ jettyRemote.sendPartialBytes(partialByte,isLast);
+ }
+
+ @Override
+ public void sendPartialString(String partialMessage, boolean isLast) throws IOException
+ {
+ jettyRemote.sendPartialString(partialMessage,isLast);
+ }
+
+ @Override
+ public void sendPing(ByteBuffer applicationData) throws IOException, IllegalArgumentException
+ {
+ jettyRemote.sendPing(applicationData);
+ }
+
+ @Override
+ public void sendPong(ByteBuffer applicationData) throws IOException, IllegalArgumentException
+ {
+ jettyRemote.sendPong(applicationData);
+ }
+
+ @Override
+ public void sendString(String text) throws IOException
+ {
+ jettyRemote.sendString(text);
+ }
+
+ @Override
+ public void sendStringByCompletion(String text, SendHandler completion)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Future<SendResult> sendStringByFuture(String text)
+ {
+ Future<Void> jettyFuture = jettyRemote.sendStringByFuture(text);
+ return new JsrSendResultFuture(jettyFuture);
+ }
+
+ @Override
+ public void setAsyncSendTimeout(long timeoutmillis)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setBatchingAllowed(boolean allowed)
+ {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSendResultFuture.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSendResultFuture.java
new file mode 100644
index 0000000000..b5a2b4b0d7
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSendResultFuture.java
@@ -0,0 +1,71 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.websocket.SendResult;
+
+public class JsrSendResultFuture implements Future<SendResult>
+{
+ private final Future<Void> jettyFuture;
+
+ public JsrSendResultFuture(Future<Void> jettyFuture)
+ {
+ this.jettyFuture = jettyFuture;
+ }
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning)
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isCancelled()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isDone()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public SendResult get() throws InterruptedException, ExecutionException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public SendResult get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java
new file mode 100644
index 0000000000..d183099c23
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java
@@ -0,0 +1,232 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.websocket.jsr356;
+
+import java.io.IOException;
+import java.net.URI;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.websocket.CloseReason;
+import javax.websocket.Extension;
+import javax.websocket.MessageHandler;
+import javax.websocket.RemoteEndpoint;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
+
+import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
+import org.eclipse.jetty.websocket.common.WebSocketSession;
+
+public class JsrSession implements Session
+{
+ private final JettyWebSocketContainer container;
+ /** Jetty API Session Impl */
+ private final WebSocketSession jettySession;
+ private final String id;
+ private List<Extension> negotiatedExtensions;
+ private Map<String, List<String>> jsrParameterMap;
+ private JsrRemoteEndpoint remote;
+
+ protected JsrSession(JettyWebSocketContainer container, WebSocketSession session, String id)
+ {
+ this.container = container;
+ this.jettySession = session;
+ this.id = id;
+ }
+
+ @Override
+ public void addMessageHandler(MessageHandler listener) throws IllegalStateException
+ {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void close(CloseReason closeStatus) throws IOException
+ {
+ jettySession.close(closeStatus.getCloseCode().getCode(),closeStatus.getReasonPhrase());
+ }
+
+ @Override
+ public WebSocketContainer getContainer()
+ {
+ return this.container;
+ }
+
+ @Override
+ public String getId()
+ {
+ return this.id;
+ }
+
+ @Override
+ public int getMaxBinaryMessageBufferSize()
+ {
+ return jettySession.getPolicy().getMaxBinaryMessageSize();
+ }
+
+ @Override
+ public int getMaxTextMessageBufferSize()
+ {
+ return jettySession.getPolicy().getMaxTextMessageSize();
+ }
+
+ @Override
+ public Set<MessageHandler> getMessageHandlers()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<Extension> getNegotiatedExtensions()
+ {
+ if (negotiatedExtensions == null)
+ {
+ negotiatedExtensions = new ArrayList<Extension>();
+ for (ExtensionConfig cfg : jettySession.getUpgradeResponse().getExtensions())
+ {
+ negotiatedExtensions.add(new JsrExtension(cfg));
+ }
+ }
+ return negotiatedExtensions;
+ }
+
+ @Override
+ public String getNegotiatedSubprotocol()
+ {
+ return jettySession.getUpgradeResponse().getAcceptedSubProtocol();
+ }
+
+ @Override
+ public Set<Session> getOpenSessions()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Map<String, String> getPathParameters()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getQueryString()
+ {
+ return jettySession.getUpgradeRequest().getRequestURI().getQuery();
+ }
+
+ @Override
+ public Map<String, List<String>> getRequestParameterMap()
+ {
+ return jettySession.getUpgradeRequest().getParameterMap();
+ }
+
+ @Override
+ public URI getRequestURI()
+ {
+ return jettySession.getUpgradeRequest().getRequestURI();
+ }
+
+ @Override
+ public long getTimeout()
+ {
+ return jettySession.getIdleTimeout();
+ }
+
+ @Override
+ public Principal getUserPrincipal()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Map<String, Object> getUserProperties()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void removeMessageHandler(MessageHandler handler)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setMaxBinaryMessageBufferSize(int length)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setMaxTextMessageBufferSize(int length)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setTimeout(long milliseconds)
+ {
+ jettySession.setIdleTimeout(milliseconds);
+ }
+
+ @Override
+ public void close() throws IOException
+ {
+ jettySession.close();
+ }
+
+ @Override
+ public String getProtocolVersion()
+ {
+ return jettySession.getProtocolVersion();
+ }
+
+ @Override
+ public RemoteEndpoint getRemote()
+ {
+ if (remote == null)
+ {
+ remote = new JsrRemoteEndpoint(jettySession.getRemote());
+ }
+ return remote;
+ }
+
+ @Override
+ public boolean isOpen()
+ {
+ return jettySession.isOpen();
+ }
+
+ @Override
+ public boolean isSecure()
+ {
+ return jettySession.isSecure();
+ }
+}
diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/resources/META-INF/services/javax.websocket.ContainerProvider b/jetty-websocket/javax-websocket-client-impl/src/main/resources/META-INF/services/javax.websocket.ContainerProvider
new file mode 100644
index 0000000000..b89b3d043e
--- /dev/null
+++ b/jetty-websocket/javax-websocket-client-impl/src/main/resources/META-INF/services/javax.websocket.ContainerProvider
@@ -0,0 +1 @@
+org.eclipse.jetty.websocket.jsr356.JettyContainerProvider \ No newline at end of file
diff --git a/jetty-websocket/javax-websocket-server-impl/pom.xml b/jetty-websocket/javax-websocket-server-impl/pom.xml
new file mode 100644
index 0000000000..7f792891c3
--- /dev/null
+++ b/jetty-websocket/javax-websocket-server-impl/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>websocket-parent</artifactId>
+ <version>9.0.0-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>javax-websocket-server-impl</artifactId>
+ <name>Jetty :: Websocket :: javax.websocket.server :: Server Implementation</name>
+
+ <properties>
+ <bundle-symbolic-name>${project.groupId}.javax.websocket.server</bundle-symbolic-name>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.eclipse.jetty.websocket</groupId>
+ <artifactId>javax-websocket-client-impl</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.drafts</groupId>
+ <artifactId>javax.websocket-api</artifactId>
+ <version>0.0.012.draft-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.toolchain</groupId>
+ <artifactId>jetty-test-helper</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+ <execution>
+ <id>ban-java-servlet-api</id>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <rules>
+ <bannedDependencies>
+ <includes>
+ <include>javax.servlet</include>
+ <include>servletapi</include>
+ <include>org.eclipse.jetty.orbit:javax.servlet</include>
+ <include>org.mortbay.jetty:servlet-api</include>
+ <include>jetty:servlet-api</include>
+ </includes>
+ </bannedDependencies>
+ </rules>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/jetty-websocket/pom.xml b/jetty-websocket/pom.xml
index 19e8ed0944..f685bf874d 100644
--- a/jetty-websocket/pom.xml
+++ b/jetty-websocket/pom.xml
@@ -18,6 +18,8 @@
<module>websocket-client</module>
<module>websocket-server</module>
<module>websocket-servlet</module>
+ <module>javax-websocket-client-impl</module>
+ <module>javax-websocket-server-impl</module>
</modules>
<build>
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java
index 7748dd0899..6ad343be9c 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/Session.java
@@ -107,13 +107,6 @@ public interface Session extends Closeable
public InetSocketAddress getLocalAddress();
/**
- * The maximum total length of messages, text or binary, that this Session can handle.
- *
- * @return the message size
- */
- long getMaximumMessageSize();
-
- /**
* Access the (now read-only) {@link WebSocketPolicy} in use for this connection.
*
* @return the policy in use
@@ -179,11 +172,6 @@ public interface Session extends Closeable
void setIdleTimeout(long ms);
/**
- * Sets the maximum total length of messages, text or binary, that this Session can handle.
- */
- void setMaximumMessageSize(long length);
-
- /**
* Suspend a the incoming read events on the connection.
*
* @return the suspend token suitable for resuming the reading of data on the connection.
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java
index 5d6cc1a653..9c5aea2cf4 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/UpgradeRequest.java
@@ -36,7 +36,7 @@ public class UpgradeRequest
private List<ExtensionConfig> extensions = new ArrayList<>();
private List<HttpCookie> cookies = new ArrayList<>();
private Map<String, List<String>> headers = new HashMap<>();
- private Map<String, String[]> parameters = new HashMap<>();
+ private Map<String, List<String>> parameters = new HashMap<>();
private Object session;
private String httpVersion;
private String method;
@@ -175,7 +175,7 @@ public class UpgradeRequest
*
* @return a unmodifiable map of query parameters of the request.
*/
- public Map<String, String[]> getParameterMap()
+ public Map<String, List<String>> getParameterMap()
{
return Collections.unmodifiableMap(parameters);
}
@@ -244,7 +244,7 @@ public class UpgradeRequest
this.method = method;
}
- protected void setParameterMap(Map<String, String[]> parameters)
+ protected void setParameterMap(Map<String, List<String>> parameters)
{
this.parameters.clear();
this.parameters.putAll(parameters);
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java
index 348a0e06d1..b533359e1d 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/WebSocketPolicy.java
@@ -40,7 +40,14 @@ public class WebSocketPolicy
* <p>
* Default: 65536 (64 K)
*/
- private long maxMessageSize = 64 * KB;
+ private int maxTextMessageSize = 64 * KB;
+
+ /**
+ * The maximum size of a binary message during parsing/generating.
+ * <p>
+ * Default: 65536 (64 K)
+ */
+ private int maxBinaryMessageSize = 64 * KB;
/**
* The time in ms (milliseconds) that a websocket may be idle before closing.
@@ -66,14 +73,26 @@ public class WebSocketPolicy
this.behavior = behavior;
}
- public void assertValidMessageSize(int requestedSize)
+ public void assertValidBinaryMessageSize(int requestedSize)
{
- if (maxMessageSize > 0)
+ if (maxBinaryMessageSize > 0)
{
// validate it
- if (requestedSize > maxMessageSize)
+ if (requestedSize > maxBinaryMessageSize)
{
- throw new MessageTooLargeException("Requested message size [" + requestedSize + "] exceeds maximum size [" + maxMessageSize + "]");
+ throw new MessageTooLargeException("Binary message size [" + requestedSize + "] exceeds maximum size [" + maxBinaryMessageSize + "]");
+ }
+ }
+ }
+
+ public void assertValidTextMessageSize(int requestedSize)
+ {
+ if (maxTextMessageSize > 0)
+ {
+ // validate it
+ if (requestedSize > maxTextMessageSize)
+ {
+ throw new MessageTooLargeException("Text message size [" + requestedSize + "] exceeds maximum size [" + maxTextMessageSize + "]");
}
}
}
@@ -82,7 +101,8 @@ public class WebSocketPolicy
{
WebSocketPolicy clone = new WebSocketPolicy(this.behavior);
clone.idleTimeout = this.idleTimeout;
- clone.maxMessageSize = this.maxMessageSize;
+ clone.maxTextMessageSize = this.maxTextMessageSize;
+ clone.maxBinaryMessageSize = this.maxBinaryMessageSize;
clone.inputBufferSize = this.inputBufferSize;
return clone;
}
@@ -102,9 +122,14 @@ public class WebSocketPolicy
return inputBufferSize;
}
- public long getMaxMessageSize()
+ public int getMaxBinaryMessageSize()
{
- return maxMessageSize;
+ return maxBinaryMessageSize;
+ }
+
+ public int getMaxTextMessageSize()
+ {
+ return maxTextMessageSize;
}
public void setIdleTimeout(long idleTimeout)
@@ -117,8 +142,13 @@ public class WebSocketPolicy
this.inputBufferSize = inputBufferSize;
}
- public void setMaxMessageSize(long maxMessageSize)
+ public void setMaxBinaryMessageSize(int maxBinaryMessageSize)
+ {
+ this.maxBinaryMessageSize = maxBinaryMessageSize;
+ }
+
+ public void setMaxTextMessageSize(int maxTextMessageSize)
{
- this.maxMessageSize = maxMessageSize;
+ this.maxTextMessageSize = maxTextMessageSize;
}
}
diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java
index a95378b6ec..a62c36b3f9 100644
--- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java
+++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java
@@ -35,7 +35,9 @@ public @interface WebSocket
{
int inputBufferSize() default -2;
+ int maxBinaryMessageSize() default -2;
+
int maxIdleTime() default -2;
- int maxMessageSize() default -2;
+ int maxTextMessageSize() default -2;
}
diff --git a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
index 5c662d6ee7..f169df3a49 100644
--- a/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
+++ b/jetty-websocket/websocket-client/src/main/java/org/eclipse/jetty/websocket/client/ClientUpgradeRequest.java
@@ -21,6 +21,7 @@ package org.eclipse.jetty.websocket.client;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.URI;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -215,7 +216,7 @@ public class ClientUpgradeRequest extends UpgradeRequest
super.setRequestURI(uri);
// parse parameter map
- Map<String, String[]> pmap = new HashMap<>();
+ Map<String, List<String>> pmap = new HashMap<>();
String query = uri.getQuery();
@@ -229,12 +230,14 @@ public class ClientUpgradeRequest extends UpgradeRequest
List<String> values = params.getValues(key);
if (values == null)
{
- pmap.put(key,new String[0]);
+ pmap.put(key,new ArrayList<String>());
}
else
{
- int len = values.size();
- pmap.put(key,values.toArray(new String[len]));
+ // break link to original
+ List<String> copy = new ArrayList<>();
+ copy.addAll(values);
+ pmap.put(key,copy);
}
}
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java
index a9152fcb39..74ffd87ce0 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/WebSocketClientTest.java
@@ -22,6 +22,8 @@ import static org.hamcrest.Matchers.*;
import java.net.InetSocketAddress;
import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@@ -249,15 +251,15 @@ public class WebSocketClientTest
UpgradeRequest req = session.getUpgradeRequest();
Assert.assertThat("Upgrade Request",req,notNullValue());
- Map<String, String[]> parameterMap = req.getParameterMap();
+ Map<String, List<String>> parameterMap = req.getParameterMap();
Assert.assertThat("Parameter Map",parameterMap,notNullValue());
- Assert.assertThat("Parameter[snack]",parameterMap.get("snack"),is(new String[]
- { "cashews" }));
- Assert.assertThat("Parameter[amount]",parameterMap.get("amount"),is(new String[]
- { "handful" }));
- Assert.assertThat("Parameter[brand]",parameterMap.get("brand"),is(new String[]
- { "off" }));
+ Assert.assertThat("Parameter[snack]",parameterMap.get("snack"),is(Arrays.asList(new String[]
+ { "cashews" })));
+ Assert.assertThat("Parameter[amount]",parameterMap.get("amount"),is(Arrays.asList(new String[]
+ { "handful" })));
+ Assert.assertThat("Parameter[brand]",parameterMap.get("brand"),is(Arrays.asList(new String[]
+ { "off" })));
Assert.assertThat("Parameter[cost]",parameterMap.get("cost"),nullValue());
}
diff --git a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/examples/SimpleEchoClient.java b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/examples/SimpleEchoClient.java
index 461e23a56b..70a805d3ab 100644
--- a/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/examples/SimpleEchoClient.java
+++ b/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/examples/SimpleEchoClient.java
@@ -37,7 +37,7 @@ import org.eclipse.jetty.websocket.client.WebSocketClient;
*/
public class SimpleEchoClient
{
- @WebSocket(maxMessageSize = 64 * 1024)
+ @WebSocket(maxTextMessageSize = 64 * 1024)
public static class SimpleEchoSocket
{
private final CountDownLatch closeLatch;
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java
index 1bc7366ee5..a0c1a0075e 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/LogicalConnection.java
@@ -58,6 +58,13 @@ public interface LogicalConnection extends OutgoingFrames, SuspendToken
void disconnect();
/**
+ * Get the read/write idle timeout.
+ *
+ * @return the idle timeout in milliseconds
+ */
+ public long getIdleTimeout();
+
+ /**
* Get the IOState of the connection.
*
* @return the IOState of the connection.
@@ -110,6 +117,16 @@ public interface LogicalConnection extends OutgoingFrames, SuspendToken
boolean isReading();
/**
+ * Set the read/write idle timeout for new operations (in milliseconds)
+ * <p>
+ * This idle timeout cannot be garunteed to take immediate effect for any active read/write actions.
+ * New read/write actions will have this new idle timeout.
+ *
+ * @param ms idle timeout in milliseconds
+ */
+ public void setIdleTimeout(long ms);
+
+ /**
* Set where the connection should send the incoming frames to.
* <p>
* Often this is from the Parser to the start of the extension stack, and eventually on to the session.
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java
index bca7e30eb6..07c9b5bce9 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/Parser.java
@@ -98,7 +98,6 @@ public class Parser
// OMG! Sanity Check! DO NOT WANT! Won't anyone think of the memory!
throw new MessageTooLargeException("[int-sane!] cannot handle payload lengths larger than " + Integer.MAX_VALUE);
}
- policy.assertValidMessageSize((int)len);
switch (frame.getOpCode())
{
@@ -116,6 +115,12 @@ public class Parser
+ WebSocketFrame.MAX_CONTROL_PAYLOAD + "]");
}
break;
+ case OpCode.TEXT:
+ policy.assertValidTextMessageSize((int)len);
+ break;
+ case OpCode.BINARY:
+ policy.assertValidBinaryMessageSize((int)len);
+ break;
}
}
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java
index 0d648c6ada..dcbb709752 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java
@@ -57,9 +57,7 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc
private final EventDriver websocket;
private final LogicalConnection connection;
private ExtensionFactory extensionFactory;
- private long maximumMessageSize;
private String protocolVersion;
- private long timeout;
private Map<String, String[]> parameterMap = new HashMap<>();
private WebSocketRemoteEndpoint remote;
private IncomingFrames incomingHandler;
@@ -164,13 +162,10 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc
return extensionFactory;
}
- /**
- * The idle timeout in seconds
- */
@Override
public long getIdleTimeout()
{
- return timeout;
+ return connection.getIdleTimeout();
}
@ManagedAttribute(readonly = true)
@@ -185,12 +180,6 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc
return connection.getLocalAddress();
}
- @Override
- public long getMaximumMessageSize()
- {
- return maximumMessageSize;
- }
-
@ManagedAttribute(readonly = true)
public OutgoingFrames getOutgoingHandler()
{
@@ -319,19 +308,10 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc
this.extensionFactory = extensionFactory;
}
- /**
- * Set the timeout in seconds
- */
- @Override
- public void setIdleTimeout(long seconds)
- {
- this.timeout = seconds;
- }
-
@Override
- public void setMaximumMessageSize(long length)
+ public void setIdleTimeout(long ms)
{
- this.maximumMessageSize = length;
+ connection.setIdleTimeout(ms);
}
public void setOutgoingHandler(OutgoingFrames outgoing)
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AnnotatedEventDriver.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AnnotatedEventDriver.java
index 083904f618..4cbd37a185 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AnnotatedEventDriver.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AnnotatedEventDriver.java
@@ -49,9 +49,13 @@ public class AnnotatedEventDriver extends EventDriver
WebSocket anno = websocket.getClass().getAnnotation(WebSocket.class);
// Setup the policy
- if (anno.maxMessageSize() > 0)
+ if (anno.maxTextMessageSize() > 0)
{
- this.policy.setMaxMessageSize(anno.maxMessageSize());
+ this.policy.setMaxTextMessageSize(anno.maxTextMessageSize());
+ }
+ if (anno.maxBinaryMessageSize() > 0)
+ {
+ this.policy.setMaxTextMessageSize(anno.maxBinaryMessageSize());
}
if (anno.inputBufferSize() > 0)
{
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/mux/MuxChannel.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/mux/MuxChannel.java
index 3e56bbd56f..6671e2077a 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/mux/MuxChannel.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/mux/MuxChannel.java
@@ -98,6 +98,13 @@ public class MuxChannel implements LogicalConnection, IncomingFrames, SuspendTok
}
@Override
+ public long getIdleTimeout()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
public IOState getIOState()
{
// TODO Auto-generated method stub
@@ -206,6 +213,13 @@ public class MuxChannel implements LogicalConnection, IncomingFrames, SuspendTok
}
@Override
+ public void setIdleTimeout(long ms)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
public void setNextIncomingFrames(IncomingFrames incoming)
{
this.incoming = incoming;
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java
index 3bb59d2e60..30a91c263b 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/AbstractWebSocketConnection.java
@@ -315,6 +315,12 @@ public abstract class AbstractWebSocketConnection extends AbstractConnection imp
}
@Override
+ public long getIdleTimeout()
+ {
+ return getEndPoint().getIdleTimeout();
+ }
+
+ @Override
public IOState getIOState()
{
return ioState;
@@ -518,6 +524,12 @@ public abstract class AbstractWebSocketConnection extends AbstractConnection imp
}
@Override
+ public void setIdleTimeout(long ms)
+ {
+ getEndPoint().setIdleTimeout(ms);
+ }
+
+ @Override
public void setInputBufferSize(int inputBufferSize)
{
if(inputBufferSize < MIN_BUFFER_SIZE) {
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java
index 21f4ce1886..c7fa0941a6 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageInputStream.java
@@ -67,7 +67,7 @@ public class MessageInputStream extends InputStream implements MessageAppender
return;
}
- driver.getPolicy().assertValidMessageSize(size + payload.remaining());
+ driver.getPolicy().assertValidBinaryMessageSize(size + payload.remaining());
size += payload.remaining();
synchronized (buf)
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java
index e790989cf6..52d6962fcf 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/MessageReader.java
@@ -61,7 +61,7 @@ public class MessageReader extends Reader implements MessageAppender
return;
}
- driver.getPolicy().assertValidMessageSize(size + payload.remaining());
+ driver.getPolicy().assertValidTextMessageSize(size + payload.remaining());
size += payload.remaining();
synchronized (utf)
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java
index d8802f8e8d..0ef0ccf277 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java
@@ -54,7 +54,7 @@ public class SimpleBinaryMessage implements MessageAppender
return;
}
- onEvent.getPolicy().assertValidMessageSize(size + payload.remaining());
+ onEvent.getPolicy().assertValidBinaryMessageSize(size + payload.remaining());
size += payload.remaining();
BufferUtil.writeTo(payload,out);
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleTextMessage.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleTextMessage.java
index 8b60aae7aa..cf8006bf80 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleTextMessage.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleTextMessage.java
@@ -53,7 +53,7 @@ public class SimpleTextMessage implements MessageAppender
return;
}
- onEvent.getPolicy().assertValidMessageSize(size + payload.remaining());
+ onEvent.getPolicy().assertValidTextMessageSize(size + payload.remaining());
size += payload.remaining();
// allow for fast fail of BAD utf (incomplete utf will trigger on messageComplete)
diff --git a/jetty-websocket/websocket-common/src/test/java/examples/echo/AnnotatedEchoSocket.java b/jetty-websocket/websocket-common/src/test/java/examples/echo/AnnotatedEchoSocket.java
index a2af9203e2..b36352e659 100644
--- a/jetty-websocket/websocket-common/src/test/java/examples/echo/AnnotatedEchoSocket.java
+++ b/jetty-websocket/websocket-common/src/test/java/examples/echo/AnnotatedEchoSocket.java
@@ -25,7 +25,7 @@ import org.eclipse.jetty.websocket.api.annotations.WebSocket;
/**
* Example EchoSocket using Annotations.
*/
-@WebSocket(maxMessageSize = 64 * 1024)
+@WebSocket(maxTextMessageSize = 64 * 1024)
public class AnnotatedEchoSocket
{
@OnWebSocketMessage
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/TextPayloadParserTest.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/TextPayloadParserTest.java
index ccfb53f068..9346956311 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/TextPayloadParserTest.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/TextPayloadParserTest.java
@@ -38,14 +38,14 @@ public class TextPayloadParserTest
{
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
// Artificially small buffer/payload
- policy.setMaxMessageSize(1024);
+ policy.setMaxTextMessageSize(1024);
byte utf[] = new byte[2048];
Arrays.fill(utf,(byte)'a');
Assert.assertThat("Must be a medium length payload",utf.length,allOf(greaterThan(0x7E),lessThan(0xFFFF)));
ByteBuffer buf = ByteBuffer.allocate(utf.length + 8);
- buf.put((byte)0x81);
+ buf.put((byte)0x81); // text frame, fin = true
buf.put((byte)(0x80 | 0x7E)); // 0x7E == 126 (a 2 byte payload length)
buf.putShort((short)utf.length);
MaskedByteBuffer.putMask(buf);
@@ -80,7 +80,7 @@ public class TextPayloadParserTest
Assert.assertThat("Must be a long length payload",utf.length,greaterThan(0xFFFF));
ByteBuffer buf = ByteBuffer.allocate(utf.length + 32);
- buf.put((byte)0x81);
+ buf.put((byte)0x81); // text frame, fin = true
buf.put((byte)(0x80 | 0x7F)); // 0x7F == 127 (a 8 byte payload length)
buf.putLong(utf.length);
MaskedByteBuffer.putMask(buf);
@@ -88,7 +88,7 @@ public class TextPayloadParserTest
buf.flip();
WebSocketPolicy policy = WebSocketPolicy.newServerPolicy();
- policy.setMaxMessageSize(100000);
+ policy.setMaxTextMessageSize(100000);
Parser parser = new UnitParser(policy);
IncomingFramesCapture capture = new IncomingFramesCapture();
parser.setIncomingFramesHandler(capture);
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java
index 755c5012e3..73baaf2429 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_1.java
@@ -451,7 +451,7 @@ public class TestABCase1_1
expected.flip();
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.CLIENT);
- policy.setMaxMessageSize(length);
+ policy.setMaxTextMessageSize(length);
Parser parser = new UnitParser(policy);
IncomingFramesCapture capture = new IncomingFramesCapture();
parser.setIncomingFramesHandler(capture);
@@ -488,7 +488,7 @@ public class TestABCase1_1
expected.flip();
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.CLIENT);
- policy.setMaxMessageSize(length);
+ policy.setMaxTextMessageSize(length);
Parser parser = new UnitParser(policy);
IncomingFramesCapture capture = new IncomingFramesCapture();
parser.setIncomingFramesHandler(capture);
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java
index dd6d6eab62..80be3a70ee 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/ab/TestABCase1_2.java
@@ -466,7 +466,7 @@ public class TestABCase1_2
expected.flip();
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.CLIENT);
- policy.setMaxMessageSize(length);
+ policy.setMaxBinaryMessageSize(length);
Parser parser = new UnitParser(policy);
IncomingFramesCapture capture = new IncomingFramesCapture();
parser.setIncomingFramesHandler(capture);
@@ -503,7 +503,7 @@ public class TestABCase1_2
expected.flip();
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.CLIENT);
- policy.setMaxMessageSize(length);
+ policy.setMaxBinaryMessageSize(length);
Parser parser = new UnitParser(policy);
IncomingFramesCapture capture = new IncomingFramesCapture();
parser.setIncomingFramesHandler(capture);
diff --git a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java
index 7099af3ac4..2ba655c429 100644
--- a/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java
+++ b/jetty-websocket/websocket-common/src/test/java/org/eclipse/jetty/websocket/common/io/LocalWebSocketConnection.java
@@ -74,6 +74,13 @@ public class LocalWebSocketConnection implements LogicalConnection, IncomingFram
open = false;
}
+ @Override
+ public long getIdleTimeout()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
public IncomingFrames getIncoming()
{
return incoming;
@@ -149,6 +156,13 @@ public class LocalWebSocketConnection implements LogicalConnection, IncomingFram
}
@Override
+ public void setIdleTimeout(long ms)
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
public void setNextIncomingFrames(IncomingFrames incoming)
{
this.incoming = incoming;
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/ServletWebSocketRequest.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/ServletWebSocketRequest.java
index 46e021aba6..28db9f8dc2 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/ServletWebSocketRequest.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/ServletWebSocketRequest.java
@@ -50,7 +50,15 @@ public class ServletWebSocketRequest extends UpgradeRequest
setHttpVersion(request.getProtocol());
// Copy parameters
- super.setParameterMap(request.getParameterMap());
+ Map<String, List<String>> pmap = new HashMap<>();
+ if (request.getParameterMap() != null)
+ {
+ for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet())
+ {
+ pmap.put(entry.getKey(),Arrays.asList(entry.getValue()));
+ }
+ }
+ super.setParameterMap(pmap);
// Copy Cookies
cookieMap = new HashMap<String, String>();
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/ABServlet.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/ABServlet.java
index 72f79f5bac..4c606d0339 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/ABServlet.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/ABServlet.java
@@ -36,7 +36,8 @@ public class ABServlet extends WebSocketServlet
// Test cases 9.x uses BIG frame sizes, let policy handle them.
int bigFrameSize = 20 * MBYTE;
- factory.getPolicy().setMaxMessageSize(bigFrameSize);
+ factory.getPolicy().setMaxTextMessageSize(bigFrameSize);
+ factory.getPolicy().setMaxBinaryMessageSize(bigFrameSize);
factory.register(ABSocket.class);
}
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/Fuzzer.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/Fuzzer.java
index 09e9f3ec17..ff9567a453 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/Fuzzer.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/ab/Fuzzer.java
@@ -87,7 +87,8 @@ public class Fuzzer
int bigMessageSize = 20 * MBYTE;
- policy.setMaxMessageSize(bigMessageSize);
+ policy.setMaxTextMessageSize(bigMessageSize);
+ policy.setMaxBinaryMessageSize(bigMessageSize);
this.client = new BlockheadClient(policy,testcase.getServer().getServerUri());
this.generator = testcase.getLaxGenerator();
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/examples/echo/BigEchoSocket.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/examples/echo/BigEchoSocket.java
index da5aa8b4e4..3c8aec6e35 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/examples/echo/BigEchoSocket.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/examples/echo/BigEchoSocket.java
@@ -29,7 +29,7 @@ import org.eclipse.jetty.websocket.api.annotations.WebSocket;
/**
* Example Socket for echoing back Big data using the Annotation techniques along with stateless techniques.
*/
-@WebSocket(maxMessageSize = 64 * 1024)
+@WebSocket(maxTextMessageSize = 64 * 1024, maxBinaryMessageSize = 64 * 1024)
public class BigEchoSocket
{
private static final Logger LOG = Log.getLogger(BigEchoSocket.class);
diff --git a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SessionSocket.java b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SessionSocket.java
index bbfc3c5da2..f3cf8f4458 100644
--- a/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SessionSocket.java
+++ b/jetty-websocket/websocket-server/src/test/java/org/eclipse/jetty/websocket/server/helper/SessionSocket.java
@@ -18,6 +18,7 @@
package org.eclipse.jetty.websocket.server.helper;
+import java.util.List;
import java.util.Map;
import org.eclipse.jetty.util.log.Log;
@@ -52,11 +53,11 @@ public class SessionSocket
{
if (message.startsWith("getParameterMap"))
{
- Map<String, String[]> parameterMap = session.getUpgradeRequest().getParameterMap();
+ Map<String, List<String>> parameterMap = session.getUpgradeRequest().getParameterMap();
int idx = message.indexOf('|');
String key = message.substring(idx + 1);
- String values[] = parameterMap.get(key);
+ List<String> values = parameterMap.get(key);
if (values == null)
{
diff --git a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java
index 355accfbae..9ce65c4a0b 100644
--- a/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java
+++ b/jetty-websocket/websocket-servlet/src/main/java/org/eclipse/jetty/websocket/servlet/WebSocketServlet.java
@@ -69,8 +69,11 @@ import org.eclipse.jetty.websocket.api.annotations.WebSocket;
* <dt>maxIdleTime</dt>
* <dd>set the time in ms that a websocket may be idle before closing<br>
*
- * <dt>maxMessagesSize</dt>
- * <dd>set the size in bytes that a websocket may be accept before closing<br>
+ * <dt>maxTextMessageSize</dt>
+ * <dd>set the size in UTF-8 bytes that a websocket may be accept as a Text Message before closing<br>
+ *
+ * <dt>maxBinaryMessageSize</dt>
+ * <dd>set the size in bytes that a websocket may be accept as a Binary Message before closing<br>
*
* <dt>inputBufferSize</dt>
* <dd>set the size in bytes of the buffer used to read raw bytes from the network layer<br>
@@ -105,10 +108,16 @@ public abstract class WebSocketServlet extends HttpServlet
policy.setIdleTimeout(Long.parseLong(max));
}
- max = getInitParameter("maxMessageSize");
+ max = getInitParameter("maxTextMessageSize");
+ if (max != null)
+ {
+ policy.setMaxTextMessageSize(Integer.parseInt(max));
+ }
+
+ max = getInitParameter("maxBinaryMessageSize");
if (max != null)
{
- policy.setMaxMessageSize(Long.parseLong(max));
+ policy.setMaxBinaryMessageSize(Integer.parseInt(max));
}
max = getInitParameter("inputBufferSize");

Back to the top