Author: markt Date: Tue Jan 5 12:05:17 2016 New Revision: 1723048 URL: http://svn.apache.org/viewvc?rev=1723048&view=rev Log: Refactor common code
Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java 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=1723048&r1=1723047&r2=1723048&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Tue Jan 5 12:05:17 2016 @@ -359,20 +359,8 @@ public class Http2UpgradeHandler extends if (connectionState.compareAndSet(ConnectionState.CONNECTED, ConnectionState.PAUSING)) { pausedNanoTime = System.nanoTime(); - // Write a GOAWAY frame. - byte[] fixedPayload = new byte[8]; - ByteUtil.set31Bits(fixedPayload, 0, (1 << 31) - 1); - ByteUtil.setFourBytes(fixedPayload, 4, Http2Error.NO_ERROR.getCode()); - byte[] payloadLength = new byte[3]; - ByteUtil.setThreeBytes(payloadLength, 0, 8); - try { - synchronized (socketWrapper) { - socketWrapper.write(true, payloadLength, 0, payloadLength.length); - socketWrapper.write(true, GOAWAY, 0, GOAWAY.length); - socketWrapper.write(true, fixedPayload, 0, 8); - socketWrapper.flush(true); - } + writeGoAwayFrame((1 << 31) - 1, Http2Error.NO_ERROR.getCode(), null); } catch (IOException ioe) { // This is fatal for the connection. Ignore it here. There will be // further attempts at I/O in upgradeDispatch() and it can better @@ -392,20 +380,7 @@ public class Http2UpgradeHandler extends if (connectionState.get() == ConnectionState.PAUSING) { if (pausedNanoTime + pingManager.getRoundTripTimeNano() < System.nanoTime()) { connectionState.compareAndSet(ConnectionState.PAUSING, ConnectionState.PAUSED); - - // Write a GOAWAY frame. - byte[] fixedPayload = new byte[8]; - ByteUtil.set31Bits(fixedPayload, 0, maxProcessedStreamId); - ByteUtil.setFourBytes(fixedPayload, 4, Http2Error.NO_ERROR.getCode()); - byte[] payloadLength = new byte[3]; - ByteUtil.setThreeBytes(payloadLength, 0, 8); - - synchronized (socketWrapper) { - socketWrapper.write(true, payloadLength, 0, payloadLength.length); - socketWrapper.write(true, GOAWAY, 0, GOAWAY.length); - socketWrapper.write(true, fixedPayload, 0, 8); - socketWrapper.flush(true); - } + writeGoAwayFrame(maxProcessedStreamId, Http2Error.NO_ERROR.getCode(), null); } } } @@ -438,22 +413,9 @@ public class Http2UpgradeHandler extends void closeConnection(Http2Exception ce) { - // Write a GOAWAY frame. - byte[] fixedPayload = new byte[8]; - ByteUtil.set31Bits(fixedPayload, 0, maxProcessedStreamId); - ByteUtil.setFourBytes(fixedPayload, 4, ce.getError().getCode()); - byte[] debugMessage = ce.getMessage().getBytes(StandardCharsets.UTF_8); - byte[] payloadLength = new byte[3]; - ByteUtil.setThreeBytes(payloadLength, 0, debugMessage.length + 8); - try { - synchronized (socketWrapper) { - socketWrapper.write(true, payloadLength, 0, payloadLength.length); - socketWrapper.write(true, GOAWAY, 0, GOAWAY.length); - socketWrapper.write(true, fixedPayload, 0, 8); - socketWrapper.write(true, debugMessage, 0, debugMessage.length); - socketWrapper.flush(true); - } + writeGoAwayFrame(maxProcessedStreamId, ce.getError().getCode(), + ce.getMessage().getBytes(StandardCharsets.UTF_8)); } catch (IOException ioe) { // Ignore. GOAWAY is sent on a best efforts basis and the original // error has already been logged. @@ -462,6 +424,29 @@ public class Http2UpgradeHandler extends } + private void writeGoAwayFrame(int maxStreamId, long errorCode, byte[] debugMsg) + throws IOException { + byte[] fixedPayload = new byte[8]; + ByteUtil.set31Bits(fixedPayload, 0, maxStreamId); + ByteUtil.setFourBytes(fixedPayload, 4, errorCode); + int len = 8; + if (debugMsg != null) { + len += debugMsg.length; + } + byte[] payloadLength = new byte[3]; + ByteUtil.setThreeBytes(payloadLength, 0, len); + + synchronized (socketWrapper) { + socketWrapper.write(true, payloadLength, 0, payloadLength.length); + socketWrapper.write(true, GOAWAY, 0, GOAWAY.length); + socketWrapper.write(true, fixedPayload, 0, 8); + if (debugMsg != null) { + socketWrapper.write(true, debugMsg, 0, debugMsg.length); + } + socketWrapper.flush(true); + } + } + void writeHeaders(Stream stream, Response coyoteResponse, int payloadSize) throws IOException { if (log.isDebugEnabled()) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org