blob: 0db1a427432df9bdc2865b3ec8c0856981de2dec [file] [log] [blame]
/*
* Copyright 2008 Netflix, Inc.
*
* Licensed 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 net.oauth.http;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import java.util.zip.InflaterInputStream;
/**
* A decorator that handles Content-Encoding.
* @hide
*/
public class HttpMessageDecoder extends HttpResponseMessage {
/**
* Decode the given message if necessary and possible.
*
* @return a decorator that decodes the body of the given message; or the
* given message if this class can't decode it.
*/
public static HttpResponseMessage decode(HttpResponseMessage message)
throws IOException {
if (message != null) {
String encoding = getEncoding(message);
if (encoding != null) {
return new HttpMessageDecoder(message, encoding);
}
}
return message;
}
public static final String GZIP = "gzip";
public static final String DEFLATE = "deflate";
public static final String ACCEPTED = GZIP + "," + DEFLATE;
private static String getEncoding(HttpMessage message) {
String encoding = message.getHeader(CONTENT_ENCODING);
if (encoding == null) {
// That's easy.
} else if (GZIP.equalsIgnoreCase(encoding)
|| ("x-" + GZIP).equalsIgnoreCase(encoding)) {
return GZIP;
} else if (DEFLATE.equalsIgnoreCase(encoding)) {
return DEFLATE;
}
return null;
}
private HttpMessageDecoder(HttpResponseMessage in, String encoding)
throws IOException {
super(in.method, in.url);
this.headers.addAll(in.headers);
removeHeaders(CONTENT_ENCODING); // handled here
removeHeaders(CONTENT_LENGTH); // unpredictable
InputStream body = in.getBody();
if (body != null) {
if (encoding == GZIP) {
body = new GZIPInputStream(body);
} else if (encoding == DEFLATE) {
body = new InflaterInputStream(body);
} else {
assert false;
}
}
this.body = body;
this.in = in;
}
private final HttpResponseMessage in;
@Override
public void dump(Map<String, Object> into) throws IOException {
in.dump(into);
}
@Override
public int getStatusCode() throws IOException {
return in.getStatusCode();
}
}