/*
* $Header: /home/data/cvs/rt/org.eclipse.ecf/tests/bundles/org.eclipse.ecf.tests.apache.httpclient.server/src/org/apache/commons/httpclient/server/SimpleResponse.java,v 1.1 2009/02/13 18:07:51 slewis Exp $
* $Revision: 1.1 $
* $Date: 2009/02/13 18:07:51 $
*
* ====================================================================
*
* Copyright 1999-2004 The Apache Software Foundation
*
* 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.httpclient.server;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import org.apache.commons.httpclient.ChunkedInputStream;
import org.apache.commons.httpclient.ContentLengthInputStream;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HeaderElement;
import org.apache.commons.httpclient.HeaderGroup;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.StatusLine;
/**
* A generic HTTP response.
*
* @author Christian Kohlschuetter
* @author Oleg Kalnichevski
*/
public class SimpleResponse {
public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1";
private HttpVersion ver = HttpVersion.HTTP_1_1;
private int statuscode = HttpStatus.SC_OK;
private String phrase = HttpStatus.getStatusText(HttpStatus.SC_OK);
private HeaderGroup headers = new HeaderGroup();
private InputStream entity = null;
public SimpleResponse() {
super();
}
public SimpleResponse(
final StatusLine statusline,
final Header[] headers,
final InputStream content)
throws IOException {
super();
if (statusline == null) {
throw new IllegalArgumentException("Status line may not be null");
}
setStatusLine(HttpVersion.parse(statusline.getHttpVersion()),
statusline.getStatusCode(), statusline.getReasonPhrase());
setHeaders(headers);
if (content != null) {
InputStream in = content;
Header contentLength = this.headers.getFirstHeader("Content-Length");
Header transferEncoding = this.headers.getFirstHeader("Transfer-Encoding");
if (transferEncoding != null) {
if (transferEncoding.getValue().indexOf("chunked") != -1) {
in = new ChunkedInputStream(in);
}
} else if (contentLength != null) {
long len = getContentLength();
if (len >= 0) {
in = new ContentLengthInputStream(in, len);
}
}
this.entity = in;
}
}
public void setStatusLine(final HttpVersion ver, int statuscode, final String phrase) {
if (ver == null) {
throw new IllegalArgumentException("HTTP version may not be null");
}
if (statuscode <= 0) {
throw new IllegalArgumentException("Status code may not be negative or zero");
}
this.ver = ver;
this.statuscode = statuscode;
if (phrase != null) {
this.phrase = phrase;
} else {
this.phrase = HttpStatus.getStatusText(statuscode);
}
}
public void setStatusLine(final HttpVersion ver, int statuscode) {
setStatusLine(ver, statuscode, null);
}
public String getPhrase() {
return this.phrase;
}
public int getStatuscode() {
return this.statuscode;
}
public HttpVersion getHttpVersion() {
return this.ver;
}
public String getStatusLine() {
StringBuffer buffer = new StringBuffer();
buffer.append(this.ver);
buffer.append(' ');
buffer.append(this.statuscode);
if (this.phrase != null) {
buffer.append(' ');
buffer.append(this.phrase);
}
return buffer.toString();
}
public boolean containsHeader(final String name) {
return this.headers.containsHeader(name);
}
public Header[] getHeaders() {
return this.headers.getAllHeaders();
}
public Header getFirstHeader(final String name) {
return this.headers.getFirstHeader(name);
}
public void removeHeaders(final String s) {
if (s == null) {
return;
}
Header[] headers = this.headers.getHeaders(s);
for (int i = 0; i < headers.length; i++) {
this.headers.removeHeader(headers[i]);
}
}
public void addHeader(final Header header) {
if (header == null) {
return;
}
this.headers.addHeader(header);
}
public void setHeader(final Header header) {
if (header == null) {
return;
}
removeHeaders(header.getName());
addHeader(header);
}
public void setHeaders(final Header[] headers) {
if (headers == null) {
return;
}
this.headers.setHeaders(headers);
}
public Iterator getHeaderIterator() {
return this.headers.getIterator();
}
public String getCharset() {
String charset = DEFAULT_CONTENT_CHARSET;
Header contenttype = this.headers.getFirstHeader("Content-Type");
if (contenttype != null) {
HeaderElement values[] = contenttype.getElements();
if (values.length == 1) {
NameValuePair param = values[0].getParameterByName("charset");
if (param != null) {
charset = param.getValue();
}
}
}
return charset;
}
public long getContentLength() {
Header contentLength = this.headers.getFirstHeader("Content-Length");
if (contentLength != null) {
try {
return Long.parseLong(contentLength.getValue());
} catch (NumberFormatException e) {
return -1;
}
} else {
return -1;
}
}
public void setBodyString(final String string) {
if (string != null) {
byte[] raw = null;
try {
raw = string.getBytes(DEFAULT_CONTENT_CHARSET);
} catch (UnsupportedEncodingException e) {
raw = string.getBytes();
}
this.entity = new ByteArrayInputStream(raw);
if (!containsHeader("Content-Type")) {
setHeader(new Header("Content-Type", "text/plain"));
}
setHeader(new Header("Content-Length", Long.toString(raw.length)));
} else {
this.entity = null;
}
}
public void setBody(final InputStream instream) {
this.entity = instream;
}
public InputStream getBody() {
return this.entity;
}
public byte[] getBodyBytes() throws IOException {
InputStream in = getBody();
if (in != null) {
byte[] tmp = new byte[4096];
int bytesRead = 0;
ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024);
while ((bytesRead = in.read(tmp)) != -1) {
buffer.write(tmp, 0, bytesRead);
}
return buffer.toByteArray();
} else {
return null;
}
}
public String getBodyString() throws IOException {
byte[] raw = getBodyBytes();
if (raw != null) {
return new String(raw, getCharset());
} else {
return null;
}
}
}