package io.github.azagniotov.stubby4j.handlers; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.util.ByteArrayISO8859Writer; import org.json.JSONException; import org.json.JSONObject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Writer; import static io.github.azagniotov.stubby4j.utils.ObjectUtils.isNull; public class JsonErrorHandler extends ErrorHandler { @Override public void handle(final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response) throws IOException { final String method = request.getMethod(); if (!HttpMethod.GET.is(method) && !HttpMethod.POST.is(method) && !HttpMethod.PUT.is(method) && !HttpMethod.HEAD.is(method)) { baseRequest.setHandled(true); return; } baseRequest.setHandled(true); response.setContentType(MimeTypes.Type.APPLICATION_JSON.asString()); final ByteArrayISO8859Writer byteArrayWriter = new ByteArrayISO8859Writer(4096); final String reason = (response instanceof Response) ? ((Response) response).getReason() : null; handleErrorPage(request, byteArrayWriter, response.getStatus(), reason); byteArrayWriter.flush(); response.setContentLength(byteArrayWriter.size()); byteArrayWriter.writeTo(response.getOutputStream()); byteArrayWriter.destroy(); } @Override protected void writeErrorPage(final HttpServletRequest request, final Writer writer, final int code, final String message, final boolean showStacks) throws IOException { final String error = isNull(message) ? HttpStatus.getMessage(code) : message; if (code == 404) { try { final JSONObject jsonObject = new JSONObject(error); jsonObject.putOpt("code", code); writer.write(jsonObject.toString()); } catch (final JSONException e) { writer.write("{\"code\":\"" + code + "\",\"message\"=\"" + error + "\"}"); } } else { writer.write("{\"code\":\"" + code + "\",\"message\"=\"" + error + "\"}"); } } }