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