1e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/* 2e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 3e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * contributor license agreements. See the NOTICE file distributed with 4e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * this work for additional information regarding copyright ownership. 5e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 6e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * (the "License"); you may not use this file except in compliance with 7e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * the License. You may obtain a copy of the License at 8e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * 9e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 10e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * 11e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Unless required by applicable law or agreed to in writing, software 12e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 13e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * See the License for the specific language governing permissions and 15e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * limitations under the License. 16e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes */ 17e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 18e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespackage tests.support; 19e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 20e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.ByteArrayOutputStream; 21e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.IOException; 22e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.InputStream; 23e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.InterruptedIOException; 24e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.OutputStream; 25e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.util.Vector; 26e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 27e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport junit.framework.Assert; 28e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport junit.framework.TestCase; 29e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 30e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespublic class Support_HttpServer { 31e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private static final int timeout = 10000; 33e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String AUTHTEST = "/authTest"; 35e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String CHUNKEDTEST = "/chunkedTest.html"; 37e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String CONTENTTEST = "/contentTest.html"; 39e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String REDIRECTTEST = "/redirectTest.html"; 41e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String PORTREDIRTEST = "/portredirTest.html"; 43e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String OTHERTEST = "/otherTest.html"; 45e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String POSTTEST = "/postTest.html"; 47e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final String HEADERSTEST = "/headersTest.html"; 49e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int OK = 200; 51e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int MULT_CHOICE = 300; 53e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int MOVED_PERM = 301; 55e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int FOUND = 302; 57e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int SEE_OTHER = 303; 59e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int NOT_MODIFIED = 304; 61e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int UNUSED = 306; 63e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int TEMP_REDIRECT = 307; 65e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int UNAUTHORIZED = 401; 67e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public static final int NOT_FOUND = 404; 69e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private int port; 71e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private boolean proxy = false; 73e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private boolean started = false; 75e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private boolean portRedirectTestEnable = false; 77e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private volatile Support_ServerSocket serversocket; 79e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private boolean shuttingDown = false; 81e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // synchronization 838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private final Object lock = new Object(); 84e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath TestCase testcase = null; 86e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public Support_HttpServer(Support_ServerSocket serversocket, TestCase test) { 888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.serversocket = serversocket; 898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.testcase = test; 908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 91e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public int getPort() { 938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return port; 948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 95e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void startServer(final int port) { 978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (started) { 98e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes return; 99e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath started = true; 1018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.port = port; 1028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Thread serverThread = new Thread(new Runnable() { 1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void run() { 1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 1078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath serversocket.setPort(port); 1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath serversocket.setTimeout(timeout); 1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath serversocket.open(); 1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath lock.notifyAll(); 1118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath while (true) { 1148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // wait for a connection to be made 1158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Support_Socket socket = serversocket.accept(); 1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Thread thread = new Thread(new ServerThread(socket)); 1178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath thread.start(); 1188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InterruptedIOException e) { 1208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.out 1218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .println("Wait timed out. Test HTTP Server shut down."); 1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath started = false; 1238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (serversocket != null) { 125e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes serversocket.close(); 126e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 1278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e2) { 1288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // release the lock so the tests will finish running 1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (!shuttingDown) { 1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Assert.fail("Test server error on HTTP Server on port " 1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + port + ": " + e); 1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 1378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath lock.notifyAll(); 1388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } finally { 1408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (serversocket != null) { 142e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes serversocket.close(); 143e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 1448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 1458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 1468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath }); 1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // start the server and continue 1528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath synchronized (lock) { 1538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath serverThread.start(); 1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // wait for the port to be opened before continuing 1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // to eliminate a race condition between starting the 1578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // server and the clients accessing the server 1588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath lock.wait(); 1608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (InterruptedException e) { 1618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err.println("Unexpected interrupt 2"); 1628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 1638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void stopServer() { 1698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 1708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath shuttingDown = true; 1718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath serversocket.close(); 1728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 1738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath class ServerThread implements Runnable { 1778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Support_Socket socket; 1798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath ServerThread(Support_Socket s) { 1818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath socket = s; 1828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 1848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String readln(InputStream is) throws IOException { 1858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath boolean lastCr = false; 1868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath StringBuffer result = new StringBuffer(); 1878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int c = is.read(); 1888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (c < 0) { 189e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes return null; 190e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 1918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath while (c != '\n') { 1928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (lastCr) { 1938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath result.append('\r'); 1948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath lastCr = false; 1958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 1968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (c == '\r') { 197e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes lastCr = true; 198e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else { 199e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes result.append((char) c); 200e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 2018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath c = is.read(); 2028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (c < 0) { 203e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes break; 204e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 2058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath return result.toString(); 2078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 2098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath void print(OutputStream os, String text) throws IOException { 2108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.write(text.getBytes("ISO8859_1")); 2118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 2138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void run() { 2148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // get the input stream 2168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 2178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // parse the result headers until the first blank line 2188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath InputStream in = socket.getInputStream(); 2198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String line; 2208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath boolean authenticated = false, contentLength = false, chunked = false; 2218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int length = -1; 2228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String resourceName = ""; 2238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Vector<String> headers = new Vector<String>(); 2248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath while (((line = readln(in)) != null) && (line.length() > 1)) { 2258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath headers.addElement(line); 2268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String lline = line.toLowerCase(); 2278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // determine the resource requested in the first line 2288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (lline.startsWith("get") || lline.startsWith("post")) { 2298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int start = line.indexOf(' ') + 1; 2308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int end = line.indexOf(' ', start); 2318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (start > 0 && end > -1) { 232e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes resourceName = line.substring(start, end); 233e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 2348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (lline.startsWith("authorization:")) { 2368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath authenticated = true; 2378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (lline.startsWith("content-length")) { 2398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (contentLength) { 240e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes Assert.fail("Duplicate Content-Length: " + line); 241e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 2428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath contentLength = true; 2438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath length = Integer.parseInt(line.substring(line 2448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .indexOf(' ') + 1)); 2458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (line.startsWith("transfer-encoding")) { 2478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (chunked) { 248e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes Assert.fail("Duplicate Transfer-Encoding: " 2498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + line); 250e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 2518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath chunked = true; 2528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String encoding = line.substring(line.indexOf(' ') + 1); 2538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if ("chunked".equals(encoding)) { 254e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes Assert.fail("Unknown Transfer-Encoding: " 2558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + encoding); 256e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 2578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 258e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 2598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (contentLength && chunked) { 261e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes Assert.fail("Found both Content-Length and Transfer-Encoding"); 262e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 263e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 2648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // call the test function based on the requested resource 2658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (resourceName.equals(CHUNKEDTEST)) { 266e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes chunkedTest(); 267e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (resourceName.equals(CONTENTTEST)) { 268e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes contentTest(); 269e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (resourceName.equals(AUTHTEST)) { 270e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes authenticateTest(authenticated); 271e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (resourceName.startsWith(REDIRECTTEST)) { 272e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes redirectTest(resourceName); 273e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (portRedirectTestEnable 2748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath && resourceName.equals(PORTREDIRTEST)) { 275e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes contentTest(); 276e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (resourceName.equals(OTHERTEST)) { 277e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes otherTest(); 278e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (resourceName.equals(HEADERSTEST)) { 279e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes headersTest(headers); 280e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (resourceName.startsWith("http://") 2818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath && resourceName.indexOf(OTHERTEST) > -1) { 282e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes // redirection to a proxy passes an absolute URI to the 2838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // proxy server 2848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath otherTest(); 285e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } else if (resourceName.equals(POSTTEST)) { 2868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath postTest(length, in); 2878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else { 288e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes notFound(); // return a not found error 289e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 290e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 2918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.close(); 2928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath socket.close(); 2938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 2948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 2958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err.println("Error performing http server test."); 2968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 2978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 2988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 2998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void contentTest() { 3028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // send 5 bytes of data, specifying a content-length 3038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 3048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 3058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + OK + " OK\r\n"); 3068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Content-Length: 5\r\n"); 3078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\nABCDE"); 3088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 3098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 3108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 3118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err.println("Error performing content coding test."); 3128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 3138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void chunkedTest() { 3188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // send 5 bytes of chunked data 3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 3208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 3218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + OK + " OK\r\n"); 3228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Transfer-Encoding: chunked\r\n"); 3238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\n"); 3248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "5\r\nFGHIJ"); 3258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\n0\r\n\r\n"); 3268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 3278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 3288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 3298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err 3308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath .println("Error performing chunked transfer coding test."); 3318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 3328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void authenticateTest(boolean authenticated) { 3378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // send an authentication required response 3388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // the client should respond with a new request 3398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // that includes authorization credentials 3408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 3418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 3428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // if the user has not sent along credentials, return 3448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // unauthorized, which should prompt them to repeat 3458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // the request with an authorization header added 3468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (!authenticated) { 3478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + UNAUTHORIZED + " Unauthorized\r\n"); 3488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "WWW-Authenticate: Basic realm=\"test\"\r\n"); 3498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else { 3508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + OK + " OK\r\n"); 3518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Content-Length: 5\r\n"); 3548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\nKLMNO"); 3558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 3568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 3578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 3588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err.println("Error performing authentication test."); 3598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 3608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void redirectTest(String test) { 3648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // send a redirect response 3658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // the URL was in the format: 3678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // "http://localhost:<port>/redirectTest.html/<3XX level response 3688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // code>-<new URL>" 3698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // "eg. 3708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // http://localhost:8080/redirectTest.html/301-http://www.apache.org" 3718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int responseNum = Integer.parseInt(test.substring( 3728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath test.indexOf('3'), test.indexOf('3') + 3)); 3738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String location = test.substring(test.lastIndexOf('-') + 1); 3748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 3768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 3778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + responseNum + " Irrelevant\r\n"); 3788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Location: " + location + "\r\n"); 3798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Content-Length: 5\r\n"); 3808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\nPQRST"); 3818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 3828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 3838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 3858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err.println("Error performing redirection test."); 3868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 3878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 3908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 3918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void otherTest() { 3928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // send 5 bytes of content coded data 3938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 3948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 3958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (!proxy) { 3968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + 305 + " Use Proxy\r\n"); 3978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Location: http://localhost:" + (port + 1) 3988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath + "/otherTest.html\r\n"); 3998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Content-Length: 9\r\n"); 4008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\nNOT PROXY"); 4018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } else { 4028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + OK + " OK\r\n"); 4038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Content-Length: 5\r\n"); 4048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\nPROXY"); 4058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 4078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 4088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 4098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 4108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err.println("Error performing content coding test."); 4118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 4128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 4148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 4168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void headersTest(Vector<String> headers) { 4178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int found = 0; 4188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < headers.size(); i++) { 4198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath String header = headers.elementAt(i); 4208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (header.startsWith("header1:")) { 4218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath found++; 4228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Assert.assertTrue("unexpected header: " + header, 4238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath found == 1); 4248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath Assert.assertTrue("invalid header: " + header, 4258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath "header1: value2".equals(header)); 4268d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4288d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // send duplicate headers 4298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 4308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 4318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + OK + " OK\r\n"); 4328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Cache-Control: no-cache=\"set-cookie\"\r\n"); 4338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Cache-Control: private\r\n"); 4348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Cache-Control: no-transform\r\n\r\n"); 4358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 4368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 4378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 4388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath System.err.println("Error performing headers test."); 4398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 4408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 4438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 4448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Method postTest. 4458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 4468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void postTest(int length, InputStream in) { 4478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 4488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath ByteArrayOutputStream data = new ByteArrayOutputStream(); 4498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // read content-length specified data 4508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < length; i++) { 451e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes data.write(in.read()); 452e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } 453e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 4548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // read chunked-encoding data 4558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath if (length == -1) { 4568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath int len = in.read() - 48; 4578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath while (len > 0) { 4608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath for (int i = 0; i < len; i++) { 4618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath data.write(in.read()); 4628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath len = in.read() - 48; 4668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath in.read(); 4718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 4738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 4748d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + OK + " OK\r\n"); 4758d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Content-Length: " + data.size() + "\r\n\r\n"); 4768d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.write(data.toByteArray()); 4778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 4788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 4798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 4808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 4818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 4848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private void notFound() { 4858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath try { 4868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // System.out.println("File not found on test server."); 4878d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath OutputStream os = socket.getOutputStream(); 4888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "HTTP/1.1 " + NOT_FOUND + " Not Found\r\n"); 4898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "Content-Length: 1\r\n"); 4908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath print(os, "\r\nZ"); 4918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.flush(); 4928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath os.close(); 4938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } catch (IOException e) { 4948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath e.printStackTrace(); 4958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4968d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 4988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 4998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 5008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 5018d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Sets portRedirectTestEnable. 5028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 5038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param portRedirectTestEnable The portRedirectTestEnable to set 5048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 5058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void setPortRedirectTestEnable(boolean portRedirectTestEnable) { 5068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // enables an additional resource ("portredirTest.html") to be returned 5078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // so that the port redirection test can distinguish 5088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath // between the two servers (on different ports). 5098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 5108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.portRedirectTestEnable = portRedirectTestEnable; 5118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 5128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 5138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath /** 5148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * Sets the proxy. 5158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 5168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @param proxy The proxy to set 5178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 5188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath public void setProxy(boolean proxy) { 5198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath this.proxy = proxy; 5208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath } 521e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 522e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes} 523