blob: 428de11adaa6bbf21e59db4908df028e401bb87f [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/* @test
2 * @summary Unit test for java.net.ResponseCacheHandler
3 * @bug 4837267
4 * @author Yingxian Wang
5 */
6
7import java.net.*;
8import java.util.*;
9import java.io.*;
10import java.nio.*;
11import java.nio.channels.ReadableByteChannel;
12import sun.net.www.ParseUtil;
13
14/**
15 * Request should get serviced by the cache handler. Response get
16 * saved through the cache handler.
17 */
18public class ResponseCacheHandlerTest implements Runnable {
19 ServerSocket ss;
20 static URL url1;
21 static URL url2;
22 static boolean flag = false;
23 /*
24 * Our "http" server to return a 404 */
25 public void run() {
26 try {
27 Socket s = ss.accept();
28
29 // check request contains "Cookie"
30 InputStream is = s.getInputStream ();
31 BufferedReader r = new BufferedReader(new InputStreamReader(is));
32 boolean flag = false;
33 String x;
34 while ((x=r.readLine()) != null) {
35 if (x.length() ==0) {
36 break;
37 }
38 }
39 PrintStream out = new PrintStream(
40 new BufferedOutputStream(
41 s.getOutputStream() ));
42
43 /* send file2.1 */
44 File file2 = new File("file2.1");
45 out.print("HTTP/1.1 200 OK\r\n");
46 out.print("Content-Type: text/html; charset=iso-8859-1\r\n");
47 out.print("Content-Length: "+file2.length()+"\r\n");
48 out.print("Connection: close\r\n");
49 out.print("\r\n");
50 FileInputStream fis = new FileInputStream(file2);
51 byte[] buf = new byte[(int)file2.length()];
52 int len;
53 while ((len = fis.read(buf)) != -1) {
54 out.print(new String(buf));
55 }
56
57 out.flush();
58
59 s.close();
60 ss.close();
61 } catch (Exception e) {
62 e.printStackTrace();
63 }
64 }
65
66 ResponseCacheHandlerTest() throws Exception {
67 /* start the server */
68 ss = new ServerSocket(0);
69 (new Thread(this)).start();
70
71 /* establish http connection to server */
72 url1 = new URL("http://localhost/file1.cache");
73 HttpURLConnection http = (HttpURLConnection)url1.openConnection();
74 InputStream is = null;
75 System.out.println("headers1:"+http.getHeaderFields());
76 try {
77 is = http.getInputStream();
78 } catch (IOException ioex) {
79 throw new RuntimeException(ioex.getMessage());
80 }
81 BufferedReader r = new BufferedReader(new InputStreamReader(is));
82 String x;
83 File fileout = new File("file1");
84 PrintStream out = new PrintStream(
85 new BufferedOutputStream(
86 new FileOutputStream(fileout)));
87 while ((x=r.readLine()) != null) {
88 out.print(x+"\n");
89 }
90 out.flush();
91 out.close();
92
93 // if !(file1.out == file1.cache)
94 // throw new RuntimeException("testing ResponseCacheHandler.get() failed");
95 http.disconnect();
96
97 // testing ResponseCacheHandler.put()
98 url2 = new URL("http://localhost:" +
99 Integer.toString(ss.getLocalPort())+"/file2.1");
100 http = (HttpURLConnection)url2.openConnection();
101 System.out.println("headers2:"+http.getHeaderFields());
102
103 try {
104 is = http.getInputStream();
105 } catch (IOException ioex) {
106 throw new RuntimeException(ioex.getMessage());
107 }
108 DataInputStream dis = new DataInputStream(is);
109 fileout = new File("file2.2");
110 byte[] buf = new byte[(int)new File("file2.1").length()];
111 DataOutputStream dos = new DataOutputStream(new FileOutputStream(fileout));
112 int len;
113 while ((len=dis.read(buf)) != -1) {
114 dos.write(buf, 0, len);
115 }
116 dos.flush();
117 dos.close();
118
119 // if !(file2.1 == file2.2 == file2.cache)
120 // throw new RuntimeException("testing ResponseCacheHandler.put() failed");
121 }
122 public static void main(String args[]) throws Exception {
123 ResponseCacheHandler.setDefault(new MyResponseCacheHandler());
124
125 new ResponseCacheHandlerTest();
126 }
127
128 static class MyResponseCacheHandler extends ResponseCacheHandler {
129 public Response
130 get(URI uri, Map requestHeaders)
131 throws IOException {
132 if (uri.equals(ParseUtil.toURI(url1))) {
133 return new MyResponse("file1.cache");
134 } if (uri.equals(ParseUtil.toURI(url2)) && !flag) {
135 flag = true;
136 return null;
137 } else {
138 return new MyResponse("file2.cache");
139 }
140 }
141 public boolean put(URI uri, Response response) throws IOException {
142 // save cache to file2.cache
143 // 1. serialize headers into file2.cache
144 // 2. write data to file2.cache
145 File file = new File("file2.cache");
146 FileOutputStream fos = new FileOutputStream(file);
147 ObjectOutputStream oos = new ObjectOutputStream(fos);
148 oos.writeObject(response.getHeaders());
149
150 ReadableByteChannel rbc = response.getBody();
151 int len = (int)new File("file2.1").length();
152 ByteBuffer buf = ByteBuffer.allocate(len);
153 byte[] b = new byte[len];
154 while ((len = rbc.read(buf)) != -1) {
155 buf.flip();
156 buf.get(b, 0, len);
157 buf.compact();
158 oos.write(b, 0, len);
159 }
160 oos.close();
161 return true;
162 }
163 }
164
165 static class MyResponse extends Response {
166 FileInputStream fis;
167 Map headers;
168 public MyResponse(String filename) {
169 try {
170 fis = new FileInputStream(new File(filename));
171 headers = (Map)new ObjectInputStream(fis).readObject();
172 } catch (Exception ex) {
173 throw new RuntimeException(ex.getMessage());
174 }
175 }
176 public ReadableByteChannel getBody() throws IOException {
177 return fis.getChannel();
178 }
179
180 public Map getHeaders() throws IOException {
181 return headers;
182 }
183 }
184}