X-Git-Url: http://jaekl.net/gitweb/?p=frank.git;a=blobdiff_plain;f=prod%2Fnet%2Fjaekl%2Ffrank%2FErrorHandler.java;fp=prod%2Fnet%2Fjaekl%2Ffrank%2FErrorHandler.java;h=c1d72bd8d96bcaa8c3fc35434b66ae707275ee2f;hp=0000000000000000000000000000000000000000;hb=60dc53edca9ae2bcd6703e02b26acd47ef3d61a8;hpb=418e4d229a8b607b022cfb867bb702bec1765d13 diff --git a/prod/net/jaekl/frank/ErrorHandler.java b/prod/net/jaekl/frank/ErrorHandler.java new file mode 100644 index 0000000..c1d72bd --- /dev/null +++ b/prod/net/jaekl/frank/ErrorHandler.java @@ -0,0 +1,105 @@ +package net.jaekl.frank; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.util.Locale; + +import net.jaekl.qd.http.InvalidResponseException; + +public class ErrorHandler { + static final String JAVASCRIPT = + ""; + + void writeScript(PrintWriter pw) { + pw.println(JAVASCRIPT); + } + + void explain(PrintWriter pw, Throwable t, FrankBundle bundle) { + Throwable cause = t; + if (t instanceof FrankException) { + if (null != t.getCause()) { + cause = t.getCause(); + } + } + + pw.println("

"); + if (cause instanceof InvalidResponseException) { + InvalidResponseException ire = (InvalidResponseException)cause; + + pw.println(bundle.get(FrankBundle.INVALID_RESPONSE)); + pw.println("

"); + pw.println(" "); + pw.println(" "); + pw.println(" "); + pw.println(" "); + pw.println("
" + bundle.get(FrankBundle.URL_CONTACTED) + + "" + ire.getUrl() + "
" + bundle.get(FrankBundle.REQUEST_MADE) + + "" + ire.getMethod() + "
" + bundle.get(FrankBundle.ANSWER_RECEIVED) + + "" + ire.getResponse() + "
"); + pw.println("

"); + pw.println("

" + bundle.get(FrankBundle.MAYBE_SERVER_PROBLEM) + "

"); + } + else { + pw.println(bundle.get(FrankBundle.UNEXPECTED_EXCEPTION)); + } + pw.println("

"); + } + + void writeErrorPage(PrintWriter pw, Throwable t, Locale locale) { + Style style = new Style(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(baos); + FrankBundle bundle = FrankBundle.getInst(locale); + + pw.println(""); + pw.println("" + + bundle.get(FrankBundle.FRANK) + ": " + + bundle.get(FrankBundle.ERROR_PAGE) + + ""); + style.writeStyle(pw); + writeScript(pw); + pw.println(""); + + pw.println(""); + pw.println("
" + + bundle.get(FrankBundle.FRANK) + ": " + + bundle.get(FrankBundle.UNEXPECTED_ERROR) + + "
"); + + explain(pw, t, bundle); + + // Note that, if we cared about security, we would log this stack trace to a + // server log, and only report a cross-reference to the log file back to the + // end user's browser, to avoid potentially exposing internal info that we + // don't want to share. + // At least at this point, we don't care (that much), and trade off a + // potential information leak in favour of reducing our code complexity + // and the administrator's workload. + + pw.println("

"); + pw.println("

"); + pw.println("

");
+		
+		t.printStackTrace(ps);
+		String stackTrace = baos.toString(); 
+		pw.println(stackTrace);
+				
+		pw.println("
\n

\n
"); + pw.println("

Click here to return to the main page.

"); + pw.println(""); + } +}