Because I have finer control of what I want to compress in the sitemap, and avoid duplicated buffers in order to calculate the content-length..
-------- David -----Mensaje original----- De: Jorg Heymans [mailto:[EMAIL PROTECTED] Enviado el: martes, 13 de enero de 2004 16:13 Para: [EMAIL PROTECTED] Asunto: Re: RE : Gzip pipeline processor Hi David, Looks interesting, could you also post some numbers along like cpu-usage and timing versus the non-gzipped case? Why did you choose this solution rather than sticking apache in front of tomcat ? Thanks Jorg Carmona Perez, David wrote: > Thanks Rasik. > > But my solution serves for any kind of output through Cocoon, not just for XML > output, both readers and generators > > After testing a litlle more, I will shortly make it available though the Wiki. > > I don't know why but now it works ok. > > -------- > David > > -----Mensaje original----- > De: Rasik Pandey [mailto:[EMAIL PROTECTED] > Enviado el: martes, 13 de enero de 2004 15:40 > Para: [EMAIL PROTECTED] > Asunto: RE : Gzip pipeline processor > > Maybe this would be useful: > http://wiki.cocoondev.org/Wiki.jsp?page=Gzip_XML_Serializer > > See the endDocument() method in the attached java class. > > > > >-----Message d'origine----- > >De : Carmona Perez, David [mailto:[EMAIL PROTECTED] > >Envoy� : mardi 13 janvier 2004 12:52 > >� : Cocoon (E-mail) > >Objet : Gzip pipeline processor > > > > > >Hi everybody, > > > >I've created a new ProcessingPipeline, in order to compress > >with gzip. I want finer control and integration with Cocoon > >that the standard servlet filters may offer. > > > >It works ok, but the problem I have with it, is that the > >browser is terribly slow when getting the different > >components of a page (images, CSS sheets, scripts, ...). > >Does someone know if there is any detail I have left off? > >I suspect of not flushing the ouput stream. Where is it > >flushed or closed? > > > >Any help will be greatly appreciated. > > > >Here is the full source code: > > > >/** Creado en 12-ene-2004 */ > >package fcc.ima.cocoon; > > > >import java.io.ByteArrayOutputStream; > >import java.io.IOException; > >import java.io.OutputStream; > >import java.net.SocketException; > >import java.util.Map; > >import java.util.zip.GZIPOutputStream; > > > >import org.apache.cocoon.ConnectionResetException; > >import org.apache.cocoon.ProcessingException; > >import > >org.apache.cocoon.components.pipeline.impl.NonCachingProcessin > >gPipeline; > >import org.apache.cocoon.environment.Environment; > >import org.apache.cocoon.environment.ObjectModelHelper; > >import org.apache.cocoon.environment.Request; > >import org.apache.cocoon.environment.Response; > > > >/**Pipeline that may compress the content with gzip. > > * @author dperezcar */ > >public class GzipNonCachingProcessingPipeline extends > >NonCachingProcessingPipeline { > > static protected class StreamHandler { > > protected OutputStream getStream(Environment > >environment, int outputBufferSize, boolean > >shouldSetContentLength) throws IOException { > > // Copy parameters > > this.environment = environment; > > > > OutputStream result; > > if (shouldSetContentLength) { > > bufferStream = new > >ByteArrayOutputStream(); > > if (shouldCompress()) { > > result = gs = new > >GZIPOutputStream(bufferStream); > > } else { > > result = bufferStream; > > } > > } else { > > if (shouldCompress()) { > > result = gs = new > >GZIPOutputStream(environment.getOutputStream(0)); > > } else { > > result = > >environment.getOutputStream(outputBufferSize); > > } > > } > > if (gs != null) { > > Response resp = > >ObjectModelHelper.getResponse(environment.getObjectModel()); > > > >resp.addHeader("Content-Encoding", "gzip"); > > } > > return result; > > } > > protected void end() throws IOException { > > if (gs != null) { > > gs.finish(); > > } > > if (bufferStream != null) { > > byte[] data = > >bufferStream.toByteArray(); > > > >environment.setContentLength(data.length); > > OutputStream out = > >environment.getOutputStream(0); > > out.write(data); > > out.flush(); > > out.close(); > > } else if (gs != null) { > > gs.flush(); > > gs.close(); > > } > > } > > protected boolean shouldCompress() { > > Map objModel = environment.getObjectModel(); > > Request req = > >ObjectModelHelper.getRequest(objModel); > > if (req != null) { > > String ae = > >req.getHeader("accept-encoding"); > > if (ae != null && > >ae.indexOf("gzip") != -1) { > > Response resp = > >ObjectModelHelper.getResponse(objModel); > > if (resp != null && > >!resp.containsHeader("content-encoding")) { > > > >//getLogger().debug("GZIP supported, compressing."); > > return true; > > } else { > > > >//getLogger().debug("Content-encoding already set."); > > } > > } > > } > > return false; > > } > > protected Environment environment; > > protected ByteArrayOutputStream bufferStream; > > protected GZIPOutputStream gs; > > } > > /** @see > >org.apache.cocoon.components.pipeline.AbstractProcessingPipeli > >ne#processReader(org.apache.cocoon.environment.Environment) */ > > protected boolean processReader(Environment > >environment) throws ProcessingException { > > try { > > getLogger().info("Ini reader"); > > StreamHandler sh = new StreamHandler(); > > > >reader.setOutputStream(sh.getStream(environment, > >outputBufferSize, reader.shouldSetContentLength())); > > reader.generate(); > > sh.end(); > > getLogger().info("End reader"); > > } catch ( SocketException se ) { > > if (se.getMessage().indexOf("reset") > 0 > > || > >se.getMessage().indexOf("aborted") > 0 > > || > >se.getMessage().indexOf("connection abort") > 0) { > > throw new > >ConnectionResetException("Connection reset by peer", se); > > } else { > > throw new > >ProcessingException("Failed to execute reader pipeline.", se); > > } > > } catch ( ProcessingException e ) { > > throw e; > > } catch ( Exception e ) { > > throw new ProcessingException("Error > >executing reader pipeline.",e); > > } > > return true; > > } > > > > /** @see > >org.apache.cocoon.components.pipeline.AbstractProcessingPipeli > >ne#processXMLPipeline(org.apache.cocoon.environment.Environment) */ > > protected boolean processXMLPipeline(Environment > >environment) throws ProcessingException { > > try { > > getLogger().info("Ini XML"); > > if (this.serializer != this.lastConsumer) { > > // internal processing > > this.generator.generate(); > > } else { > > StreamHandler sh = new StreamHandler(); > > > >serializer.setOutputStream(sh.getStream(environment, > >outputBufferSize, serializer.shouldSetContentLength())); > > // execute the pipeline: > > generator.generate(); > > sh.end(); > > } > > getLogger().info("End XML"); > > } catch ( ProcessingException e) { > > throw e; > > } catch ( Exception e ) { > > throw new ProcessingException("Failed > >to execute pipeline.", e); > > } > > return true; > > } > >} > > > > > > > >-------- > >David > > > > > >--------------------------------------------------------------------- > >To unsubscribe, e-mail: [EMAIL PROTECTED] > >For additional commands, e-mail: [EMAIL PROTECTED] > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
