Author: toad
Date: 2007-05-03 18:18:23 +0000 (Thu, 03 May 2007)
New Revision: 13127

Modified:
   trunk/freenet/src/freenet/clients/http/ToadletContextImpl.java
Log:
Separate the HTTP reason string from the explanation string

Modified: trunk/freenet/src/freenet/clients/http/ToadletContextImpl.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/ToadletContextImpl.java      
2007-05-03 16:57:12 UTC (rev 13126)
+++ trunk/freenet/src/freenet/clients/http/ToadletContextImpl.java      
2007-05-03 18:18:23 UTC (rev 13127)
@@ -68,23 +68,38 @@
                if(closed) throw new ToadletContextClosedException();
                MultiValueTable mvt = new MultiValueTable();
                mvt.put("Allow", "GET, PUT");
-               sendError(sockOutputStream, 405, "Method not allowed", 
shouldDisconnect, mvt);
+               sendError(sockOutputStream, 405, "Method Not Allowed", "Method 
Not Allowed", shouldDisconnect, mvt);
        }

-       private static void sendError(OutputStream os, int code, String 
message, boolean shouldDisconnect, MultiValueTable mvt) throws IOException {
-               sendError(os, code, message, 
"<html><head><title>"+message+"</title></head><body><h1>"+message+"</h1></body>",
 shouldDisconnect, mvt);
+       /**
+        * Send an error message. Caller provides the HTTP code, reason string, 
and a message, which
+        * will become the title and the h1'ed contents of the error page. 
+        */
+       private static void sendError(OutputStream os, int code, String 
httpReason, String message, boolean shouldDisconnect, MultiValueTable mvt) 
throws IOException {
+               sendHTMLError(os, code, httpReason, 
"<html><head><title>"+message+"</title></head><body><h1>"+message+"</h1></body>",
 shouldDisconnect, mvt);
        }

-       private static void sendError(OutputStream os, int code, String 
message, String htmlMessage, boolean disconnect, MultiValueTable mvt) throws 
IOException {
+       /**
+        * Send an error message, containing full HTML from a String.
+        * @param os The OutputStream to send the message to.
+        * @param code The HTTP status code.
+        * @param httpReason The HTTP reason string for the HTTP status code. 
Do not make stuff up,
+        * use the official reason string, or some browsers may break.
+        * @param htmlMessage The HTML string to send.
+        * @param disconnect Whether to disconnect from the client afterwards.
+        * @param mvt Any additional headers.
+        * @throws IOException If we could not send the error message.
+        */
+       private static void sendHTMLError(OutputStream os, int code, String 
httpReason, String htmlMessage, boolean disconnect, MultiValueTable mvt) throws 
IOException {
                if(mvt == null) mvt = new MultiValueTable();
                byte[] messageBytes = htmlMessage.getBytes("UTF-8");
-               sendReplyHeaders(os, code, message, mvt, "text/html; 
charset=UTF-8", messageBytes.length, disconnect);
+               sendReplyHeaders(os, code, httpReason, mvt, "text/html; 
charset=UTF-8", messageBytes.length, disconnect);
                os.write(messageBytes);
        }

        private void sendNoToadletError(boolean shouldDisconnect) throws 
ToadletContextClosedException, IOException {
                if(closed) throw new ToadletContextClosedException();
-               sendError(sockOutputStream, 404, "Service not found", 
shouldDisconnect, null);
+               sendError(sockOutputStream, 404, "Not Found", "No Toadlet of 
that name", shouldDisconnect, null);
        }

        private static void sendURIParseError(OutputStream os, boolean 
shouldDisconnect, Throwable e) throws IOException {
@@ -93,7 +108,7 @@
                e.printStackTrace(pw);
                pw.close();
                String message = "<html><head><title>URI parse 
error</title></head><body><p>"+HTMLEncoder.encode(e.getMessage())+"</p><pre>\n"+sw.toString();
-               sendError(os, 400, "URI parse error", message, 
shouldDisconnect, null);
+               sendHTMLError(os, 400, "Bad Request", message, 
shouldDisconnect, null);
        }

        public void sendReplyHeaders(int replyCode, String replyDescription, 
MultiValueTable mvt, String mimeType, long contentLength) throws 
ToadletContextClosedException, IOException {
@@ -260,7 +275,7 @@
                                if(method.equals("POST")) {
                                        String slen = (String) 
headers.get("content-length");
                                        if(slen == null) {
-                                               
sendError(sock.getOutputStream(), 400, "No content-length in POST", true, null);
+                                               
sendError(sock.getOutputStream(), 400, "Bad Request", "No content-length in 
POST", true, null);
                                                return;
                                        }
                                        long len;
@@ -268,7 +283,7 @@
                                                len = Integer.parseInt(slen);
                                                if(len < 0) throw new 
NumberFormatException("content-length less than 0");
                                        } catch (NumberFormatException e) {
-                                               
sendError(sock.getOutputStream(), 400, "content-length parse error: "+e, true, 
null);
+                                               
sendError(sock.getOutputStream(), 400, "Bad Request", "content-length parse 
error: "+e, true, null);
                                                return;
                                        }
                                        data = bf.makeBucket(len);
@@ -333,13 +348,13 @@

                } catch (ParseException e) {
                        try {
-                               sendError(sock.getOutputStream(), 400, "Parse 
error: "+e.getMessage(), true, null);
+                               sendError(sock.getOutputStream(), 400, "Bad 
Request", "Parse error: "+e.getMessage(), true, null);
                        } catch (IOException e1) {
                                // Ignore
                        }
                } catch (TooLongException e) {
                        try {
-                               sendError(sock.getOutputStream(), 400, "Line 
too long parsing headers", true, null);
+                               sendError(sock.getOutputStream(), 400, "Bad 
Request", "Line too long parsing headers", true, null);
                        } catch (IOException e1) {
                                // Ignore
                        }


Reply via email to