svn commit: r1426153 - in /tomcat/trunk: java/org/apache/tomcat/websocket/WsFrame.java java/org/apache/tomcat/websocket/WsRemoteEndpoint.java webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnota
Author: markt Date: Thu Dec 27 10:24:00 2012 New Revision: 1426153 URL: http://svn.apache.org/viewvc?rev=1426153&view=rev Log: Make the annotation based echo example support partial data so huge buffers aren't required to pass the Autobahn tests Simplify WsFrame by replacing frameStart and headerLength with readPos. When the frame is bigger than the input buffer the former didn't make much sense anyway. Re-write the processing of text data to make it easier to follow. Make the application responsible for thread-safety of Servlet[Input|Output]Stream Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java tomcat/trunk/webapps/examples/WEB-INF/web.xml Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java?rev=1426153&r1=1426152&r2=1426153&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Thu Dec 27 10:24:00 2012 @@ -68,16 +68,14 @@ public class WsFrame { private boolean fin = false; private int rsv = 0; private byte opCode = 0; -private int frameStart = 0; -private int headerLength = 0; private byte[] mask = new byte[4]; private int maskIndex = 0; private long payloadLength = 0; -private int payloadRead = 0; private long payloadWritten = 0; // Attributes tracking state private State state = State.NEW_FRAME; +private int readPos = 0; private int writePos = 0; public WsFrame(ServletInputStream sis, WsSession wsSession) { @@ -97,31 +95,33 @@ public class WsFrame { * Called when there is data in the ServletInputStream to process. */ public void onDataAvailable() throws IOException { -while (sis.isReady()) { -// Fill up the input buffer with as much data as we can -int read = sis.read(inputBuffer, writePos, -inputBuffer.length - writePos); -if (read == 0) { -return; -} -if (read == -1) { -throw new EOFException(); -} -writePos += read; -while (true) { -if (state == State.NEW_FRAME) { -if (!processInitialHeader()) { -break; -} +synchronized (sis) { +while (sis.isReady()) { +// Fill up the input buffer with as much data as we can +int read = sis.read(inputBuffer, writePos, +inputBuffer.length - writePos); +if (read == 0) { +return; } -if (state == State.PARTIAL_HEADER) { -if (!processRemainingHeader()) { -break; -} +if (read == -1) { +throw new EOFException(); } -if (state == State.DATA) { -if (!processData()) { -break; +writePos += read; +while (true) { +if (state == State.NEW_FRAME) { +if (!processInitialHeader()) { +break; +} +} +if (state == State.PARTIAL_HEADER) { +if (!processRemainingHeader()) { +break; +} +} +if (state == State.DATA) { +if (!processData()) { +break; +} } } } @@ -135,10 +135,10 @@ public class WsFrame { */ private boolean processInitialHeader() throws IOException { // Need at least two bytes of data to do this -if (writePos - frameStart < 2) { +if (writePos - readPos < 2) { return false; } -int b = inputBuffer[frameStart]; +int b = inputBuffer[readPos++]; fin = (b & 0x80) > 0; rsv = (b & 0x70) >>> 4; if (rsv != 0) { @@ -183,7 +183,7 @@ public class WsFrame { } continuationExpected = !fin; } -b = inputBuffer[frameStart + 1]; +b = inputBuffer[readPos++]; // Client data must be masked if ((b & 0x80) == 0) { throw new IOException(sm.getString("wsFrame.notMasked")); @@ -199,22 +199,24 @@ public class WsFrame { * processing of the header */ private boolean processRemainingHeader() throws IOEx
svn commit: r1426173 - /tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java
Author: markt Date: Thu Dec 27 11:52:59 2012 New Revision: 1426173 URL: http://svn.apache.org/viewvc?rev=1426173&view=rev Log: Don't assume frame starts at the start of the input buffer Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java?rev=1426173&r1=1426172&r2=1426173&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Thu Dec 27 11:52:59 2012 @@ -212,10 +212,10 @@ public class WsFrame { } // Calculate new payload length if necessary if (payloadLength == 126) { -payloadLength = byteArrayToLong(inputBuffer, 2, 2); +payloadLength = byteArrayToLong(inputBuffer, readPos, 2); readPos += 2; } else if (payloadLength == 127) { -payloadLength = byteArrayToLong(inputBuffer, 2, 8); +payloadLength = byteArrayToLong(inputBuffer, readPos, 8); readPos += 8; } if (isControl()) { - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1426274 - /tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java
Author: markt Date: Thu Dec 27 17:48:56 2012 New Revision: 1426274 URL: http://svn.apache.org/viewvc?rev=1426274&view=rev Log: Formatting, javadoc and the remaining TODO Modified: tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java?rev=1426274&r1=1426273&r2=1426274&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java Thu Dec 27 17:48:56 2012 @@ -18,20 +18,19 @@ package org.apache.tomcat.websocket; import javax.websocket.server.DefaultServerConfiguration; -public class PojoEndpointConfiguration extends -DefaultServerConfiguration { +/** + * Provides the configuration for POJOs annotated at WebSocket endpoints. It + * provides the means, via casting, of new {@link WsEndpointPojo} instances + * obtaining POJO endpoint specific configuration settings such as the mapping + * of onXxx calls to POJO methods. + */ +public class PojoEndpointConfiguration extends DefaultServerConfiguration { private final Class pojoClass; private final PojoMethodMapping methodMapping; private final String servletPath; private final String pathInfo; -@Override -public boolean checkOrigin(String originHeaderValue) { -// Allow all -return true; -} - PojoEndpointConfiguration(Class pojoClass, PojoMethodMapping methodMapping, String servletPath, @@ -45,16 +44,22 @@ public class PojoEndpointConfiguration e @Override +public boolean checkOrigin(String originHeaderValue) { +// Allow all +return true; +} + + +@Override public String getPath() { return servletPath; } + public Object getPojo() { try { return pojoClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { -// TODO Auto-generated catch block -e.printStackTrace(); throw new IllegalArgumentException(e); } } - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1426279 - in /tomcat/trunk/java: javax/websocket/server/DefaultServerConfiguration.java javax/websocket/server/ServerEndpointConfiguration.java org/apache/tomcat/websocket/PojoEndpointCon
Author: markt Date: Thu Dec 27 18:08:14 2012 New Revision: 1426279 URL: http://svn.apache.org/viewvc?rev=1426279&view=rev Log: Javadoc and remove unnecessary code Modified: tomcat/trunk/java/javax/websocket/server/DefaultServerConfiguration.java tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java Modified: tomcat/trunk/java/javax/websocket/server/DefaultServerConfiguration.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/websocket/server/DefaultServerConfiguration.java?rev=1426279&r1=1426278&r2=1426279&view=diff == --- tomcat/trunk/java/javax/websocket/server/DefaultServerConfiguration.java (original) +++ tomcat/trunk/java/javax/websocket/server/DefaultServerConfiguration.java Thu Dec 27 18:08:14 2012 @@ -26,6 +26,9 @@ import javax.websocket.Endpoint; import javax.websocket.Extension; import javax.websocket.HandshakeResponse; +/** + * Provides the default implementation for WebSocket server endpoints. + */ public class DefaultServerConfiguration implements ServerEndpointConfiguration { private Class endpointClass; @@ -101,6 +104,11 @@ public class DefaultServerConfiguration return null; } +/** + * {@inheritDoc} + * + * The default implementation accepts all connection requests. + */ @Override public boolean checkOrigin(String originHeaderValue) { return true; Modified: tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java?rev=1426279&r1=1426278&r2=1426279&view=diff == --- tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java (original) +++ tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java Thu Dec 27 18:08:14 2012 @@ -32,11 +32,24 @@ public interface ServerEndpointConfigura List getNegotiatedExtensions(List requestedExtensions); +/** + * Enables the WebSocket endpoint to acceot or reject connections based on + * the HTTP origin header. + * + * @param originHeaderValue The HTTP origin header provided by the client. + * + * @return true if the request should be accepted otherwise + * false + */ boolean checkOrigin(String originHeaderValue); boolean matchesURI(URI uri); void modifyHandshake(HandshakeRequest request, HandshakeResponse response); +/** + * Returns the path at which this WebSocket server endpoint has been + * registered. It may be a path or a level 0 URI template. + */ String getPath(); } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java?rev=1426279&r1=1426278&r2=1426279&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java Thu Dec 27 18:08:14 2012 @@ -44,13 +44,6 @@ public class PojoEndpointConfiguration e @Override -public boolean checkOrigin(String originHeaderValue) { -// Allow all -return true; -} - - -@Override public String getPath() { return servletPath; } - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1426309 - in /tomcat/trunk: java/javax/websocket/ java/org/apache/tomcat/websocket/ test/org/apache/tomcat/websocket/
Author: markt Date: Thu Dec 27 20:41:08 2012 New Revision: 1426309 URL: http://svn.apache.org/viewvc?rev=1426309&view=rev Log: Fill in some Javadoc. Rename various fields/methods/parameters for consistency Remove unnecessary code Added: tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpoint.java - copied, changed from r1426301, tomcat/trunk/java/org/apache/tomcat/websocket/WsEndpointPojo.java Removed: tomcat/trunk/java/org/apache/tomcat/websocket/WsEndpointPojo.java Modified: tomcat/trunk/java/javax/websocket/MessageHandler.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBase.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncBinary.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerAsyncString.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBase.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBase.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicBinary.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicPong.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMessageHandlerBasicString.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java tomcat/trunk/java/org/apache/tomcat/websocket/ServerContainerImpl.java tomcat/trunk/java/org/apache/tomcat/websocket/Util.java tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java Modified: tomcat/trunk/java/javax/websocket/MessageHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/websocket/MessageHandler.java?rev=1426309&r1=1426308&r2=1426309&view=diff == --- tomcat/trunk/java/javax/websocket/MessageHandler.java (original) +++ tomcat/trunk/java/javax/websocket/MessageHandler.java Thu Dec 27 20:41:08 2012 @@ -20,11 +20,23 @@ public interface MessageHandler { interface Async extends MessageHandler { +/** + * Called when part of a message is available to be processed. + * + * @param messagePart The message part + * @param last true if this is the last part of + * this message, else false + */ void onMessage(T messagePart, boolean last); } interface Basic extends MessageHandler { +/** + * Called when a whole message is available to be processed. + * + * @param messagePart The message + */ void onMessage(T message); } } Copied: tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpoint.java (from r1426301, tomcat/trunk/java/org/apache/tomcat/websocket/WsEndpointPojo.java) URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpoint.java?p2=tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpoint.java&p1=tomcat/trunk/java/org/apache/tomcat/websocket/WsEndpointPojo.java&r1=1426301&r2=1426309&rev=1426309&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/WsEndpointPojo.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpoint.java Thu Dec 27 20:41:08 2012 @@ -30,7 +30,7 @@ import javax.websocket.Session; * {@link javax.websocket.server.WebSocketEndpoint} so they appear as standard * {@link Endpoint} instances. */ -public class WsEndpointPojo extends Endpoint { +public class PojoEndpoint extends Endpoint { private Object pojo; private String pathInfo; @@ -43,7 +43,7 @@ public class WsEndpointPojo extends Endp PojoEndpointConfiguration pec = (PojoEndpointConfiguration) endpointConfiguration; -pojo = pec.getPojo(); +pojo = pec.createPojo(); pathInfo = pec.getPathInfo(); methodMapping = pec.getMethodMapping(); Modified: tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java?rev=1426309&r1=1426308&r2=1426309&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java Thu Dec 27 20:41:08 2012 @@ -20,7 +20,7 @@ import javax.websocket.server.DefaultSer /** * Provides the configuration for POJOs annotated at WebSocket endpoints. It - * provides the means, via casting, of new {@link WsEndpointPojo} instances + * provides the means, via casting, of new {@link PojoEndpoint} instances * obtaining POJO endpoint specific configuration settings such as the mapping * of onXxx calls to POJO methods. */ @@ -28,
svn commit: r1426333 - /tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java
Author: kkolinko Date: Thu Dec 27 21:28:06 2012 New Revision: 1426333 URL: http://svn.apache.org/viewvc?rev=1426333&view=rev Log: Correct a typo (followup to r1426279 ) Modified: tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java Modified: tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java?rev=1426333&r1=1426332&r2=1426333&view=diff == --- tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java (original) +++ tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java Thu Dec 27 21:28:06 2012 @@ -33,7 +33,7 @@ public interface ServerEndpointConfigura List getNegotiatedExtensions(List requestedExtensions); /** - * Enables the WebSocket endpoint to acceot or reject connections based on + * Enables the WebSocket endpoint to accept or reject connections based on * the HTTP origin header. * * @param originHeaderValue The HTTP origin header provided by the client. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1426336 - in /tomcat/trunk/java: javax/websocket/PongMessage.java org/apache/tomcat/websocket/PojoMethodMapping.java org/apache/tomcat/websocket/Utf8Decoder.java org/apache/tomcat/websock
Author: markt Date: Thu Dec 27 21:40:39 2012 New Revision: 1426336 URL: http://svn.apache.org/viewvc?rev=1426336&view=rev Log: Javadoc Modified: tomcat/trunk/java/javax/websocket/PongMessage.java tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Modified: tomcat/trunk/java/javax/websocket/PongMessage.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/websocket/PongMessage.java?rev=1426336&r1=1426335&r2=1426336&view=diff == --- tomcat/trunk/java/javax/websocket/PongMessage.java (original) +++ tomcat/trunk/java/javax/websocket/PongMessage.java Thu Dec 27 21:40:39 2012 @@ -18,6 +18,13 @@ package javax.websocket; import java.nio.ByteBuffer; +/** + * Represents a WebSocket Pong message and used by message handlers to enable + * applications to process the response to any Pings they send. + */ public interface PongMessage { +/** + * Obtain the payload of the Pong message as a ByteBuffer. + */ ByteBuffer getApplicationData(); } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java?rev=1426336&r1=1426335&r2=1426336&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java Thu Dec 27 21:40:39 2012 @@ -37,7 +37,8 @@ import javax.websocket.server.WebSocketP /** * For a POJO class annotated with * {@link javax.websocket.server.WebSocketEndpoint}, an instance of this class - * caches the method and parameter information for the onXXX calls. + * caches the method handlers and the method and parameter information for the + * onXXX calls. */ public class PojoMethodMapping { Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java?rev=1426336&r1=1426335&r2=1426336&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java Thu Dec 27 21:40:39 2012 @@ -26,7 +26,9 @@ import org.apache.tomcat.util.buf.B2CCon /** * Decodes bytes to UTF-8. Extracted from Apache Harmony and modified to reject * code points from U+D800 to U+DFFF as per RFC3629. The standard Java decoder - * does not reject these. + * does not reject these. It has also been modified to reject code points + * greater than U+10 which the standard Java decoder rejects but the harmony + * one does not. */ public class Utf8Decoder extends CharsetDecoder { Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java?rev=1426336&r1=1426335&r2=1426336&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Thu Dec 27 21:40:39 2012 @@ -33,8 +33,9 @@ import javax.websocket.PongMessage; import org.apache.tomcat.util.res.StringManager; /** - * Takes the ServletInputStream and converts the received data into WebSocket - * frames. + * Takes the ServletInputStream process the WebSocket frames it contains and + * extracts the messages. WebSocket Pings received will be responded to + * automatically without any action required by the application. */ public class WsFrame { - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
Re: svn commit: r1426279 - in /tomcat/trunk/java: javax/websocket/server/DefaultServerConfiguration.java javax/websocket/server/ServerEndpointConfiguration.java org/apache/tomcat/websocket/PojoEndpoin
2012/12/27 : > Author: markt > Date: Thu Dec 27 18:08:14 2012 > New Revision: 1426279 > > URL: http://svn.apache.org/viewvc?rev=1426279&view=rev > Log: > Javadoc and remove unnecessary code > > Modified: > tomcat/trunk/java/javax/websocket/server/DefaultServerConfiguration.java > tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java > > tomcat/trunk/java/org/apache/tomcat/websocket/PojoEndpointConfiguration.java > > --- tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java > (original) > +++ tomcat/trunk/java/javax/websocket/server/ServerEndpointConfiguration.java > Thu Dec 27 18:08:14 2012 > @@ -32,11 +32,24 @@ public interface ServerEndpointConfigura > > List getNegotiatedExtensions(List > requestedExtensions); > > +/** > + * Enables the WebSocket endpoint to acceot or reject connections based > on (fixed a typo) > + * the HTTP origin header. "the HTTP origin header" is understandable, but sounds as if the order of adjectives is wrong. Maybe " the "Origin" HTTP header " ? Speaking of which, the "Origin" header is not defined by RFC2616 (HTTP/1.1), but by its own RFC6454 (The Web Origin Concept). http://tools.ietf.org/html/rfc6454 > + * > + * @param originHeaderValue The HTTP origin header provided by the > client. > + * > + * @return true if the request should be accepted otherwise > + * false > + */ > boolean checkOrigin(String originHeaderValue); > > boolean matchesURI(URI uri); > > void modifyHandshake(HandshakeRequest request, HandshakeResponse > response); > > +/** > + * Returns the path at which this WebSocket server endpoint has been > + * registered. It may be a path or a level 0 URI template. What is "level 0" here? (A quick googling found http://tools.ietf.org/html/rfc6570#section-1.2 which should be right as that RFC is mentioned by JSR356, but numbering there starts with Level 1. Where does "Level 0" come from?). > + */ > String getPath(); > } > Best regards, Konstantin Kolinko - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1426344 - /tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java
Author: markt Date: Thu Dec 27 22:07:09 2012 New Revision: 1426344 URL: http://svn.apache.org/viewvc?rev=1426344&view=rev Log: Spotted a couple of threads hanging waiting on this barrier after an aborted Autobahn test. Try and stop that from happening. Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java?rev=1426344&r1=1426343&r2=1426344&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java Thu Dec 27 22:07:09 2012 @@ -263,6 +263,11 @@ public class WsRemoteEndpoint implements } } } +if (opCode == Constants.OPCODE_CLOSE) { +// Connection is closing - ensure no threads are stuck waiting on +// the write barrier +writeBarrier.reset(); +} } - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
[Tomcat Wiki] Update of "FAQ/Monitoring" by ChristopherSchultz
Dear Wiki user, You have subscribed to a wiki page or wiki category on "Tomcat Wiki" for change notification. The "FAQ/Monitoring" page has been changed by ChristopherSchultz: http://wiki.apache.org/tomcat/FAQ/Monitoring?action=diff&rev1=7&rev2=8 Comment: Added JNDI DataSource JMX Bean and attributes * JMX Bean: `Catalina:type=Manager,context=[context name],host=[hostname]` * Attributes: `activeSessions` + + === JNDI DataSource === + + * JMX Bean: `Catalina:type=DataSource,context=/[context name],host=[hostname],class=javax.sql.DataSource,name="[JNDI name]" + * Attributes: `numActive`, `numIdle` + = External Monitoring Tools = Plug-in-based monitoring software like Nagios and Icinga may need some help interacting with Tomcat's JMXProxyServlet. [[tools/check_jmxproxy.pl]] is a Perl script that can be used with these tools to monitor Tomcat via the JMXProxyServlet. - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1426356 - in /tomcat/trunk: java/org/apache/tomcat/websocket/Utf8Decoder.java test/org/apache/tomcat/websocket/TestUtf8.java
Author: markt Date: Thu Dec 27 22:52:45 2012 New Revision: 1426356 URL: http://svn.apache.org/viewvc?rev=1426356&view=rev Log: Add early detection of invalid sequences - Autobahn tests now pass in full. Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java tomcat/trunk/test/org/apache/tomcat/websocket/TestUtf8.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java?rev=1426356&r1=1426355&r2=1426356&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java Thu Dec 27 22:52:45 2012 @@ -99,6 +99,9 @@ public class Utf8Decoder extends Charset return CoderResult.malformedForLength(1); } if (limit - pos < 1 + tail) { +// No early test for invalid sequences here as peeking +// at the next byte is harder (and Tomcat's WebSocket +// implementation always uses array backed buffers) return CoderResult.UNDERFLOW; } int nextByte; @@ -116,10 +119,14 @@ public class Utf8Decoder extends Charset } pos += tail; } -// Note: This is the additional test added -if ((jchar >= 0xD800 && jchar <= 0xDFFF) || jchar > 0x10) { +// Apache Tomcat added test +if (jchar >= 0xD800 && jchar <= 0xDFFF) { return CoderResult.unmappableForLength(3); } +// Apache Tomcat added test +if (jchar > 0x10) { +return CoderResult.unmappableForLength(4); +} if (jchar <= 0x) { out.put((char) jchar); outRemaining--; @@ -162,6 +169,13 @@ public class Utf8Decoder extends Charset return CoderResult.malformedForLength(1); } if (inIndexLimit - inIndex < 1 + tail) { +// Apache Tomcat added test - detects invalid sequence as +// early as possible +if (jchar == 0x74 && inIndexLimit > inIndex + 1) { +if ((bArr[inIndex + 1] & 0xFF) > 0x8F) { +return CoderResult.unmappableForLength(4); +} +} break; } for (int i = 0; i < tail; i++) { @@ -182,10 +196,14 @@ public class Utf8Decoder extends Charset } inIndex += tail; } -// Note: This is the additional test added -if ((jchar >= 0xD800 && jchar <= 0xDFFF) || jchar > 0x10) { +// Apache Tomcat added test +if (jchar >= 0xD800 && jchar <= 0xDFFF) { return CoderResult.unmappableForLength(3); } +// Apache Tomcat added test +if (jchar > 0x10) { +return CoderResult.unmappableForLength(4); +} if (jchar <= 0x) { cArr[outIndex++] = (char) jchar; outRemaining--; Modified: tomcat/trunk/test/org/apache/tomcat/websocket/TestUtf8.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestUtf8.java?rev=1426356&r1=1426355&r2=1426356&view=diff == --- tomcat/trunk/test/org/apache/tomcat/websocket/TestUtf8.java (original) +++ tomcat/trunk/test/org/apache/tomcat/websocket/TestUtf8.java Thu Dec 27 22:52:45 2012 @@ -89,9 +89,7 @@ public class TestUtf8 { @Test public void testHarmonyDecoder2() { -// Ideally should fail after 2 bytes (i==1) but that makes the decoder -// a lot more complex to write -doHarmonyDecoder(SRC_BYTES_2, true, 3); +doHarmonyDecoder(SRC_BYTES_2, true, 1); } - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
Re: svn commit: r1426336 - in /tomcat/trunk/java: javax/websocket/PongMessage.java org/apache/tomcat/websocket/PojoMethodMapping.java org/apache/tomcat/websocket/Utf8Decoder.java org/apache/tomcat/web
2012/12/28 : > Author: markt > Date: Thu Dec 27 21:40:39 2012 > New Revision: 1426336 > > URL: http://svn.apache.org/viewvc?rev=1426336&view=rev > Log: > Javadoc > > Modified: > tomcat/trunk/java/javax/websocket/PongMessage.java > tomcat/trunk/java/org/apache/tomcat/websocket/PojoMethodMapping.java > tomcat/trunk/java/org/apache/tomcat/websocket/Utf8Decoder.java > tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java > > --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java (original) > +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Thu Dec 27 > 21:40:39 2012 > @@ -33,8 +33,9 @@ import javax.websocket.PongMessage; > import org.apache.tomcat.util.res.StringManager; > > /** > - * Takes the ServletInputStream and converts the received data into WebSocket > - * frames. > + * Takes the ServletInputStream process the WebSocket frames it contains and s/ process/ , processes / ? > + * extracts the messages. WebSocket Pings received will be responded to > + * automatically without any action required by the application. > */ > public class WsFrame { > Best regards, Konstantin Kolinko - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
buildbot failure in ASF Buildbot on tomcat-trunk
The Buildbot has detected a new failure on builder tomcat-trunk while building ASF Buildbot. Full details are available at: http://ci.apache.org/builders/tomcat-trunk/builds/3698 Buildbot URL: http://ci.apache.org/ Buildslave for this Build: bb-vm_ubuntu Build Reason: scheduler Build Source Stamp: [branch tomcat/trunk] 1426344 Blamelist: markt BUILD FAILED: failed compile_1 sincerely, -The Buildbot
Re: svn commit: r1426009 - /tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java
2012/12/27 : > Author: markt > Date: Wed Dec 26 20:19:51 2012 > New Revision: 1426009 > > URL: http://svn.apache.org/viewvc?rev=1426009&view=rev > Log: > Correctly set isText flag for text messages > > Modified: > tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java > > Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java?rev=1426009&r1=1426008&r2=1426009&view=diff > == > --- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java > (original) > +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpoint.java Wed > Dec 26 20:19:51 2012 > @@ -100,7 +100,7 @@ public class WsRemoteEndpoint implements > } > sendMessage(Constants.OPCODE_TEXT, textToByte, first, isLast); > if (!isLast) { > -isText = Boolean.FALSE; > +isText = Boolean.TRUE; > } > } It seems something is missing with the above "!isLast" condition. If I am reading it correctly, you are allowed to call (a) endpoint.sendString(..); endpoint.sendBytes(..); In (a) both the calls have isLast==true and the "isText" flag remains null. So, is there a reason why the following should be failing: (b) endpoint.sendPartialString(text, false); endpoint.sendPartialString(text, true); endpoint.sendBytes(..); If both (a) and (b) should be working, then there must be some code that resets "isText" flag back to the value of null. E.g. for the above it should be > if (isLast) { > isText = null; > } else { > isText = Boolean.TRUE; > } If both (a) and (b) should be failing, then the flag should be assigned unconditionally, > isText = Boolean.TRUE; Best regards, Konstantin Kolinko - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
Re: svn commit: r1425985 - /tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
If I understand this correctly, you had to trim the text of "wsFrame.textMessageTooBig" message? Maybe add some comment there to warn future translators? Maybe automatically truncate the i18n'ed message if it is too long? 2012/12/26 : > Author: markt > Date: Wed Dec 26 18:33:54 2012 > New Revision: 1425985 > > URL: http://svn.apache.org/viewvc?rev=1425985&view=rev > Log: > Make sure reason phrases will fit into a control frame payload > > Modified: > tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties > > Modified: > tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1425985&r1=1425984&r2=1425985&view=diff > == > --- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties > (original) > +++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Wed > Dec 26 18:33:54 2012 > @@ -21,7 +21,7 @@ serverContainer.servletContextMissing=No > uriTemplate.noMatch=The input template [{0}] generated the pattern [{1}] > which did not match the supplied pathInfo [{2}] > wsFrame.byteToLongFail=Too many bytes ([{0}]) were provided to be converted > into a long > wsFrame.controlFragmented=A fragmented control frame was received but > control frames may not be fragmented > -wsFrame.controlPayloadTooBig=A control frame was sent with a payload of > length [{0}] which is larger than the maximum length permitted of 125 bytes > +wsFrame.controlPayloadTooBig=A control frame was sent with a payload of size > [{0}] which is larger than the maximum permitted of 125 bytes > wsFrame.controlNoFin=A control frame was sent that did not have the fin bit > set. Control frames are not permitted to use continuation frames. > wsFrame.invalidOpCode= A WebSocket frame was sent with an unrecognised > opCode of [{0}] > wsFrame.invalidUtf8=A WebSocket text frame was received that could not be > decoded to UTF-8 because it contained invalid byte sequences > @@ -29,5 +29,5 @@ wsFrame.invalidUtf8Close=A WebSocket clo > wsFrame.noContinuation=A new message was started when a continuation frame > was expected > wsFrame.notMasked=The client frame was not masked but all client frames must > be masked > wsFrame.oneByteCloseCode=The client sent a close frame with a single byte > payload which is not valid > -wsFrame.textMessageTooBig=The decoded text message was too big to fit in the > output text message buffer and the endpoint does not support delivery of > partial messages > +wsFrame.textMessageTooBig=The decoded text message was too big for the > output buffer and the endpoint does not support partial messages > wsFrame.wrongRsv=The client frame set the reserved bits to [{0}] which was > not supported by this endpoint > \ No newline at end of file > > > > - > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
buildbot success in ASF Buildbot on tomcat-trunk
The Buildbot has detected a restored build on builder tomcat-trunk while building ASF Buildbot. Full details are available at: http://ci.apache.org/builders/tomcat-trunk/builds/3699 Buildbot URL: http://ci.apache.org/ Buildslave for this Build: bb-vm_ubuntu Build Reason: scheduler Build Source Stamp: [branch tomcat/trunk] 1426356 Blamelist: markt Build succeeded! sincerely, -The Buildbot
Re: svn commit: r1425680 - /tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java
2012/12/25 : > Author: markt > Date: Mon Dec 24 21:07:01 2012 > New Revision: 1425680 > > URL: http://svn.apache.org/viewvc?rev=1425680&view=rev > Log: > Text messages are always UTF8 > (Note that even with this fix Autobahn identifies a lot of UTF-8 handling > issues. The quick and dirty new String() approach needs a more robust > replacement.) > > Modified: > tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java > > Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java?rev=1425680&r1=1425679&r2=1425680&view=diff > == > --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java (original) > +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Mon Dec 24 > 21:07:01 2012 > @@ -18,6 +18,7 @@ package org.apache.tomcat.websocket; > > import java.io.EOFException; > import java.io.IOException; > +import java.io.UnsupportedEncodingException; > import java.nio.ByteBuffer; > > import javax.servlet.ServletInputStream; > @@ -282,8 +283,13 @@ public class WsFrame { > @SuppressWarnings("unchecked") > private void sendMessage(boolean last) { > if (textMessage) { > -String payload = > -new String(messageBuffer.array(), 0, > messageBuffer.limit()); > +String payload = null; > +try { > +payload = new String(messageBuffer.array(), 0, > +messageBuffer.limit(), "UTF8"); > +} catch (UnsupportedEncodingException e) { > +// All JVMs must support UTF8 > +} > MessageHandler mh = wsSession.getTextMessageHandler(); > if (mh != null) { > if (mh instanceof MessageHandler.Async) { > Looking at the current code, "new String()" call still remains in WsFrame.java Starting with Line 270: if (controlBufferBinary.remaining() > 0) { CoderResult cr = utf8DecoderControl.decode( controlBufferBinary, controlBufferText, true); if (cr.isError()) { controlBufferBinary.clear(); controlBufferText.clear(); throw new WsIOException(new CloseReason( CloseCodes.PROTOCOL_ERROR, sm.getString("wsFrame.invalidUtf8Close"))); } reason = new String(controlBufferBinary.array(), controlBufferBinary.arrayOffset() + controlBufferBinary.position(), controlBufferBinary.remaining(), "UTF8"); } Why use "new String(.., UTF8)" when there is "utf8DecoderControl.decode(..)" call several lines above? Isn't it supposed to use controlBufferText here ? Best regards, Konstantin Kolinko - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org
svn commit: r1426369 - /tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java
Author: kkolinko Date: Fri Dec 28 00:08:03 2012 New Revision: 1426369 URL: http://svn.apache.org/viewvc?rev=1426369&view=rev Log: Correct a typo (followup to r1425648 ) Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java?rev=1426369&r1=1426368&r2=1426369&view=diff == --- tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java Fri Dec 28 00:08:03 2012 @@ -22,7 +22,7 @@ import javax.websocket.CloseReason; /** * Allows the WebSocket implementation to throw an {@link IOException} that - * includes an {@link CloseReason} specific to the error that can be passed back + * includes a {@link CloseReason} specific to the error that can be passed back * to the client. */ public class WsIOException extends IOException { - To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org