/* * Copyright (c) 2012 the original author or authors. * * Licensed 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.eclipse.jetty.spdy.parser; import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicReference; import org.eclipse.jetty.spdy.StandardCompressionFactory; import org.eclipse.jetty.spdy.frames.ControlFrame; import org.eclipse.jetty.spdy.frames.ControlFrameType; import org.eclipse.jetty.spdy.frames.SynStreamFrame; import org.junit.Assert; import org.junit.Test; public class LiveChromiumRequestParserTest { @Test public void testSynStream() throws Exception { // Bytes taken with wireshark from a live chromium request byte[] bytes1 = toBytes("" + "800200010100011a0000000100000000000038eadfa251b262e0626083a41706" + "7bb80b75302cd6ae4017cdcdb12eb435d0b3d4d1d2d702b32c18f850732c036f" + "68889bae850e44da94811f2d0b3308821ca80375a14e714a72065c0d2cd619f8" + "52f37443837552f3a076b080b234033f28de73404c2b43630b135306b65c6059" + "929fc2c0ecee1ac2c0560c4c7eb9a940b52525050ccc206f32ea337021f22643" + "bb6f7e55664e4ea2bea99e81824684a1a135400a3e9979a5150a151666f16626" + "9a0a8e40afa686a726796796e89b1a9bea992b68787b84f8fae828e46466a72a" + "b8a72667e76b2a842695e69594ea1b0203d640c1390358e06496e6ea1b9ae901" + "c3c5d048cfdc1c22988a22149c98965894093195811d1a150c1cb01802000000" + "ffff"); byte[] bytes2 = toBytes("" + "800200010100002700000003000000008000428a106660d00ee640e5d14f4b2c" + "cb0466313d203154c217000000ffff"); final AtomicReference<ControlFrame> frameRef = new AtomicReference<>(); Parser parser = new Parser(new StandardCompressionFactory().newDecompressor()); parser.addListener(new Parser.Listener.Adapter() { @Override public void onControlFrame(ControlFrame frame) { frameRef.set(frame); } }); parser.parse(ByteBuffer.wrap(bytes1)); ControlFrame frame = frameRef.get(); Assert.assertNotNull(frame); Assert.assertEquals(ControlFrameType.SYN_STREAM, frame.getType()); SynStreamFrame synStream = (SynStreamFrame)frame; Assert.assertEquals(2, synStream.getVersion()); Assert.assertEquals(1, synStream.getStreamId()); Assert.assertEquals(0, synStream.getAssociatedStreamId()); Assert.assertEquals(0, synStream.getPriority()); Assert.assertNotNull(synStream.getHeaders()); Assert.assertFalse(synStream.getHeaders().isEmpty()); frameRef.set(null); parser.parse(ByteBuffer.wrap(bytes2)); frame = frameRef.get(); Assert.assertNotNull(frame); Assert.assertEquals(ControlFrameType.SYN_STREAM, frame.getType()); synStream = (SynStreamFrame)frame; Assert.assertEquals(2, synStream.getVersion()); Assert.assertEquals(3, synStream.getStreamId()); Assert.assertEquals(0, synStream.getAssociatedStreamId()); Assert.assertEquals(2, synStream.getPriority()); Assert.assertNotNull(synStream.getHeaders()); Assert.assertFalse(synStream.getHeaders().isEmpty()); } private byte[] toBytes(String hexs) { byte[] bytes = new byte[hexs.length() / 2]; for (int i = 0; i < hexs.length(); i += 2) { String hex = hexs.substring(i, i + 2); bytes[i / 2] = (byte)Integer.parseInt(hex, 16); } return bytes; } }