/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package com.sun.grizzly.http; import com.sun.grizzly.http.embed.GrizzlyWebServer; import java.io.BufferedOutputStream; import junit.framework.TestCase; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; public class RequestProcessingOverflowTest extends TestCase { // ------------------------------------------------------ Test Setup/Destroy private static final int PORT = 7777; private static final String MESSAGE = "Hello world!"; private GrizzlyWebServer webServer; @Override protected void setUp() throws Exception { webServer = new GrizzlyWebServer(PORT); webServer.addGrizzlyAdapter(new ContentEncodingTest.MessageAdapter(MESSAGE), new String[]{"/test"}); webServer.start(); } @Override protected void tearDown() throws Exception { if (webServer != null) { try { webServer.stop(); } finally { webServer = null; } } } // ------------------------------------------------------------ Test Methods /** * Issue: https://grizzly.dev.java.net/issues/show_bug.cgi?id=487 */ public void testLargeRequestURI() { Socket s = initClientSocket(); final int bufferSize = 16384; try { OutputStream out = new BufferedOutputStream(s.getOutputStream(), bufferSize); // Per the issue description: // // Try to produce a simple HTTP request like // // GET /foo/bar/loooooooooooooooooooong HTTP/1.0 // Host: somehost // // // where "loooooooooooooooooooong" has so many 'o' characters such // that the whole // request has a size >8192 bytes. StringBuilder sb = new StringBuilder(bufferSize); sb.append("GET /test/l"); for (int i = 0; i < 8200; i++) { sb.append('o'); } sb.append("g HTTP/1.1\n"); out.write(sb.toString().getBytes()); out.write("Host: localhost\n".getBytes()); out.write("\n".getBytes()); out.flush(); } catch (SocketException ignored) { // If it's SocketException - probably it's "broken pipe", // which occurred cause the server closed connection before // read out entire request. // It's expected. Let the client read the response } catch (IOException e) { fail("Unable to complete test request to local test server: " + e.toString()); } try { InputStream in = s.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String responseStatus = reader.readLine(); String control = "HTTP/1.1 414 Request-URI Too Long"; assertEquals(control, control, responseStatus); } catch (IOException e) { fail("Unable to read response from local test server: " + e.toString()); } } public void testLargeRequestHeader() { Socket s = initClientSocket(); final int bufferSize = 16384; try { OutputStream out = new BufferedOutputStream(s.getOutputStream(), bufferSize); StringBuilder sb = new StringBuilder(bufferSize); sb.append("Host: lo"); for (int i = 0; i < 8200; i++) { sb.append('o'); } sb.append("calhost\n"); out.write("GET /test HTTP/1.1\n".getBytes()); out.write(sb.toString().getBytes()); out.write("\n".getBytes()); out.flush(); } catch (SocketException ignored) { // If it's SocketException - probably it's "broken pipe", // which occurred cause the server closed connection before // read out entire request. // It's expected. Let the client read the response } catch (IOException e) { fail("Unable to complete test request to local test server: " + e.toString()); } try { InputStream in = s.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String responseStatus = reader.readLine(); String control = "HTTP/1.1 400 Bad Request"; assertEquals(control, control, responseStatus); } catch (IOException e) { fail("Unable to read response from local test server: " + e.toString()); } } // --------------------------------------------------------- Private Methods private static Socket initClientSocket() { Socket s = null; try { s = new Socket("localhost", PORT); } catch (Exception e) { fail("Unable to establish connection to local test server: " + e.toString()); } try { s.setSoTimeout(30 * 1000); } catch (SocketException se) { fail("Unable to set SoTimeout: " + se.toString()); } return s; } }