Commit | Line | Data |
---|---|---|
a7d2eb26 FT |
1 | package dolda.jsvc.util; |
2 | ||
3 | import dolda.jsvc.*; | |
4 | import java.net.*; | |
5 | import java.io.*; | |
6 | import java.util.logging.*; | |
7 | ||
8 | public class ErrorHandler implements Responder { | |
9 | private Responder next; | |
c9837b5e | 10 | private static Logger logger = Logger.getLogger("dolda.jsvc.context"); |
a7d2eb26 FT |
11 | |
12 | public ErrorHandler(Responder next) { | |
13 | this.next = next; | |
14 | } | |
15 | ||
16 | protected void log(Request req, Throwable t) { | |
17 | logger.log(Level.SEVERE, "Unhandled error in responder", t); | |
18 | } | |
19 | ||
20 | protected void respdebug(Request req, Throwable t) { | |
21 | req.status(500); | |
22 | req.outheaders().put("content-type", "text/plain; charset=utf-8"); | |
23 | PrintWriter out; | |
24 | try { | |
25 | out = new PrintWriter(new OutputStreamWriter(req.output(), "UTF-8")); | |
26 | } catch(UnsupportedEncodingException e) { | |
27 | throw(new Error(e)); | |
28 | } | |
29 | t.printStackTrace(out); | |
30 | out.flush(); | |
31 | } | |
32 | ||
33 | protected void resperr(Request req, Throwable t) { | |
34 | req.status(500); | |
35 | req.outheaders().put("content-type", "text/html; charset=us-ascii"); | |
36 | PrintWriter out; | |
37 | try { | |
38 | out = new PrintWriter(new OutputStreamWriter(req.output(), "US-ASCII")); | |
39 | } catch(UnsupportedEncodingException e) { | |
40 | throw(new Error(e)); | |
41 | } | |
42 | out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); | |
43 | out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"); | |
44 | out.println("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\">"); | |
45 | out.println("<head><title>Internal error</title></head>"); | |
46 | out.println("<body>"); | |
47 | out.println("<h1>Internal error</h1>"); | |
48 | out.println("An error occurred on the server processing your request."); | |
49 | out.println("</body>"); | |
50 | out.println("</html>"); | |
51 | out.flush(); | |
52 | } | |
53 | ||
54 | protected boolean debug(Request req, Throwable t) { | |
55 | SocketAddress rem = req.remoteaddr(); | |
56 | return((rem instanceof InetSocketAddress) && ((InetSocketAddress)rem).getAddress().isLoopbackAddress()); | |
57 | } | |
58 | ||
59 | protected void handle(Request req, Throwable t) { | |
60 | log(req, t); | |
61 | if(req instanceof ResettableRequest) { | |
62 | ResettableRequest rr = (ResettableRequest)req; | |
63 | if(rr.canreset()) | |
64 | rr.reset(); | |
65 | } | |
66 | if(debug(req, t)) | |
67 | respdebug(req, t); | |
68 | else | |
69 | resperr(req, t); | |
70 | } | |
71 | ||
72 | public void respond(Request req) { | |
73 | try { | |
74 | next.respond(req); | |
75 | } catch(Throwable t) { | |
76 | handle(req, t); | |
77 | } | |
78 | } | |
79 | } |