KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > icesoft > faces > webapp > http > common > standard > CompressingServer


1 package com.icesoft.faces.webapp.http.common.standard;
2
3 import com.icesoft.faces.webapp.http.common.Request;
4 import com.icesoft.faces.webapp.http.common.RequestProxy;
5 import com.icesoft.faces.webapp.http.common.Response;
6 import com.icesoft.faces.webapp.http.common.ResponseHandler;
7 import com.icesoft.faces.webapp.http.common.ResponseProxy;
8 import com.icesoft.faces.webapp.http.common.Server;
9
10 import java.io.IOException JavaDoc;
11 import java.io.InputStream JavaDoc;
12 import java.io.OutputStream JavaDoc;
13 import java.util.zip.GZIPOutputStream JavaDoc;
14
15 public class CompressingServer implements Server {
16     private Server server;
17
18     public CompressingServer(Server server) {
19         this.server = server;
20     }
21
22     public void service(Request request) throws Exception JavaDoc {
23         String JavaDoc acceptEncodingHeader = request.getHeader("Accept-Encoding");
24         if (acceptEncodingHeader != null && (acceptEncodingHeader.indexOf("gzip") >= 0 || acceptEncodingHeader.indexOf("compress") >= 0)) {
25             server.service(new CompressingRequest(request));
26         } else {
27             server.service(request);
28         }
29     }
30
31     public void shutdown() {
32     }
33
34     private class CompressingRequest extends RequestProxy {
35         public CompressingRequest(Request request) {
36             super(request);
37         }
38
39         public void respondWith(final ResponseHandler handler) throws Exception JavaDoc {
40             request.respondWith(new ResponseHandler() {
41                 public void respond(Response response) throws Exception JavaDoc {
42                     CompressingResponse compressingResponse = new CompressingResponse(response);
43                     handler.respond(compressingResponse);
44                     compressingResponse.finishCompression();
45                 }
46             });
47         }
48     }
49
50     private class CompressingResponse extends ResponseProxy {
51         private GZIPOutputStream JavaDoc output;
52
53         public CompressingResponse(Response response) {
54             super(response);
55             response.setHeader("Content-Encoding", "gzip");
56         }
57
58         public OutputStream JavaDoc writeBody() throws IOException JavaDoc {
59             return output = new GZIPOutputStream JavaDoc(response.writeBody());
60         }
61
62         public void writeBodyFrom(InputStream JavaDoc in) throws IOException JavaDoc {
63             copy(in, writeBody());
64         }
65
66         public void finishCompression() throws IOException JavaDoc {
67             if (output != null) {
68                 output.finish();
69             }
70         }
71     }
72
73     private static void copy(InputStream JavaDoc input, OutputStream JavaDoc output) throws IOException JavaDoc {
74         byte[] buf = new byte[4096];
75         int len = 0;
76         while ((len = input.read(buf)) > -1) output.write(buf, 0, len);
77     }
78 }
79
Popular Tags