Author: markt Date: Mon Jun 8 20:11:36 2015 New Revision: 1684266 URL: http://svn.apache.org/r1684266 Log: StreamError needs the stream ID (so we know which stream to close)
Modified: tomcat/trunk/java/org/apache/coyote/http2/FrameType.java tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties tomcat/trunk/java/org/apache/coyote/http2/StreamError.java tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java Modified: tomcat/trunk/java/org/apache/coyote/http2/FrameType.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/FrameType.java?rev=1684266&r1=1684265&r2=1684266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/FrameType.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/FrameType.java Mon Jun 8 20:11:36 2015 @@ -56,22 +56,18 @@ public enum FrameType { } - public void checkStream(String connectionId, int streamId) throws Http2Exception { - if (streamId == 0 && !streamZero) { - throw new ConnectionError(sm.getString("frameType.checkStream.invalidForZero", - connectionId, this), Error.PROTOCOL_ERROR); - } else if (streamId != 0 && !streamNonZero) { - throw new ConnectionError(sm.getString("frameType.checkStream.invalidForNonZero", - connectionId, Integer.valueOf(streamId), this), Error.PROTOCOL_ERROR); + public void checkStream(int streamId) throws Http2Exception { + if (streamId == 0 && !streamZero || streamId != 0 && !streamNonZero) { + throw new ConnectionError(sm.getString("frameType.checkStream", this), + Error.PROTOCOL_ERROR); } } - public void checkPayloadSize(String connectionId, int streamId, int payloadSize) - throws Http2Exception { + public void checkPayloadSize(int payloadSize) throws Http2Exception { if (payloadSizeValidator != null && !payloadSizeValidator.test(payloadSize)) { throw new ConnectionError(sm.getString("frameType.checkPayloadSize", - connectionId, Integer.toString(streamId), this, Integer.toString(payloadSize)), + Integer.toString(payloadSize), this), Error.FRAME_SIZE_ERROR); } } Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java?rev=1684266&r1=1684265&r2=1684266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Mon Jun 8 20:11:36 2015 @@ -86,9 +86,8 @@ class Http2Parser { try { validateFrame(expected, frameType, streamId, flags, payloadSize); } catch (StreamError se) { - // TODO debug log swallow(payloadSize); - return true; + throw se; } switch (frameType) { @@ -313,7 +312,7 @@ class Http2Parser { } else { throw new StreamError( sm.getString("http2Parser.processFrameWindowUpdate.invalidIncrement"), - Error.PROTOCOL_ERROR); + Error.PROTOCOL_ERROR, streamId); } } @@ -413,7 +412,7 @@ class Http2Parser { if (expected != null && frameType != expected) { throw new StreamError(sm.getString("http2Parser.processFrame.unexpectedType", - expected, frameType), Error.PROTOCOL_ERROR); + expected, frameType), Error.PROTOCOL_ERROR, streamId); } if (payloadSize > maxPayloadSize) { @@ -435,8 +434,8 @@ class Http2Parser { } } - frameType.checkStream(connectionId, streamId); - frameType.checkPayloadSize(connectionId, streamId, payloadSize); + frameType.checkStream(streamId); + frameType.checkPayloadSize(payloadSize); } Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1684266&r1=1684265&r2=1684266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Mon Jun 8 20:11:36 2015 @@ -172,7 +172,7 @@ public class Http2UpgradeHandler extends String base64Settings = stream.getCoyoteRequest().getHeader(HTTP2_SETTINGS_HEADER); byte[] settings = Base64.decodeBase64(base64Settings); - FrameType.SETTINGS.checkPayloadSize(connectionId, 1, settings.length); + FrameType.SETTINGS.checkPayloadSize(settings.length); for (int i = 0; i < settings.length % 6; i++) { int id = ByteUtil.getTwoBytes(settings, i * 6); @@ -239,13 +239,19 @@ public class Http2UpgradeHandler extends switch(status) { case OPEN_READ: try { - while (parser.readFrame(false)) { + while (true) { + try { + if (!parser.readFrame(false)) { + break; + } + } catch (StreamError se) { + // Stream errors are not fatal to the connection so + // continue reading frames + closeStream(se); + } } - } catch (StreamError se) { - // Stream error - // TODO Reset stream } catch (Http2Exception ce) { - // This should be a connection error + // Really ConnectionError if (log.isDebugEnabled()) { log.debug(sm.getString("upgradeHandler.connectionError"), ce); } @@ -332,6 +338,11 @@ public class Http2UpgradeHandler extends } + private void closeStream(StreamError se) { + // TODO + } + + private void closeConnecion(Http2Exception ce) { // Write a GOAWAY frame. byte[] fixedPayload = new byte[8]; Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1684266&r1=1684265&r2=1684266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Mon Jun 8 20:11:36 2015 @@ -24,9 +24,8 @@ connectionSettings.maxFrameSizeInvalid=T connectionSettings.unknown=An unknown setting with identifier [{0}] and value [{1}] was ignored connectionSettings.windowSizeTooBig=The requested window size of [{0}] is bigger than the maximum permitted value of [{1}] -frameType.checkPayloadSize=Connection [{0}], Stream [{1}], Frame type [{2}], Payload size of [{3}] is not valid for this frame type -frameType.checkStream.invalidForZero=Connection [{0}], Stream [0], received a [{1}] frame which is not valid for stream zero -frameType.checkStream.invalidForNonZero=Connection [{0}], Stream [{1}], received a [{2}] frame which is only valid for stream zero +frameType.checkPayloadSize=Payload size of [{0}] is not valid for frame type [{1}] +frameType.checkStream=Invalid frame type [{0}] hpack.integerEncodedOverTooManyOctets=HPACK variable length integer encoded over too many octets, max is {0} Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamError.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamError.java?rev=1684266&r1=1684265&r2=1684266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/StreamError.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/StreamError.java Mon Jun 8 20:11:36 2015 @@ -20,7 +20,15 @@ public class StreamError extends Http2Ex private static final long serialVersionUID = 1L; - public StreamError(String msg, Error error) { + private final int streamId; + + public StreamError(String msg, Error error, int streamId) { super(msg, error); + this.streamId = streamId; + } + + + public int getStreamId() { + return streamId; } } Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java?rev=1684266&r1=1684265&r2=1684266&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/StreamStateMachine.java Mon Jun 8 20:11:36 2015 @@ -114,7 +114,7 @@ public class StreamStateMachine { } else { throw new StreamError(sm.getString("streamStateMachine.invalidFrame", stream.getConnectionId(), stream.getIdentifier(), state, frameType), - state.errorCodeForInvalidFrame); + state.errorCodeForInvalidFrame, stream.getIdentifier().intValue()); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org