| /* @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; |
| } |
| } |
| } |