/**
*
*/
package com.grendelscan.commons.http.wrappers;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.grendelscan.commons.http.HttpConstants;
import com.grendelscan.commons.http.apache_overrides.serializable.SerializableHttpHeader;
/**
* @author david
*
*/
public class HttpHeadersWrapper implements Serializable
{
private static final Logger LOGGER = LoggerFactory.getLogger(HttpHeadersWrapper.class);
/**
*
*/
private static final long serialVersionUID = 1L;
protected ArrayList<SerializableHttpHeader> headers;
public transient static final String URL_ENCODED_MIME = "application/x-www-form-urlencoded";
public HttpHeadersWrapper()
{
headers = new ArrayList<SerializableHttpHeader>();
}
public HttpHeadersWrapper(Header[] headers)
{
this();
addHeaders(headers);
}
public List<SerializableHttpHeader> getReadOnlyHeaders()
{
return new ArrayList<SerializableHttpHeader>(headers);
}
@Override
public HttpHeadersWrapper clone()
{
HttpHeadersWrapper target = new HttpHeadersWrapper();
target.headers = new ArrayList<SerializableHttpHeader>(headers.size());
for(SerializableHttpHeader header: headers)
{
target.headers.add(header.clone());
}
return target;
}
public void addHeader(String name, String value)
{
addHeader(new SerializableHttpHeader(name, value));
}
public void addHeader(Header header)
{
headers.add(SerializableHttpHeader.convertToSerializableHeader(header));
}
public void updateHeader(String name, String value)
{
updateHeader(new SerializableHttpHeader(name, value));
}
public void updateHeader(Header header)
{
Header existing = getFirstHeader(header.getName());
if (existing == null)
{
addHeader(header);
}
else
{
int pos = headers.indexOf(existing);
headers.set(pos, new SerializableHttpHeader(header));
}
}
public void removeHeader(Header header)
{
headers.remove(header);
}
public void setHeaders(Header newHeaders[])
{
headers.clear();
addHeaders(newHeaders);
}
public void addHeaders(Header newHeaders[])
{
for (int index = 0; index < newHeaders.length; index++)
{
addHeader(newHeaders[index]);
}
}
public Header getLastHeader(String headerName)
{
for (ListIterator<SerializableHttpHeader> iterator = headers.listIterator(headers.size()); iterator.hasPrevious();)
{
SerializableHttpHeader header = iterator.previous();
if (header.getName().equalsIgnoreCase(headerName))
{
return header;
}
}
return null;
}
public List<SerializableHttpHeader> getHeaders(String headerName)
{
List<SerializableHttpHeader> tmpHeaders = new ArrayList<SerializableHttpHeader>(1);
for (SerializableHttpHeader header: headers)
{
if (header.getName().equalsIgnoreCase(headerName))
{
tmpHeaders.add(header);
}
}
return tmpHeaders;
}
public void clearHeaders()
{
headers.clear();
}
public void removeHeaders(String headerName)
{
List<SerializableHttpHeader> tmpHeaders = new ArrayList<SerializableHttpHeader>(headers);
for(SerializableHttpHeader header: tmpHeaders)
{
if (header.getName().equalsIgnoreCase(headerName))
{
headers.remove(header);
}
}
}
public String getMimeType()
{
Header header = getFirstHeader(HttpHeaders.CONTENT_TYPE);
if (header == null)
{
return "";
}
String tokens[] = header.getValue().split(";");
return tokens[0];
}
public String getContentTypeHeader()
{
Header h = getFirstHeader(HttpHeaders.CONTENT_TYPE);
if (h == null)
{
return "";
}
return h.getValue();
}
public String getCharacterSet()
{
Header header = getFirstHeader(HttpHeaders.CONTENT_TYPE);
if (header == null)
{
return "ISO-8859-1";
}
String tokens[] = header.getValue().split(";");
if (tokens.length > 1)
{
String charsetParam = tokens[1];
return charsetParam.substring(charsetParam.indexOf('=') + 1);
}
return "ISO-8859-1";
}
@Override
public String toString()
{
return new String(getBytes());
}
public byte[] getBytes()
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
for (SerializableHttpHeader header: headers)
{
try
{
out.write(header.getBytes());
out.write(HttpConstants.CRLF_BYTES);
}
catch (IOException e)
{
LOGGER.error("Weird problem getting bytes for headers: " + e.toString(), e);
}
}
return out.toByteArray();
}
public Header getFirstHeader(String headerName)
{
for (SerializableHttpHeader header: headers)
{
if (header.getName().equalsIgnoreCase(headerName))
{
return header;
}
}
return null;
}
public Header[] getReadOnlyHeaderArray()
{
return headers.toArray(new Header[0]);
}
}