/* * JBoss, Home of Professional Open Source * * Copyright 2013 Red Hat, Inc. and/or its affiliates. * * 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.xnio.http; import java.io.IOException; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.junit.Assert; import org.junit.Test; /** * @author Stuart Douglas */ public class HttpParserTestCase { @Test public void testSimpleResponses() throws IOException { runTest("HTTP/1.1 101 Upgrade\r\n\r\n", 101, "HTTP/1.1", "Upgrade"); runTest("HTTP/1.1 101 Upgrade\r\nConnection: Upgrade\r\n\r\n", 101, "HTTP/1.1", "Upgrade", "connection", "Upgrade"); runTest("HTTP/1.1 404 Not Found\r\nConnection: close\r\nSet-Cookie: someCookie\r\n\r\n", 404, "HTTP/1.1", "Not Found", "connection", "close", "set-cookie", "someCookie"); } public void runTest(String response, final int status, final String version, final String message, final String... header) throws IOException { final Map<String, String> headerMap = new HashMap<String, String>(); Assert.assertEquals("Headers must be a multiple of 2", 0, header.length % 2); for (int i = 0; i < header.length; i += 2) { headerMap.put(header[i], header[i + 1]); } testMethodSplit(response, status, version, message, headerMap); testOneCharacterAtATime(response, status, version, message, headerMap); } void testMethodSplit(String response, final int status, final String version, final String message, final Map<String, String> headers) { byte[] in = response.getBytes(); for (int i = 0; i < in.length - 4; ++i) { try { testSplit(i, in, status, version, message, headers); } catch (Throwable e) { throw new RuntimeException("Test failed at split " + i, e); } } } public void testOneCharacterAtATime(String response, final int status, final String version, final String message, final Map<String, String> headers) throws IOException { ByteBuffer buffer = ByteBuffer.wrap(response.getBytes()); buffer.limit(0); final HttpUpgradeParser parser = new HttpUpgradeParser(); while (!parser.isComplete()) { buffer.limit(buffer.limit() + 1); parser.parse(buffer); } runAssertions(parser, status, version, message, headers); } private void testSplit(final int split, byte[] in, final int status, final String version, final String message, final Map<String, String> headers) throws IOException { final HttpUpgradeParser parser = new HttpUpgradeParser(); ByteBuffer buffer = ByteBuffer.wrap(in); buffer.limit(split); parser.parse(buffer); buffer.limit(buffer.capacity()); parser.parse(buffer); runAssertions(parser, status, version, message, headers); } private void runAssertions(HttpUpgradeParser parser, final int status, final String version, final String message, final Map<String, String> headers) { Assert.assertEquals(status, parser.getResponseCode()); Assert.assertEquals(version, parser.getHttpVersion()); Assert.assertEquals(message, parser.getMessage()); Assert.assertEquals(headers.size(), parser.getHeaders().size()); for (Map.Entry<String, String> entry : headers.entrySet()) { Assert.assertEquals(entry.getValue(), parser.getHeaders().get(entry.getKey()).get(0)); } } }