netty5/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java

99 lines
3.2 KiB
Java
Raw Normal View History

/*
* Copyright 2009 Red Hat, Inc.
*
* Red Hat licenses this file to you under the Apache License, version 2.0
* (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.jboss.netty.handler.codec.http;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineCoverage;
import org.jboss.netty.handler.codec.compression.ZlibEncoder;
import org.jboss.netty.handler.codec.compression.ZlibWrapper;
import org.jboss.netty.handler.codec.embedder.EncoderEmbedder;
/**
* Decompresses an {@link HttpMessage} and an {@link HttpChunk} compressed in
* {@code gzip} or {@code deflate} encoding. Insert this handler after
* {@link HttpMessageDecoder} in the {@link ChannelPipeline}:
* <pre>
* ChannelPipeline p = ...;
* ...
* p.addLast("decoder", new HttpRequestDecoder());
* p.addLast("inflater", <b>new HttpContentDecomperssor()</b>);
* ...
* p.addLast("encoder", new HttpResponseEncoder());
* p.addLast("handler", new HttpRequestHandler());
* </pre>
*
* @author The Netty Project (netty-dev@lists.jboss.org)
2009-11-03 07:49:47 +01:00
* @author Trustin Lee (trustin@gmail.com)
* @version $Rev$, $Date$
*/
@ChannelPipelineCoverage("one")
public class HttpContentCompressor extends HttpContentEncoder {
private final int compressionLevel;
public HttpContentCompressor() {
this(6);
}
public HttpContentCompressor(int compressionLevel) {
if (compressionLevel < 0 || compressionLevel > 9) {
throw new IllegalArgumentException(
"compressionLevel: " + compressionLevel +
" (expected: 0-9)");
}
this.compressionLevel = compressionLevel;
}
@Override
protected EncoderEmbedder<ChannelBuffer> newContentEncoder(String acceptEncoding) throws Exception {
ZlibWrapper wrapper = determineWrapper(acceptEncoding);
if (wrapper == null) {
return null;
}
return new EncoderEmbedder<ChannelBuffer>(new ZlibEncoder(wrapper, compressionLevel));
}
@Override
protected String getTargetContentEncoding(String acceptEncoding) throws Exception {
ZlibWrapper wrapper = determineWrapper(acceptEncoding);
if (wrapper == null) {
return null;
}
switch (wrapper) {
case GZIP:
return "gzip";
case ZLIB:
return "deflate";
default:
throw new Error();
}
}
private ZlibWrapper determineWrapper(String acceptEncoding) {
// FIXME: Use the Q value.
if (acceptEncoding.indexOf("gzip") >= 0) {
return ZlibWrapper.GZIP;
}
if (acceptEncoding.indexOf("deflate") >= 0) {
return ZlibWrapper.ZLIB;
}
return null;
}
}