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 ; 11 import java.io.InputStream ; 12 import java.io.OutputStream ; 13 import java.util.zip.GZIPOutputStream ; 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 { 23 String 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 { 40 request.respondWith(new ResponseHandler() { 41 public void respond(Response response) throws Exception { 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 output; 52 53 public CompressingResponse(Response response) { 54 super(response); 55 response.setHeader("Content-Encoding", "gzip"); 56 } 57 58 public OutputStream writeBody() throws IOException { 59 return output = new GZIPOutputStream (response.writeBody()); 60 } 61 62 public void writeBodyFrom(InputStream in) throws IOException { 63 copy(in, writeBody()); 64 } 65 66 public void finishCompression() throws IOException { 67 if (output != null) { 68 output.finish(); 69 } 70 } 71 } 72 73 private static void copy(InputStream input, OutputStream output) throws IOException { 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 |