/* Copyright (c) 2006, Sriram Srinivasan * * You may distribute this software under the terms of the license * specified in the file "License" */ package kilim.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.EOFException; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import junit.framework.TestCase; import kilim.Pausable; import kilim.Scheduler; import kilim.http.HttpRequest; import kilim.http.HttpResponse; import kilim.http.HttpSession; import kilim.nio.NioSelectorScheduler; public class TestHTTP extends TestCase { static final int ITERS = 10; static final int NCLIENTS = 100; NioSelectorScheduler nio; int port; @Override protected void setUp() throws Exception { nio = new NioSelectorScheduler(); // Starts a single thread that manages the select loop port = nio.listen(0, TestHttpServer.class, Scheduler.getDefaultScheduler()); // Thread.sleep(50); // Allow the socket to be registered and opened. } @Override protected void tearDown() throws Exception { nio.shutdown(); Scheduler.getDefaultScheduler().shutdown(); } public void testReqResp() throws IOException { String path = "/hello"; URL url = new URL("http://localhost:" + port + path); URLConnection conn = url.openConnection(); conn.setDefaultUseCaches(false); BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream())); String s = in.readLine(); assertTrue(s.contains(path)); in.close(); } public void testQuery() throws IOException { String path = "/%7ekilim/home.html?info?code=200&desc=Rolls%20Royce"; URL url = new URL("http://localhost:" + port + path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setDefaultUseCaches(false); BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream())); String s = in.readLine(); assertTrue(s.contains("~kilim")); assertTrue(s.contains("desc:Rolls Royce")); in.close(); } public void testChunking() throws IOException { String path = "/%7ekilim/home.html?buy?code=200&desc=Rolls%20Royce"; URL url = new URL("http://localhost:" + port + path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setDefaultUseCaches(false); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setChunkedStreamingMode(17); StringBuilder sb = new StringBuilder(268); sb.append("BEGIN"); for (int i = 0; i < 10; i++) { sb.append("abcdefghijklmnopqrstuvwxyz"); } sb.append("END"); BufferedWriter out = new BufferedWriter(new OutputStreamWriter( conn.getOutputStream())); out.write(sb.toString()); out.flush(); BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream())); String s = in.readLine(); assertEquals(s.length(), sb.length()); assertTrue(s.startsWith("BEGIN")); assertTrue(s.endsWith("END")); in.close(); out.close(); } public static class TestHttpServer extends HttpSession { public void execute() throws Pausable, Exception { try { while (true) { HttpRequest req = new HttpRequest(); HttpResponse resp = new HttpResponse(); // Fill up the request object. This pauses until the entire request has // been read in, including all chunks. super.readRequest(req); // System.out.println(req); if (req.method.equals("GET")) { resp.setContentType("text"); PrintWriter pw = new PrintWriter(resp.getOutputStream()); pw.append(req.uriPath).append(req.getQueryComponents().toString()); pw.flush(); sendResponse(resp); } else if (req.method.equals("POST")) { resp.setContentType("text"); PrintWriter pw = new PrintWriter(resp.getOutputStream()); String s = req.extractRange(req.contentOffset, req.contentOffset + req.contentLength); pw.append(s); pw.flush(); sendResponse(resp); } else { problem(resp, HttpResponse.ST_BAD_REQUEST, "Only get accepted"); } if (!req.keepAlive()) { break; } } } catch (EOFException ignore) { } } } }