Author: markt Date: Wed May 13 18:40:23 2015 New Revision: 1679256 URL: http://svn.apache.org/r1679256 Log: Pull out the byte manipulation into a separate utility class to make the upgrade handler easier to read.
Added: tomcat/trunk/java/org/apache/coyote/http2/ByteUtil.java (with props) Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Added: tomcat/trunk/java/org/apache/coyote/http2/ByteUtil.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/ByteUtil.java?rev=1679256&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/ByteUtil.java (added) +++ tomcat/trunk/java/org/apache/coyote/http2/ByteUtil.java Wed May 13 18:40:23 2015 @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.coyote.http2; + +/** + * Utility class for extracting values from byte arrays. + */ +public class ByteUtil { + + private ByteUtil() { + // Hide default constructor + } + + + public static boolean isBit7Set(byte input) { + return (input & 0x80) > 0; + } + + + public static int get31Bits(byte[] input, int firstByte) { + return ((input[firstByte] & 0x7F) << 24) + ((input[firstByte + 1] & 0xFF) << 16) + + ((input[firstByte + 2] & 0xFF) << 8) + (input[firstByte + 3] & 0xFF); + } + + + public static int getOneByte(byte[] input, int pos) { + return (input[pos] & 0xFF); + } + + + public static int getTwoBytes(byte[] input, int firstByte) { + return ((input[firstByte] & 0xFF) << 8) + (input[firstByte + 1] & 0xFF); + } + + + public static int getThreeBytes(byte[] input, int firstByte) { + return ((input[firstByte] & 0xFF) << 16) + ((input[firstByte + 1] & 0xFF) << 8) + + (input[firstByte + 2] & 0xFF); + } + + + public static int getFourBytes(byte[] input, int firstByte) { + return ((input[firstByte] & 0xFF) << 24) + ((input[firstByte + 1] & 0xFF) << 16) + + ((input[firstByte + 2] & 0xFF) << 8) + (input[firstByte + 3] & 0xFF); + } +} Propchange: tomcat/trunk/java/org/apache/coyote/http2/ByteUtil.java ------------------------------------------------------------------------------ svn:eol-style = native 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=1679256&r1=1679255&r2=1679256&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Wed May 13 18:40:23 2015 @@ -183,8 +183,8 @@ public class Http2UpgradeHandler extends } int frameType = getFrameType(frameHeader); - int flags = frameHeader[4] & 0xFF; - int streamId = getStreamIdentifier(frameHeader); + int flags = ByteUtil.getOneByte(frameHeader, 4); + int streamId = ByteUtil.get31Bits(frameHeader, 5); int payloadSize = getPayloadSize(streamId, frameHeader); switch (frameType) { @@ -224,10 +224,9 @@ public class Http2UpgradeHandler extends byte[] payload = new byte[5]; readFully(payload); - boolean exclusive = (payload[0] & 0x80) > 0; - int parentStreamId = ((payload[0] & 0x7F) << 24) + ((payload[1] & 0xFF) << 16) + - ((payload[2] & 0xFF) << 8) + (payload[3] & 0xFF); - int weight = (payload[4] & 0xFF) + 1; + boolean exclusive = ByteUtil.isBit7Set(payload[0]); + int parentStreamId = ByteUtil.get31Bits(payload, 0); + int weight = ByteUtil.getOneByte(payload, 4) + 1; Stream stream = getStream(streamId); AbstractStream parentStream; @@ -280,9 +279,8 @@ public class Http2UpgradeHandler extends byte[] setting = new byte[6]; for (int i = 0; i < payloadSize / 6; i++) { readFully(setting); - int id = ((setting[0] & 0xFF) << 8) + (setting[1] & 0xFF); - long value = ((setting[2] & 0xFF) << 24) + ((setting[3] & 0xFF) << 16) + - ((setting[4] & 0xFF) << 8) + (setting[5] & 0xFF); + int id = ByteUtil.getTwoBytes(setting, 0); + long value = ByteUtil.getFourBytes(setting, 2); remoteSettings.set(id, value); } } @@ -310,8 +308,7 @@ public class Http2UpgradeHandler extends byte[] payload = new byte[4]; readFully(payload); - int windowSizeIncrement = ((payload[0] & 0x7F) << 24) + ((payload[1] & 0xFF) << 16) + - ((payload[2] & 0xFF) << 8) + (payload[3] & 0xFF); + int windowSizeIncrement = ByteUtil.get31Bits(payload, 0); if (log.isDebugEnabled()) { log.debug(sm.getString("upgradeHandler.processFrameWindowUpdate.debug", @@ -383,7 +380,7 @@ public class Http2UpgradeHandler extends private int getFrameType(byte[] frameHeader) throws IOException { - int frameType = frameHeader[3] & 0xFF; + int frameType = ByteUtil.getOneByte(frameHeader, 3); // Make sure the first frame is a settings frame if (firstFrame) { if (frameType != FRAME_TYPE_SETTINGS) { @@ -397,18 +394,9 @@ public class Http2UpgradeHandler extends } - private int getStreamIdentifier(byte[] frameHeader) { - // MSB of [5] is reserved and must be ignored. - return ((frameHeader[5] & 0x7F) << 24) + ((frameHeader[6] & 0xFF) << 16) + - ((frameHeader[7] & 0xFF) << 8) + (frameHeader[8] & 0xFF); - } - - private int getPayloadSize(int streamId, byte[] frameHeader) throws IOException { // Make sure the payload size is valid - int payloadSize = ((frameHeader[0] & 0xFF) << 16) + - ((frameHeader[1] & 0xFF) << 8) + - (frameHeader[2] & 0xFF); + int payloadSize = ByteUtil.getThreeBytes(frameHeader, 0); if (payloadSize > remoteSettings.getMaxFrameSize()) { swallowPayload(payloadSize); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org