package de.hanbei.httpserver.response;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.List;
import org.apache.commons.io.Charsets;
import de.hanbei.httpserver.common.Content;
import de.hanbei.httpserver.common.Cookie;
import de.hanbei.httpserver.common.Header;
import de.hanbei.httpserver.request.Request;
/**
*
*
*/
public class ResponseWriter {
private final OutputStream out;
private final Request request;
public ResponseWriter(OutputStream outputStream, Request request) {
this.out = outputStream;
this.request = request;
}
public void write(Response response) throws IOException {
List<Header.Parameter> acceptCharsetList = request.getHeader().getHeaderParameter(Header.Fields.ACCEPT_CHARSET);
Charset acceptCharset = Charsets.UTF_8;
if ( !acceptCharsetList.isEmpty() ) {
acceptCharset = Charset.forName(acceptCharsetList.get(0).getValue());
}
OutputStreamWriter charOut = new OutputStreamWriter(this.out, acceptCharset);
writeHttpVersion(response, charOut);
writeStatus(response, charOut);
writeHeader(response.getHeader(), charOut);
writeContent(response.getContent(), charOut);
charOut.write("\n");
charOut.close();
}
private void writeHttpVersion(Response response, OutputStreamWriter charOut) throws IOException {
charOut.write("HTTP/");
charOut.write(response.getHttpVersion().toString());
charOut.write(" ");
}
private void writeStatus(Response response, OutputStreamWriter charOut) throws IOException {
charOut.write(response.getStatus().toString());
charOut.write("\n");
}
private void writeHeader(Header header, OutputStreamWriter charOut) throws IOException {
if ( !header.getHeaderFields().isEmpty() ) {
for ( String parameterKey : header.getHeaderFields() ) {
charOut.write(parameterKey);
charOut.write(": ");
List<Header.Parameter> parameterList = header.getHeaderParameter(parameterKey);
String delimiter = "";
for ( Header.Parameter p : parameterList ) {
charOut.write(delimiter);
charOut.write(p.toString());
delimiter = ",";
}
charOut.write("\n");
}
}
if ( !header.getCookies().isEmpty() ) {
charOut.write(Header.Fields.COOKIE);
charOut.write(": ");
String delim = "";
for ( Cookie cookie : header.getCookies() ) {
charOut.write(delim);
charOut.write(cookie.getName());
charOut.write("=");
charOut.write(cookie.getValue());
delim = "; ";
}
}
}
private void writeContent(Content content, OutputStreamWriter charOut) throws IOException {
if ( content != null ) {
if ( content.getEncoding() != null ) {
charOut.write(Header.Fields.CONTENT_ENCODING);
charOut.write(": ");
charOut.write(content.getEncoding());
charOut.write("\n");
}
if ( content.getMimetype() != null ) {
charOut.write(Header.Fields.CONTENT_TYPE);
charOut.write(": ");
charOut.write(content.getMimetype());
if ( content.getCharset() != null ) {
charOut.write("; charset=");
charOut.write(content.getCharset());
}
charOut.write("\n");
}
if ( content.getLength() > 0 ) {
charOut.write(Header.Fields.CONTENT_LENGTH);
charOut.write(": ");
charOut.write(Integer.toString(content.getLength()));
charOut.write("\n");
}
if ( content.getLanguage() != null ) {
charOut.write(Header.Fields.CONTENT_LANGUAGE);
charOut.write(": ");
charOut.write(content.getLanguage());
charOut.write("\n");
}
if ( content.getMd5() != null ) {
charOut.write(Header.Fields.CONTENT_MD5);
charOut.write(": ");
charOut.write(content.getMd5());
charOut.write("\n");
}
if ( content.getRange() != null ) {
charOut.write(Header.Fields.CONTENT_RANGE);
charOut.write(": ");
charOut.write(content.getRange());
charOut.write("\n");
}
charOut.write("\n");
charOut.flush();
if ( content.isString() ) {
charOut.write(new String(content.getContent(), content.getCharset()));
} else {
out.write(content.getContent());
out.flush();
}
}
charOut.write("\n");
charOut.flush();
}
public void close() throws IOException {
out.flush();
out.close();
}
}