X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fdolda%2Fjsvc%2Futil%2FErrorHandler.java;fp=src%2Fdolda%2Fjsvc%2Futil%2FErrorHandler.java;h=f1149e84e5fa8fbf8a481f48129cda953c542ec0;hb=a7d2eb2686c6e87d97d66051ba577178e5432511;hp=0000000000000000000000000000000000000000;hpb=b606e86e005c98e6b4039bf8e4541ed76273a0da;p=jsvc.git diff --git a/src/dolda/jsvc/util/ErrorHandler.java b/src/dolda/jsvc/util/ErrorHandler.java new file mode 100644 index 0000000..f1149e8 --- /dev/null +++ b/src/dolda/jsvc/util/ErrorHandler.java @@ -0,0 +1,79 @@ +package dolda.jsvc.util; + +import dolda.jsvc.*; +import java.net.*; +import java.io.*; +import java.util.logging.*; + +public class ErrorHandler implements Responder { + private Responder next; + private static Logger logger = Logger.getLogger("jsvc.error"); + + public ErrorHandler(Responder next) { + this.next = next; + } + + protected void log(Request req, Throwable t) { + logger.log(Level.SEVERE, "Unhandled error in responder", t); + } + + protected void respdebug(Request req, Throwable t) { + req.status(500); + req.outheaders().put("content-type", "text/plain; charset=utf-8"); + PrintWriter out; + try { + out = new PrintWriter(new OutputStreamWriter(req.output(), "UTF-8")); + } catch(UnsupportedEncodingException e) { + throw(new Error(e)); + } + t.printStackTrace(out); + out.flush(); + } + + protected void resperr(Request req, Throwable t) { + req.status(500); + req.outheaders().put("content-type", "text/html; charset=us-ascii"); + PrintWriter out; + try { + out = new PrintWriter(new OutputStreamWriter(req.output(), "US-ASCII")); + } catch(UnsupportedEncodingException e) { + throw(new Error(e)); + } + out.println(""); + out.println(""); + out.println(""); + out.println("Internal error"); + out.println(""); + out.println("

Internal error

"); + out.println("An error occurred on the server processing your request."); + out.println(""); + out.println(""); + out.flush(); + } + + protected boolean debug(Request req, Throwable t) { + SocketAddress rem = req.remoteaddr(); + return((rem instanceof InetSocketAddress) && ((InetSocketAddress)rem).getAddress().isLoopbackAddress()); + } + + protected void handle(Request req, Throwable t) { + log(req, t); + if(req instanceof ResettableRequest) { + ResettableRequest rr = (ResettableRequest)req; + if(rr.canreset()) + rr.reset(); + } + if(debug(req, t)) + respdebug(req, t); + else + resperr(req, t); + } + + public void respond(Request req) { + try { + next.respond(req); + } catch(Throwable t) { + handle(req, t); + } + } +}