diff options
author | Greg Wilkins | 2012-09-05 23:12:31 +0000 |
---|---|---|
committer | Greg Wilkins | 2012-09-05 23:12:31 +0000 |
commit | 0b3865d74913af1caf8f7cfcb178cf95ba481211 (patch) | |
tree | 4cbc888d75bd082ee271550fc05cb21d54273e1d /jetty-server/src/main/java | |
parent | 2b1532d839f2c7ddc43dac8890ff424ae2a0bb59 (diff) | |
download | org.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')
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; + +} |