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

Reply via email to