diff options
author | Joakim Erdfelt | 2013-02-12 23:19:35 +0000 |
---|---|---|
committer | Joakim Erdfelt | 2013-02-12 23:19:35 +0000 |
commit | 43231d84510fde66c4a19a5aac4782eaef15de16 (patch) | |
tree | 5f2b0e0bc7b7958401c48036187802c3e382dc69 | |
parent | 9ae3c94b22adcb2eef373ff0b3eede081fa849c3 (diff) | |
download | org.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.
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"); |