blob: 80b2b02db44ed56de6ed5f9b0d6755f26fd16193 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.ahc.codec;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.ahc.util.NameValuePair;
import org.apache.asyncweb.common.Cookie;
/**
* The Class HttpMessage. The base class for {@link HttpRequestMessage} and {@link HttpResponseMessage}.
*/
public class HttpMessage {
/** The Constant HTTP_ELEMENT_CHARSET used for encoding the HTTP elements. */
public static final String HTTP_ELEMENT_CHARSET = "US-ASCII";
/** The Constant DEFAULT_URL_ENCODING_CHARSET use for URL encoding. */
public static final String DEFAULT_URL_ENCODING_CHARSET = "UTF-8";
/** The Constant CONTENT_TYPE. */
public static final String CONTENT_TYPE = "Content-Type";
/** The Constant CONTENT_LENGTH. */
public static final String CONTENT_LENGTH = "Content-Length";
/** The headers associated with the message. */
protected List<NameValuePair> headers = new ArrayList<NameValuePair>();
/** The cookies associated with the message. */
protected List<Cookie> cookies = new ArrayList<Cookie>();
/** The content type. */
protected String contentType;
/** The content length. */
protected int contentLength;
/** The content container. */
protected ByteArrayOutputStream content;
/** The character charset for URL encoding **/
protected String urlEncodingCharset = DEFAULT_URL_ENCODING_CHARSET;
/**
* Gets the <code>String</code> content. This method should only be
* used if the content is certain to be of type html or text as determined by the {@link #getContentType}.
*
* @return the <code>String</code> content or <code>null</code> if there is no content.
*/
public String getStringContent() {
if (content == null) {
return null;
}
return new String(content.toByteArray());
}
/**
* Gets the content as a <code>byte[]</code> array.
*
* @return the <code>byte[]</code> content or <code>null</code> if there is no content.
*/
public byte[] getContent() {
if (content == null) {
return null;
}
return content.toByteArray();
}
/**
* Appends <code>byte[]</code> to the content.
*
* @param byteContent the byte content
*
* @throws IOException Signals that an I/O exception has occurred.
*/
public void addContent(byte[] byteContent) throws IOException {
if (this.content == null) {
this.content = new ByteArrayOutputStream();
}
this.content.write(byteContent);
}
/**
* Gets the cookies.
*
* @return the cookies
*/
public List<Cookie> getCookies() {
return cookies;
}
/**
* Sets the cookies.
*
* @param cookies the new cookies
*/
public void setCookies(List<Cookie> cookies) {
this.cookies = cookies;
}
/**
* Adds a cookie to the {@link Cookie} list.
*
* @param cookie the cookie
*/
public void addCookie(Cookie cookie) {
this.cookies.add(cookie);
}
/**
* Returns all headers.
*
* @return all headers
*/
public List<NameValuePair> getHeaders() {
return headers;
}
/**
* Sets the headers. It removes any headers that were stored before the
* call.
*
* @param headers the new headers
*/
public void setHeaders(List<NameValuePair> headers) {
this.headers = headers;
}
/**
* Adds a header to the {@link org.apache.ahc.util.NameValuePair} header list.
*
* @param header the header
*/
public void addHeader(NameValuePair header) {
headers.add(header);
}
/**
* Adds the header as a <code>String</code> name/value pair to the
* {@link org.apache.ahc.util.NameValuePair} header list.
*
* @param name the name
* @param value the value
*/
public void addHeader(String name, String value) {
headers.add(new NameValuePair(name, value));
}
/**
* Removes the headers that have the given name.
*
* @param name the name
*/
public void removeHeader(String name) {
Iterator<NameValuePair> it = headers.iterator();
while (it.hasNext()) {
NameValuePair header = it.next();
if (header.getName().equals(name)) {
it.remove();
}
}
}
/**
* Sets the header with the given name and the value. This differs from
* <code>addHeader()</code> in that it removes any existing header under the
* name and adds the new one.
*
* @param name the name
* @param value the value
* @throws IllegalArgumentException if either the name or the value is null.
*/
public void setHeader(String name, String value) {
if (name == null || value == null) {
throw new IllegalArgumentException("null name or value was passed in");
}
// we're resetting the value, so remove it first
removeHeader(name);
addHeader(name, value);
}
/**
* Returns the value for the header with the given name. If there are more
* than one header stored, it returns the first entry it finds in the list.
*
* @param name the name
* @return the value for the header, or null if it is not found
* @throws IllegalArgumentException if the name is null
*/
public String getHeader(String name) {
if (name == null) {
throw new IllegalArgumentException("null name was passed in");
}
Iterator<NameValuePair> it = headers.iterator();
while (it.hasNext()) {
NameValuePair header = it.next();
if (header.getName().equals(name)) {
return header.getValue();
}
}
return null;
}
/**
* Returns an array of values for the header with the given name.
*
* @param name the name
* @return the value for the header. If there is no entry under the name,
* an empty array is returned.
* @throws IllegalArgumentException if the name is null
*/
public String[] getHeaders(String name) {
if (name == null) {
throw new IllegalArgumentException("null name was passed in");
}
List<String> values = new ArrayList<String>();
Iterator<NameValuePair> it = headers.iterator();
while (it.hasNext()) {
NameValuePair header = it.next();
if (header.getName().equals(name)) {
values.add(header.getValue());
}
}
return values.toArray(new String[]{});
}
/**
* Gets the content type.
*
* @return the content type
*/
public String getContentType() {
return contentType;
}
/**
* Sets the content type.
*
* @param contentType the new content type
*/
public void setContentType(String contentType) {
this.contentType = contentType;
}
/**
* Gets the content length.
*
* @return the content length
*/
public int getContentLength() {
return contentLength;
}
/**
* Sets the content length.
*
* @param contentLength the new content length
*/
public void setContentLength(int contentLength) {
this.contentLength = contentLength;
}
/**
* Gets the charset that is used to do URL encoding/decoding. It is
* "UTF-8" by default.
*
* @return the charset name
*/
public String getUrlEncodingCharset() {
return urlEncodingCharset;
}
/**
* Sets the charset that is used to do URL encoding/decoding. In reality,
* the only recommended values are "UTF-8", and normally it is neither
* necessary nor recommended to use something other than the default. <b>Do
* not reset this value</b> unless there is a very clear interoperability
* reason to do so.
*
* @param charset the charset name
*/
public void setUrlEncodingCharset(String charset) {
this.urlEncodingCharset = charset;
}
}