/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
package org.ebayopensource.turmeric.runtime.tests.common.jetty;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.io.output.TeeOutputStream;
import org.mortbay.jetty.HttpFields;
import org.mortbay.jetty.Response;
import org.mortbay.log.Log;
public class DebugHttpServletResponse extends HttpServletResponseWrapper {
private static final Logger LOG = Logger.getLogger("jetty.debug.response");
class DelegatingServletOutputStream extends ServletOutputStream {
private OutputStream out;
public DelegatingServletOutputStream(OutputStream out) {
this.out = out;
}
@Override
public void write(int b) throws IOException {
out.write(b);
}
}
private ByteArrayOutputStream captured = new ByteArrayOutputStream();
public DebugHttpServletResponse(HttpServletResponse response) {
super(response);
}
public byte[] getCapturedBody() {
return captured.toByteArray();
}
private Response getJettyResponse() {
return (Response) getResponse();
}
public Map<String, String> getHeaders() {
HttpFields fields = getJettyResponse().getHttpFields();
Map<String,String> headers = new HashMap<String, String>();
@SuppressWarnings("unchecked")
Enumeration<String> names = fields.getFieldNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
headers.put(name, fields.getStringField(name));
}
return headers;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new DelegatingServletOutputStream(new TeeOutputStream(
super.getOutputStream(), captured));
}
private void debug(String format, Object ... args) {
LOG.info("## DEBUG ## " + String.format(format, args));
}
@Override
public void sendError(int sc) throws IOException {
debug("sendError(%d)", sc);
super.sendError(sc);
}
@Override
public void sendError(int sc, String msg) throws IOException {
debug("sendError(%d, \"%s\")%n", sc, msg);
super.sendError(sc, msg);
}
@Override
public void setHeader(String name, String value) {
debug("setHeader(\"%s\", \"%s\")%n", name, value);
super.setHeader(name, value);
}
@Override
public void setStatus(int sc) {
debug("setStatus(%d)%n", sc);
super.setStatus(sc);
}
@Override
public void setStatus(int sc, String sm) {
debug("setStatus(%d, \"%s\")%n", sc, sm);
super.setStatus(sc, sm);
}
public int getStatusCode() {
return getJettyResponse().getStatus();
}
public String getStatusReason() {
return getJettyResponse().getReason();
}
public long getContentLength() {
return getJettyResponse().getContentCount();
}
}