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