package org.sothis.mvc.http.netty;
import io.netty.buffer.ByteBufOutputStream;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaders.Names;
import io.netty.handler.codec.http.HttpHeaders.Values;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import org.sothis.mvc.Headers;
import org.sothis.mvc.Response;
public class NettyHttpResponse implements Response {
private final FullHttpResponse response;
private Headers headers;
private boolean committed;
private ByteBufOutputStream ouputStream;
private PrintWriter writer;
public NettyHttpResponse(FullHttpResponse response) {
super();
this.response = response;
}
@Override
public OutputStream getOutputStream() throws IOException {
if (null == ouputStream) {
ouputStream = new ByteBufOutputStream(response.content());
}
return ouputStream;
}
@Override
public PrintWriter getWriter() throws IOException {
if (null == writer) {
writer = new PrintWriter(getOutputStream());
}
return writer;
}
@Override
public Headers headers() {
if (null == headers) {
headers = new NettyHttpHeaders(response.headers());
}
return headers;
}
@Override
public int getStatus() {
return response.getStatus().code();
}
@Override
public void setStatus(int status) {
response.setStatus(HttpResponseStatus.valueOf(status));
}
@Override
public String getProtocolVersion() {
return response.getProtocolVersion().text();
}
@Override
public void setProtocolVersion(String protocolVersion) {
response.setProtocolVersion(HttpVersion.valueOf(protocolVersion));
}
@Override
public String getCharset() {
return headers().getString(Names.CONTENT_ENCODING);
}
@Override
public void setCharset(String charset) throws UnsupportedEncodingException {
headers().setString(Names.CONTENT_ENCODING, charset);
}
public void commit() throws IOException {
if (committed) {
throw new IllegalStateException("response has already committed.");
}
committed = true;
this.getOutputStream().flush();
headers().setInteger(Names.CONTENT_LENGTH, response.content().readableBytes());
headers().setString(Names.CONNECTION, Values.KEEP_ALIVE);
}
@Override
public boolean isCommitted() {
return committed;
}
@Override
public void reset() {
response.setStatus(HttpResponseStatus.OK);
response.content().clear();
response.headers().clear();
}
}