Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2012-09-05 23:12:31 +0000
committerGreg Wilkins2012-09-05 23:12:31 +0000
commit0b3865d74913af1caf8f7cfcb178cf95ba481211 (patch)
tree4cbc888d75bd082ee271550fc05cb21d54273e1d /jetty-server/src/main/java
parent2b1532d839f2c7ddc43dac8890ff424ae2a0bb59 (diff)
downloadorg.eclipse.jetty.project-0b3865d74913af1caf8f7cfcb178cf95ba481211.tar.gz
org.eclipse.jetty.project-0b3865d74913af1caf8f7cfcb178cf95ba481211.tar.xz
org.eclipse.jetty.project-0b3865d74913af1caf8f7cfcb178cf95ba481211.zip
jetty-9 removed unused schedulers
Diffstat (limited to 'jetty-server/src/main/java')
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/gzip/AbstractCompressedStream.java348
-rw-r--r--jetty-server/src/main/java/org/eclipse/jetty/server/gzip/CompressedResponseWrapper.java415
2 files changed, 763 insertions, 0 deletions
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/gzip/AbstractCompressedStream.java b/jetty-server/src/main/java/org/eclipse/jetty/server/gzip/AbstractCompressedStream.java
new file mode 100644
index 0000000000..2d4831f2ad
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/gzip/AbstractCompressedStream.java
@@ -0,0 +1,348 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2012 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.http.gzip;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.zip.DeflaterOutputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.util.ByteArrayOutputStream2;
+
+/* ------------------------------------------------------------ */
+/**
+ * Skeletal implementation of a CompressedStream. This class adds compression features to a ServletOutputStream and takes care of setting response headers, etc.
+ * Major work and configuration is done here. Subclasses using different kinds of compression only have to implement the abstract methods doCompress() and
+ * setContentEncoding() using the desired compression and setting the appropriate Content-Encoding header string.
+ */
+public abstract class AbstractCompressedStream extends ServletOutputStream
+{
+ private final String _encoding;
+ protected HttpServletRequest _request;
+ protected HttpServletResponse _response;
+ protected OutputStream _out;
+ protected ByteArrayOutputStream2 _bOut;
+ protected DeflaterOutputStream _compressedOutputStream;
+ protected boolean _closed;
+ protected int _bufferSize;
+ protected int _minCompressSize;
+ protected long _contentLength;
+ protected boolean _doNotCompress;
+
+ /**
+ * Instantiates a new compressed stream.
+ *
+ * @param request
+ * the request
+ * @param response
+ * the response
+ * @param contentLength
+ * the content length
+ * @param bufferSize
+ * the buffer size
+ * @param minCompressSize
+ * the min compress size
+ * @throws IOException
+ * Signals that an I/O exception has occurred.
+ */
+ public AbstractCompressedStream(String encoding,HttpServletRequest request, HttpServletResponse response, long contentLength, int bufferSize, int minCompressSize)
+ throws IOException
+ {
+ _encoding=encoding;
+ _request = request;
+ _response = response;
+ _contentLength = contentLength;
+ _bufferSize = bufferSize;
+ _minCompressSize = minCompressSize;
+ if (minCompressSize == 0)
+ doCompress();
+ }
+
+ /**
+ * Reset buffer.
+ */
+ public void resetBuffer()
+ {
+ if (_response.isCommitted())
+ throw new IllegalStateException("Committed");
+ _closed = false;
+ _out = null;
+ _bOut = null;
+ if (_compressedOutputStream != null)
+ _response.setHeader("Content-Encoding",null);
+ _compressedOutputStream = null;
+ _doNotCompress = false;
+ }
+
+ /**
+ * Sets the content length.
+ *
+ * @param length
+ * the new content length
+ */
+ public void setContentLength(long length)
+ {
+ _contentLength = length;
+ if (_doNotCompress && length >= 0)
+ {
+ if (_contentLength < Integer.MAX_VALUE)
+ _response.setContentLength((int)_contentLength);
+ else
+ _response.setHeader("Content-Length",Long.toString(_contentLength));
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see java.io.OutputStream#flush()
+ */
+ @Override
+ public void flush() throws IOException
+ {
+ if (_out == null || _bOut != null)
+ {
+ if (_contentLength > 0 && _contentLength < _minCompressSize)
+ doNotCompress();
+ else
+ doCompress();
+ }
+
+ _out.flush();
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see java.io.OutputStream#close()
+ */
+ @Override
+ public void close() throws IOException
+ {
+ if (_closed)
+ return;
+
+ if (_request.getAttribute("javax.servlet.include.request_uri") != null)
+ flush();
+ else
+ {
+ if (_bOut != null)
+ {
+ if (_contentLength < 0)
+ _contentLength = _bOut.getCount();
+ if (_contentLength < _minCompressSize)
+ doNotCompress();
+ else
+ doCompress();
+ }
+ else if (_out == null)
+ {
+ doNotCompress();
+ }
+
+ if (_compressedOutputStream != null)
+ _compressedOutputStream.close();
+ else
+ _out.close();
+ _closed = true;
+ }
+ }
+
+ /**
+ * Finish.
+ *
+ * @throws IOException
+ * Signals that an I/O exception has occurred.
+ */
+ public void finish() throws IOException
+ {
+ if (!_closed)
+ {
+ if (_out == null || _bOut != null)
+ {
+ if (_contentLength > 0 && _contentLength < _minCompressSize)
+ doNotCompress();
+ else
+ doCompress();
+ }
+
+ if (_compressedOutputStream != null && !_closed)
+ {
+ _closed = true;
+ _compressedOutputStream.close();
+ }
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see java.io.OutputStream#write(int)
+ */
+ @Override
+ public void write(int b) throws IOException
+ {
+ checkOut(1);
+ _out.write(b);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see java.io.OutputStream#write(byte[])
+ */
+ @Override
+ public void write(byte b[]) throws IOException
+ {
+ checkOut(b.length);
+ _out.write(b);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see java.io.OutputStream#write(byte[], int, int)
+ */
+ @Override
+ public void write(byte b[], int off, int len) throws IOException
+ {
+ checkOut(len);
+ _out.write(b,off,len);
+ }
+
+ /**
+ * Do compress.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public void doCompress() throws IOException
+ {
+ if (_compressedOutputStream==null)
+ {
+ if (_response.isCommitted())
+ throw new IllegalStateException();
+
+ setHeader("Content-Encoding", _encoding);
+ if (_response.containsHeader("Content-Encoding"))
+ {
+ _out=_compressedOutputStream=createStream();
+
+ if (_bOut!=null)
+ {
+ _out.write(_bOut.getBuf(),0,_bOut.getCount());
+ _bOut=null;
+ }
+ }
+ else
+ doNotCompress();
+ }
+ }
+
+ /**
+ * Do not compress.
+ *
+ * @throws IOException
+ * Signals that an I/O exception has occurred.
+ */
+ public void doNotCompress() throws IOException
+ {
+ if (_compressedOutputStream != null)
+ throw new IllegalStateException("Compressed output stream is already assigned.");
+ if (_out == null || _bOut != null)
+ {
+ _doNotCompress = true;
+
+ _out = _response.getOutputStream();
+ setContentLength(_contentLength);
+
+ if (_bOut != null)
+ _out.write(_bOut.getBuf(),0,_bOut.getCount());
+ _bOut = null;
+ }
+ }
+
+ /**
+ * Check out.
+ *
+ * @param length
+ * the length
+ * @throws IOException
+ * Signals that an I/O exception has occurred.
+ */
+ private void checkOut(int length) throws IOException
+ {
+ if (_closed)
+ throw new IOException("CLOSED");
+
+ if (_out == null)
+ {
+ if (_response.isCommitted() || (_contentLength >= 0 && _contentLength < _minCompressSize))
+ doNotCompress();
+ else if (length > _minCompressSize)
+ doCompress();
+ else
+ _out = _bOut = new ByteArrayOutputStream2(_bufferSize);
+ }
+ else if (_bOut != null)
+ {
+ if (_response.isCommitted() || (_contentLength >= 0 && _contentLength < _minCompressSize))
+ doNotCompress();
+ else if (length >= (_bOut.getBuf().length - _bOut.getCount()))
+ doCompress();
+ }
+ }
+
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedStream#getOutputStream()
+ */
+ public OutputStream getOutputStream()
+ {
+ return _out;
+ }
+
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedStream#isClosed()
+ */
+ public boolean isClosed()
+ {
+ return _closed;
+ }
+
+ /**
+ * Allows derived implementations to replace PrintWriter implementation.
+ */
+ protected PrintWriter newWriter(OutputStream out, String encoding) throws UnsupportedEncodingException
+ {
+ return encoding == null?new PrintWriter(out):new PrintWriter(new OutputStreamWriter(out,encoding));
+ }
+
+ protected void setHeader(String name,String value)
+ {
+ _response.setHeader(name, value);
+ }
+
+ /**
+ * Create the stream fitting to the underlying compression type.
+ *
+ * @throws IOException
+ * Signals that an I/O exception has occurred.
+ */
+ protected abstract DeflaterOutputStream createStream() throws IOException;
+
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/gzip/CompressedResponseWrapper.java b/jetty-server/src/main/java/org/eclipse/jetty/server/gzip/CompressedResponseWrapper.java
new file mode 100644
index 0000000000..6557f78a51
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/gzip/CompressedResponseWrapper.java
@@ -0,0 +1,415 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2012 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.http.gzip;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.Set;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+import org.eclipse.jetty.util.StringUtil;
+
+/*------------------------------------------------------------ */
+/**
+ */
+public abstract class CompressedResponseWrapper extends HttpServletResponseWrapper
+{
+
+ public static final int DEFAULT_BUFFER_SIZE = 8192;
+ public static final int DEFAULT_MIN_COMPRESS_SIZE = 256;
+
+ private Set<String> _mimeTypes;
+ private int _bufferSize=DEFAULT_BUFFER_SIZE;
+ private int _minCompressSize=DEFAULT_MIN_COMPRESS_SIZE;
+ protected HttpServletRequest _request;
+
+ private PrintWriter _writer;
+ private AbstractCompressedStream _compressedStream;
+ private long _contentLength=-1;
+ private boolean _noCompression;
+
+ public CompressedResponseWrapper(HttpServletRequest request, HttpServletResponse response)
+ {
+ super(response);
+ _request = request;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setMimeTypes(java.util.Set)
+ */
+ public void setMimeTypes(Set<String> mimeTypes)
+ {
+ _mimeTypes = mimeTypes;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setBufferSize(int)
+ */
+ @Override
+ public void setBufferSize(int bufferSize)
+ {
+ _bufferSize = bufferSize;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setMinCompressSize(int)
+ */
+ public void setMinCompressSize(int minCompressSize)
+ {
+ _minCompressSize = minCompressSize;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setContentType(java.lang.String)
+ */
+ @Override
+ public void setContentType(String ct)
+ {
+ super.setContentType(ct);
+
+ if (ct!=null)
+ {
+ int colon=ct.indexOf(";");
+ if (colon>0)
+ ct=ct.substring(0,colon);
+ }
+
+ if ((_compressedStream==null || _compressedStream.getOutputStream()==null) &&
+ (_mimeTypes==null && ct!=null && ct.contains("gzip") ||
+ _mimeTypes!=null && (ct==null||!_mimeTypes.contains(StringUtil.asciiToLowerCase(ct)))))
+ {
+ noCompression();
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setStatus(int, java.lang.String)
+ */
+ @Override
+ public void setStatus(int sc, String sm)
+ {
+ super.setStatus(sc,sm);
+ if (sc<200 || sc==204 || sc==205 || sc>=300)
+ noCompression();
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setStatus(int)
+ */
+ @Override
+ public void setStatus(int sc)
+ {
+ super.setStatus(sc);
+ if (sc<200 || sc==204 || sc==205 || sc>=300)
+ noCompression();
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setContentLength(int)
+ */
+ @Override
+ public void setContentLength(int length)
+ {
+ setContentLength((long)length);
+ }
+
+ /* ------------------------------------------------------------ */
+ protected void setContentLength(long length)
+ {
+ _contentLength=length;
+ if (_compressedStream!=null)
+ _compressedStream.setContentLength(length);
+ else if (_noCompression && _contentLength>=0)
+ {
+ HttpServletResponse response = (HttpServletResponse)getResponse();
+ if(_contentLength<Integer.MAX_VALUE)
+ {
+ response.setContentLength((int)_contentLength);
+ }
+ else
+ {
+ response.setHeader("Content-Length", Long.toString(_contentLength));
+ }
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#addHeader(java.lang.String, java.lang.String)
+ */
+ @Override
+ public void addHeader(String name, String value)
+ {
+ if ("content-length".equalsIgnoreCase(name))
+ {
+ _contentLength=Long.parseLong(value);
+ if (_compressedStream!=null)
+ _compressedStream.setContentLength(_contentLength);
+ }
+ else if ("content-type".equalsIgnoreCase(name))
+ {
+ setContentType(value);
+ }
+ else if ("content-encoding".equalsIgnoreCase(name))
+ {
+ super.addHeader(name,value);
+ if (!isCommitted())
+ {
+ noCompression();
+ }
+ }
+ else
+ super.addHeader(name,value);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#flushBuffer()
+ */
+ @Override
+ public void flushBuffer() throws IOException
+ {
+ if (_writer!=null)
+ _writer.flush();
+ if (_compressedStream!=null)
+ _compressedStream.finish();
+ else
+ getResponse().flushBuffer();
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#reset()
+ */
+ @Override
+ public void reset()
+ {
+ super.reset();
+ if (_compressedStream!=null)
+ _compressedStream.resetBuffer();
+ _writer=null;
+ _compressedStream=null;
+ _noCompression=false;
+ _contentLength=-1;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#resetBuffer()
+ */
+ @Override
+ public void resetBuffer()
+ {
+ super.resetBuffer();
+ if (_compressedStream!=null)
+ _compressedStream.resetBuffer();
+ _writer=null;
+ _compressedStream=null;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#sendError(int, java.lang.String)
+ */
+ @Override
+ public void sendError(int sc, String msg) throws IOException
+ {
+ resetBuffer();
+ super.sendError(sc,msg);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#sendError(int)
+ */
+ @Override
+ public void sendError(int sc) throws IOException
+ {
+ resetBuffer();
+ super.sendError(sc);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#sendRedirect(java.lang.String)
+ */
+ @Override
+ public void sendRedirect(String location) throws IOException
+ {
+ resetBuffer();
+ super.sendRedirect(location);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#noCompression()
+ */
+ public void noCompression()
+ {
+ _noCompression=true;
+ if (_compressedStream!=null)
+ {
+ try
+ {
+ _compressedStream.doNotCompress();
+ }
+ catch (IOException e)
+ {
+ throw new IllegalStateException(e);
+ }
+ }
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#finish()
+ */
+ public void finish() throws IOException
+ {
+ if (_writer!=null && !_compressedStream.isClosed())
+ _writer.flush();
+ if (_compressedStream!=null)
+ _compressedStream.finish();
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setHeader(java.lang.String, java.lang.String)
+ */
+ @Override
+ public void setHeader(String name, String value)
+ {
+ if ("content-length".equalsIgnoreCase(name))
+ {
+ setContentLength(Long.parseLong(value));
+ }
+ else if ("content-type".equalsIgnoreCase(name))
+ {
+ setContentType(value);
+ }
+ else if ("content-encoding".equalsIgnoreCase(name))
+ {
+ super.setHeader(name,value);
+ if (!isCommitted())
+ {
+ noCompression();
+ }
+ }
+ else
+ super.setHeader(name,value);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#getOutputStream()
+ */
+ @Override
+ public ServletOutputStream getOutputStream() throws IOException
+ {
+ if (_compressedStream==null)
+ {
+ if (getResponse().isCommitted() || _noCompression)
+ {
+ setContentLength(_contentLength);
+ return getResponse().getOutputStream();
+ }
+
+ _compressedStream=newCompressedStream(_request,(HttpServletResponse)getResponse(),_contentLength,_bufferSize,_minCompressSize);
+ }
+ else if (_writer!=null)
+ throw new IllegalStateException("getWriter() called");
+
+ return _compressedStream;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#getWriter()
+ */
+ @Override
+ public PrintWriter getWriter() throws IOException
+ {
+ if (_writer==null)
+ {
+ if (_compressedStream!=null)
+ throw new IllegalStateException("getOutputStream() called");
+
+ if (getResponse().isCommitted() || _noCompression)
+ {
+ setContentLength(_contentLength);
+ return getResponse().getWriter();
+ }
+
+ _compressedStream=newCompressedStream(_request,(HttpServletResponse)getResponse(),_contentLength,_bufferSize,_minCompressSize);
+ _writer=newWriter(_compressedStream,getCharacterEncoding());
+ }
+ return _writer;
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * @see org.eclipse.jetty.http.gzip.CompressedResponseWrapper#setIntHeader(java.lang.String, int)
+ */
+ @Override
+ public void setIntHeader(String name, int value)
+ {
+ if ("content-length".equalsIgnoreCase(name))
+ {
+ _contentLength=value;
+ if (_compressedStream!=null)
+ _compressedStream.setContentLength(_contentLength);
+ }
+ else
+ super.setIntHeader(name,value);
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ * Allows derived implementations to replace PrintWriter implementation.
+ *
+ * @param out the out
+ * @param encoding the encoding
+ * @return the prints the writer
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ protected PrintWriter newWriter(OutputStream out,String encoding) throws UnsupportedEncodingException
+ {
+ return encoding==null?new PrintWriter(out):new PrintWriter(new OutputStreamWriter(out,encoding));
+ }
+
+ /* ------------------------------------------------------------ */
+ /**
+ *@return the underlying CompressedStream implementation
+ */
+ protected abstract AbstractCompressedStream newCompressedStream(HttpServletRequest _request, HttpServletResponse response, long _contentLength2, int _bufferSize2, int _minCompressedSize2) throws IOException;
+
+}

Back to the top