package org.jboss.resteasy.plugins.server.sun.http; import com.sun.net.httpserver.HttpExchange; import org.jboss.resteasy.spi.HttpResponse; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.util.CaseInsensitiveMap; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.NewCookie; import javax.ws.rs.ext.RuntimeDelegate; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.Map; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class HttpServerResponse implements HttpResponse { private int status = 200; private MultivaluedMap<String, Object> outputHeaders; private HttpExchange exchange; private OutputStream streamWrapper; private boolean committed; private ResteasyProviderFactory factory; public HttpServerResponse(ResteasyProviderFactory factory, HttpExchange ex) { this.exchange = ex; this.factory = factory; outputHeaders = new CaseInsensitiveMap<Object>(); streamWrapper = new OutputStream() { @Override public void write(int i) throws IOException { commitHeaders(); exchange.getResponseBody().write(i); } @Override public void write(byte[] bytes) throws IOException { commitHeaders(); exchange.getResponseBody().write(bytes); } @Override public void write(byte[] bytes, int i, int i1) throws IOException { commitHeaders(); exchange.getResponseBody().write(bytes, i, i1); } @Override public void flush() throws IOException { commitHeaders(); exchange.getResponseBody().flush(); } }; } protected void addHeader(String name, Object value) { @SuppressWarnings(value = "unchecked") RuntimeDelegate.HeaderDelegate<Object> delegate = factory.getHeaderDelegate(value.getClass()); if (delegate != null) { //System.out.println("addResponseHeader: " + key + " " + delegate.toString(value)); exchange.getResponseHeaders().add(name, delegate.toString(value)); } else { //System.out.println("addResponseHeader: " + key + " " + value.toString()); exchange.getResponseHeaders().add(name, value.toString()); } } public void commitHeaders() throws IOException { if (committed) return; long len = 0; if (outputHeaders.containsKey("Content-Length")) { len = Long.valueOf(outputHeaders.getFirst("Content-Length").toString()); } else if (outputHeaders.containsKey("Content-Type")) { len = 0; } else { len = -1; } for (Map.Entry<String, List<Object>> entry : outputHeaders.entrySet()) { for (Object val : entry.getValue()) { addHeader(entry.getKey(), val); } } exchange.sendResponseHeaders(status, len); committed = true; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public MultivaluedMap<String, Object> getOutputHeaders() { return outputHeaders; } public OutputStream getOutputStream() throws IOException { return streamWrapper; } @Override public void setOutputStream(OutputStream os) { streamWrapper = os; } public void addNewCookie(NewCookie cookie) { outputHeaders.add(HttpHeaders.SET_COOKIE, cookie); } public void sendError(int status) throws IOException { this.status = status; exchange.sendResponseHeaders(status, -1); committed = true; } public void sendError(int status, String message) throws IOException { this.status = status; exchange.sendResponseHeaders(status, -1); committed = true; } public boolean isCommitted() { return committed; } public void reset() { outputHeaders.clear(); } }