package com.wangyin.ak47.pipes.http;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.wangyin.ak47.common.ByteUtil;
/**
* 简单的HttpRequest实现
*
* @author wyhanyu
*
*/
public class SimpleHttpMessage {
// HttpMessage = startLine + headers + content;
// first line
private String startLine;
// many headers
private Map<String, List<String>> headers = new HashMap<String, List<String>>();;
// any content
private byte[] content;
public String getStartLine(){
return startLine;
}
public void setStartLine(String startLine){
this.startLine = startLine;
}
public Map<String, List<String>> getHeaders(){
return headers;
}
public void setHeaders(Map<String, List<String>> headers){
this.headers = headers;
}
public byte[] getContent(){
return content;
}
public void setContent(byte[] content){
this.content = content;
}
/**
* 添加一个Header
*
* @param key Key in header
* @param value Value of the key
*/
public void addHeader(String key, String value){
// key = StringUtil2.asciiToLowerCase(key);
List<String> vl = headers.get(key);
if( null == vl ){
vl = new ArrayList<String>(1);
vl.add(value);
headers.put(key, vl);
}else{
vl.add(value);
}
}
/**
* 获取该key的第一个header
* 若不存在,则返回null
*
* @param key Key in header
* @return Value of the key
*/
public String getHeaderFirst(String key){
// key = StringUtil2.asciiToLowerCase(key);
List<String> vl = headers.get(key);
if( null == vl ){
return null;
}else {
return vl.get(0);
}
}
/**
* 修改key的header
*
* @param key Key in header
* @param value Value of the Key
*/
public void setOrAddFirstHeader(String key, String value){
// key = StringUtil2.asciiToLowerCase(key);
List<String> vl = headers.get(key);
if( null == vl ){
addHeader(key, value);
}else {
vl.set(0, value);
}
}
/**
* build HTTP header
*
* @return Text of header
*/
public String buildHeaderString(){
StringBuilder sb = new StringBuilder();
sb.append(startLine).append(SimpleHttpParser.CRLF_STRING);
for(String key : headers.keySet()){
List<String> vl = headers.get(key);
for(String v : vl){
if( key.equals("content-length") ){
key = "Content-Length";
}
if( key.equals("server") ){
key = "Server";
}
sb.append(key).append(": ").append(v).append(SimpleHttpParser.CRLF_STRING);
}
}
sb.append(SimpleHttpParser.CRLF_STRING);
return sb.toString();
}
/**
* 完整打印
*
* @return Text of header, and size of body
*/
@Override
public String toString(){
if( null != content ){
StringBuilder sb = new StringBuilder();
sb.append( buildHeaderString() );
sb.append( "content("+content.length+")" );
return sb.toString();
}else{
return buildHeaderString();
}
}
/**
* 导出为bytearray
*
* @return Bytes of all header and body
*/
public byte[] buildFullBytes(){
byte[] half = buildHeaderString().getBytes();
if( null != content ){
byte[] full = ByteUtil.merge(half,content);
return full;
}else{
return half;
}
}
}