/* @test @(#)file2.1 1.1 03/08/09 * @summary Unit test for java.net.ResponseCacheHandler * @bug 4837267 * @author Yingxian Wang */ import java.net.*; import java.util.*; import java.io.*; import java.nio.*; import java.nio.channels.ReadableByteChannel; import sun.net.www.ParseUtil; /** * Request should get serviced by the cache handler. Response get * saved through the cache handler. */ public class ResponseCacheHandlerTest implements Runnable { ServerSocket ss; static URL url1; static URL url2; static boolean flag = false; /* * Our "http" server to return a 404 */ public void run() { try { Socket s = ss.accept(); // check request contains "Cookie" InputStream is = s.getInputStream (); BufferedReader r = new BufferedReader(new InputStreamReader(is)); boolean flag = false; String x; while ((x=r.readLine()) != null) { if (x.length() ==0) { break; } } PrintStream out = new PrintStream( new BufferedOutputStream( s.getOutputStream() )); /* send file2.1 */ File file2 = new File("file2.1"); out.print("HTTP/1.1 200 OK\r\n"); out.print("Content-Type: text/html; charset=iso-8859-1\r\n"); out.print("Content-Length: "+file2.length()+"\r\n"); out.print("Connection: close\r\n"); out.print("\r\n"); FileInputStream fis = new FileInputStream(file2); byte[] buf = new byte[(int)file2.length()]; int len; while ((len = fis.read(buf)) != -1) { out.print(new String(buf)); } out.flush(); s.close(); ss.close(); } catch (Exception e) { e.printStackTrace(); } } ResponseCacheHandlerTest() throws Exception { /* start the server */ ss = new ServerSocket(0); (new Thread(this)).start(); /* establish http connection to server */ url1 = new URL("http://localhost/file1.cache"); HttpURLConnection http = (HttpURLConnection)url1.openConnection(); InputStream is = null; System.out.println("headers1:"+http.getHeaderFields()); try { is = http.getInputStream(); } catch (IOException ioex) { throw new RuntimeException(ioex.getMessage()); } BufferedReader r = new BufferedReader(new InputStreamReader(is)); String x; File fileout = new File("file1"); PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream(fileout))); while ((x=r.readLine()) != null) { out.print(x+"\n"); } out.flush(); out.close(); // if !(file1.out == file1.cache) // throw new RuntimeException("testing ResponseCacheHandler.get() failed"); http.disconnect(); // testing ResponseCacheHandler.put() url2 = new URL("http://localhost:" + Integer.toString(ss.getLocalPort())+"/file2.1"); http = (HttpURLConnection)url2.openConnection(); System.out.println("headers2:"+http.getHeaderFields()); try { is = http.getInputStream(); } catch (IOException ioex) { throw new RuntimeException(ioex.getMessage()); } DataInputStream dis = new DataInputStream(is); fileout = new File("file2.2"); byte[] buf = new byte[(int)new File("file2.1").length()]; DataOutputStream dos = new DataOutputStream(new FileOutputStream(fileout)); int len; while ((len=dis.read(buf)) != -1) { dos.write(buf, 0, len); } dos.flush(); dos.close(); // if !(file2.1 == file2.2 == file2.cache) // throw new RuntimeException("testing ResponseCacheHandler.put() failed"); } public static void main(String args[]) throws Exception { ResponseCacheHandler.setDefault(new MyResponseCacheHandler()); new ResponseCacheHandlerTest(); } static class MyResponseCacheHandler extends ResponseCacheHandler { public Response get(URI uri, Map requestHeaders) throws IOException { if (uri.equals(ParseUtil.toURI(url1))) { return new MyResponse("file1.cache"); } if (uri.equals(ParseUtil.toURI(url2)) && !flag) { flag = true; return null; } else { return new MyResponse("file2.cache"); } } public boolean put(URI uri, Response response) throws IOException { // save cache to file2.cache // 1. serialize headers into file2.cache // 2. write data to file2.cache File file = new File("file2.cache"); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(response.getHeaders()); ReadableByteChannel rbc = response.getBody(); int len = (int)new File("file2.1").length(); ByteBuffer buf = ByteBuffer.allocate(len); byte[] b = new byte[len]; while ((len = rbc.read(buf)) != -1) { buf.flip(); buf.get(b, 0, len); buf.compact(); oos.write(b, 0, len); } oos.close(); return true; } } static class MyResponse extends Response { FileInputStream fis; Map headers; public MyResponse(String filename) { try { fis = new FileInputStream(new File(filename)); headers = (Map)new ObjectInputStream(fis).readObject(); } catch (Exception ex) { throw new RuntimeException(ex.getMessage()); } } public ReadableByteChannel getBody() throws IOException { return fis.getChannel(); } public Map getHeaders() throws IOException { return headers; } } }