package org.caudexorigo.http.netty.reporting; import java.io.PrintWriter; import org.apache.commons.lang3.StringUtils; import org.caudexorigo.io.UnsynchronizedStringWriter; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.http.HttpHeaders; import org.jboss.netty.handler.codec.http.HttpRequest; import org.jboss.netty.handler.codec.http.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class StandardResponseFormatter implements ResponseFormatter { private static Logger log = LoggerFactory.getLogger(StandardResponseFormatter.class); private final boolean showFullErrorInfo; public StandardResponseFormatter(boolean showFullErrorInfo) { super(); this.showFullErrorInfo = showFullErrorInfo; } /* * (non-Javadoc) * * @see org.caudexorigo.http.netty.reporting.ResponseFormtter#formatResponse(org.jboss.netty.handler.codec.http.HttpRequest, org.jboss.netty.handler.codec.http.HttpResponse) */ @Override public void formatResponse(ChannelHandlerContext ctx, HttpRequest request, HttpResponse response) { formatResponse(ctx, request, response, null); } /* * (non-Javadoc) * * @see org.caudexorigo.http.netty.reporting.ResponseFormtter#formatResponse(org.jboss.netty.handler.codec.http.HttpRequest, org.jboss.netty.handler.codec.http.HttpResponse, java.lang.Throwable) */ @Override public void formatResponse(ChannelHandlerContext ctx, HttpRequest request, HttpResponse response, Throwable error) { int rsp_code = response.getStatus().getCode(); if (MessageBody.allow(rsp_code)) { try { String html = String.format(ErrorTemplates.getTemplate(response.getStatus().getCode()), response.getStatus().getCode(), response.getStatus().getReasonPhrase(), request.getMethod().toString(), getStackTrace(error, showFullErrorInfo)); byte[] bytes = html.toString().getBytes("UTF-8"); ChannelBuffer out = ChannelBuffers.wrappedBuffer(bytes); response.setContent(out); response.addHeader(HttpHeaders.Names.CONTENT_TYPE, "text/html"); } catch (Throwable t) { log.error(t.getMessage(), t); } } } public String getStackTrace(Throwable error, boolean fullInfo) { if (error != null) { if (fullInfo) { log.error(error.getMessage(), error); UnsynchronizedStringWriter sw = new UnsynchronizedStringWriter(); PrintWriter pw = new PrintWriter(sw); error.printStackTrace(pw); pw.flush(); String emsg = sw.toString(); return emsg; } else { return StringUtils.defaultIfEmpty(error.getMessage(), "N/A"); } } else { return "N/A"; } } }