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: [email protected]
For additional commands, e-mail: [email protected]