ResponseCacheTest.java revision 2612:58f325ba3e27
1/*
2 * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/* @test
25 * @summary Unit test for java.net.ResponseCache
26 * @bug 4837267
27 * @author Yingxian Wang
28 */
29
30import java.net.*;
31import java.util.*;
32import java.io.*;
33import sun.net.www.ParseUtil;
34import javax.net.ssl.*;
35
36/**
37 * Request should get serviced by the cache handler. Response get
38 * saved through the cache handler.
39 */
40public class ResponseCacheTest implements Runnable {
41    ServerSocket ss;
42    static URL url1;
43    static URL url2;
44    static String FNPrefix, OutFNPrefix;
45    static List<Closeable> streams = new ArrayList<>();
46    static List<File> files = new ArrayList<>();
47
48    /*
49     * Our "http" server to return a 404 */
50    public void run() {
51        Socket s = null;
52        FileInputStream fis = null;
53        try {
54            s = ss.accept();
55
56            InputStream is = s.getInputStream ();
57            BufferedReader r = new BufferedReader(new InputStreamReader(is));
58            String x;
59            while ((x=r.readLine()) != null) {
60                if (x.length() ==0) {
61                    break;
62                }
63            }
64            PrintStream out = new PrintStream(
65                                 new BufferedOutputStream(
66                                    s.getOutputStream() ));
67
68            /* send file2.1 */
69            File file2 = new File(FNPrefix+"file2.1");
70            out.print("HTTP/1.1 200 OK\r\n");
71            out.print("Content-Type: text/html; charset=iso-8859-1\r\n");
72            out.print("Content-Length: "+file2.length()+"\r\n");
73            out.print("Connection: close\r\n");
74            out.print("\r\n");
75            fis = new FileInputStream(file2);
76            byte[] buf = new byte[(int)file2.length()];
77            int len;
78            while ((len = fis.read(buf)) != -1) {
79                out.print(new String(buf));
80            }
81
82            out.flush();
83
84            s.close();
85            ss.close();
86        } catch (Exception e) {
87            e.printStackTrace();
88        } finally {
89            try { ss.close(); } catch (IOException unused) {}
90            try { s.close(); } catch (IOException unused) {}
91            try { fis.close(); } catch (IOException unused) {}
92        }
93    }
94static class NameVerifier implements HostnameVerifier {
95        public boolean verify(String hostname, SSLSession session) {
96            return true;
97        }
98    }
99    ResponseCacheTest() throws Exception {
100        /* start the server */
101        ss = new ServerSocket(0);
102        (new Thread(this)).start();
103        /* establish http connection to server */
104        url1 = new URL("http://localhost/file1.cache");
105        HttpURLConnection http = (HttpURLConnection)url1.openConnection();
106        InputStream is = null;
107        System.out.println("request headers: "+http.getRequestProperties());
108        System.out.println("responsecode is :"+http.getResponseCode());
109        Map<String,List<String>> headers1 = http.getHeaderFields();
110        try {
111            is = http.getInputStream();
112        } catch (IOException ioex) {
113            throw new RuntimeException(ioex.getMessage());
114        }
115        BufferedReader r = new BufferedReader(new InputStreamReader(is));
116        String x;
117        File fileout = new File(OutFNPrefix+"file1");
118        PrintStream out = new PrintStream(
119                                 new BufferedOutputStream(
120                                    new FileOutputStream(fileout)));
121        while ((x=r.readLine()) != null) {
122            out.print(x+"\n");
123        }
124        out.flush();
125        out.close();
126
127        http.disconnect();
128
129        // testing ResponseCacheHandler.put()
130        url2 = new URL("http://localhost:" +
131                       Integer.toString(ss.getLocalPort())+"/file2.1");
132        http = (HttpURLConnection)url2.openConnection();
133        System.out.println("responsecode2 is :"+http.getResponseCode());
134        Map<String,List<String>> headers2 = http.getHeaderFields();
135
136        try {
137            is = http.getInputStream();
138        } catch (IOException ioex) {
139            throw new RuntimeException(ioex.getMessage());
140        }
141        r = new BufferedReader(new InputStreamReader(is));
142        fileout = new File(OutFNPrefix+"file2.2");
143        out = new PrintStream(
144                                 new BufferedOutputStream(
145                                    new FileOutputStream(fileout)));
146        while ((x=r.readLine()) != null) {
147            out.print(x+"\n");
148        }
149        out.flush();
150        out.close();
151
152        // assert (headers1 == headers2 && file1 == file2.2)
153        File file1 = new File(OutFNPrefix+"file1");
154        File file2 = new File(OutFNPrefix+"file2.2");
155        files.add(file1);
156        files.add(file2);
157        System.out.println("headers1"+headers1+"\nheaders2="+headers2);
158        if (!headers1.equals(headers2) || file1.length() != file2.length()) {
159            throw new RuntimeException("test failed");
160        }
161    }
162
163    public static void main(String args[]) throws Exception {
164        try {
165            ResponseCache.setDefault(new MyResponseCache());
166            FNPrefix = System.getProperty("test.src", ".")+"/";
167            OutFNPrefix = System.getProperty("test.scratch", ".")+"/";
168            new ResponseCacheTest();
169        } finally{
170            ResponseCache.setDefault(null);
171            for (Closeable c: streams) {
172                try { c.close(); } catch (IOException unused) {}
173            }
174            for (File f: files) {
175                f.delete();
176            }
177        }
178    }
179
180    static class MyResponseCache extends ResponseCache {
181        public CacheResponse
182        get(URI uri, String rqstMethod, Map<String,List<String>> rqstHeaders)
183            throws IOException {
184            if (uri.equals(ParseUtil.toURI(url1))) {
185                return new MyCacheResponse(FNPrefix+"file1.cache");
186            }
187            return null;
188        }
189
190        public CacheRequest put(URI uri, URLConnection conn)  throws IOException {
191            // save cache to file2.cache
192            // 1. serialize headers into file2.cache
193            // 2. write data to file2.cache
194            return new MyCacheRequest(OutFNPrefix+"file2.cache", conn.getHeaderFields());
195        }
196    }
197
198    static class MyCacheResponse extends CacheResponse {
199        FileInputStream fis;
200        Map<String,List<String>> headers;
201        public MyCacheResponse(String filename) {
202            try {
203                fis = new FileInputStream(new File(filename));
204                streams.add(fis);
205                ObjectInputStream ois = new ObjectInputStream(fis);
206                headers = (Map<String,List<String>>)ois.readObject();
207            } catch (Exception ex) {
208                // throw new RuntimeException(ex.getMessage());
209            }
210        }
211
212        public InputStream getBody() throws IOException {
213            return fis;
214        }
215
216        public Map<String,List<String>> getHeaders() throws IOException {
217            return headers;
218        }
219    }
220
221    static class MyCacheRequest extends CacheRequest {
222        FileOutputStream fos;
223        public MyCacheRequest(String filename, Map<String,List<String>> rspHeaders) {
224            try {
225                File file = new File(filename);
226                fos = new FileOutputStream(file);
227                streams.add(fos);
228                files.add(file);
229                ObjectOutputStream oos = new ObjectOutputStream(fos);
230                oos.writeObject(rspHeaders);
231            } catch (Exception ex) {
232                throw new RuntimeException(ex.getMessage());
233            }
234        }
235        public OutputStream getBody() throws IOException {
236            return fos;
237        }
238
239        public void abort() {
240            // no op
241        }
242    }
243
244
245}
246