Blob Blame History Raw
diff -up ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java.fix2 ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java
--- ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java.fix2	2009-11-03 12:45:36.000000000 -0500
+++ ./modules/jetty/src/main/java/org/mortbay/jetty/handler/ErrorHandler.java	2009-11-03 12:47:35.000000000 -0500
@@ -91,8 +91,7 @@ public class ErrorHandler extends Abstra
         writer.write("<title>Error ");
         writer.write(Integer.toString(code));
         writer.write(' ');
-        if (message!=null)
-            writer.write(deScript(message));
+        write(writer,message);
         writer.write("</title>\n");    
     }
 
@@ -117,9 +116,9 @@ public class ErrorHandler extends Abstra
         writer.write("<h2>HTTP ERROR ");
         writer.write(Integer.toString(code));
         writer.write("</h2>\n<p>Problem accessing ");
-        writer.write(deScript(uri));
+        write(writer,uri);
         writer.write(". Reason:\n<pre>    ");
-        writer.write(deScript(message));
+        write(writer,message);
         writer.write("</pre></p>");
     }
 
@@ -135,7 +134,7 @@ public class ErrorHandler extends Abstra
             PrintWriter pw = new PrintWriter(sw);
             th.printStackTrace(pw);
             pw.flush();
-            writer.write(deScript(sw.getBuffer().toString()));
+            write(writer,sw.getBuffer().toString());
             writer.write("</pre>\n");
 
             th =th.getCause();
@@ -162,13 +161,34 @@ public class ErrorHandler extends Abstra
     }
 
     /* ------------------------------------------------------------ */
-    protected String deScript(String string)
+    protected void write(Writer writer,String string)
+        throws IOException
     {
         if (string==null)
-            return null;
-        string=StringUtil.replace(string, "&", "&amp;");
-        string=StringUtil.replace(string, "<", "&lt;");
-        string=StringUtil.replace(string, ">", "&gt;");
-        return string;
+            return;
+        
+        for (int i=0;i<string.length();i++)
+        {
+            char c=string.charAt(i);
+            
+            switch(c)
+            {
+                case '&' :
+                    writer.write("&amp;");
+                    break;
+                case '<' :
+                    writer.write("&lt;");
+                    break;
+                case '>' :
+                    writer.write("&gt;");
+                    break;
+                    
+                default:
+                    if (Character.isISOControl(c) && !Character.isWhitespace(c))
+                        writer.write('?');
+                    else 
+                        writer.write(c);
+            }          
+        }
     }
 }
diff -up ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java.fix2 ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java
--- ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java.fix2	2009-11-03 12:46:07.000000000 -0500
+++ ./modules/jetty/src/main/java/org/mortbay/jetty/HttpParser.java	2009-11-03 12:47:35.000000000 -0500
@@ -465,7 +465,15 @@ public class HttpParser implements Parse
                                         case HttpHeaders.CONTENT_LENGTH_ORDINAL:
                                             if (_contentLength != HttpTokens.CHUNKED_CONTENT)
                                             {
-                                                _contentLength=BufferUtil.toLong(value);
+                                                try
+                                                {
+                                                    _contentLength=BufferUtil.toLong(value);
+                                                }
+                                                catch(NumberFormatException e)
+                                                {
+                                                    Log.ignore(e);
+                                                    throw new HttpException(HttpServletResponse.SC_BAD_REQUEST);
+                                                }
                                                 if (_contentLength <= 0)
                                                     _contentLength=HttpTokens.NO_CONTENT;
                                             }
diff -up ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java.fix2 ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java
--- ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java.fix2	2009-11-03 12:47:02.000000000 -0500
+++ ./modules/util/src/main/java/org/mortbay/log/StdErrLog.java	2009-11-03 12:48:00.000000000 -0500
@@ -26,8 +26,10 @@ import org.mortbay.util.DateCache;
 public class StdErrLog implements Logger
 {    
     private static DateCache _dateCache;
-    private static boolean debug = System.getProperty("DEBUG",null)!=null;
-    private String name;
+    private static boolean __debug = System.getProperty("DEBUG",null)!=null;
+    private String _name;
+    
+    StringBuffer _buffer = new StringBuffer();
     
     static
     {
@@ -49,44 +51,59 @@ public class StdErrLog implements Logger
     
     public StdErrLog(String name)
     {    
-        this.name=name==null?"":name;
+        this._name=name==null?"":name;
     }
     
     public boolean isDebugEnabled()
     {
-        return debug;
+        return __debug;
     }
     
     public void setDebugEnabled(boolean enabled)
     {
-        debug=enabled;
+        __debug=enabled;
     }
     
     public void info(String msg,Object arg0, Object arg1)
     {
         String d=_dateCache.now();
         int ms=_dateCache.lastMs();
-        System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":INFO:  "+format(msg,arg0,arg1));
+        synchronized(_buffer)
+        {
+            tag(d,ms,":INFO:");
+            format(msg,arg0,arg1);
+            System.err.println(_buffer.toString());
+        }
     }
     
     public void debug(String msg,Throwable th)
     {
-        if (debug)
+        if (__debug)
         {
             String d=_dateCache.now();
             int ms=_dateCache.lastMs();
-            System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":DEBUG: "+msg);
-            if (th!=null) th.printStackTrace();
+            synchronized(_buffer)
+            {
+                tag(d,ms,":DBUG:");
+                format(msg);
+                format(th);
+                System.err.println(_buffer.toString());
+            }
         }
     }
     
     public void debug(String msg,Object arg0, Object arg1)
     {
-        if (debug)
+        if (__debug)
         {
             String d=_dateCache.now();
             int ms=_dateCache.lastMs();
-            System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":DEBUG: "+format(msg,arg0,arg1));
+            synchronized(_buffer)
+            {
+                tag(d,ms,":DBUG:");
+                format(msg,arg0,arg1);
+                System.err.println(_buffer.toString());
+            }
         }
     }
     
@@ -94,42 +111,126 @@ public class StdErrLog implements Logger
     {
         String d=_dateCache.now();
         int ms=_dateCache.lastMs();
-        System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":WARN:  "+format(msg,arg0,arg1));
+        synchronized(_buffer)
+        {
+            tag(d,ms,":WARN:");
+            format(msg,arg0,arg1);
+            System.err.println(_buffer.toString());
+        }
     }
     
     public void warn(String msg, Throwable th)
     {
         String d=_dateCache.now();
         int ms=_dateCache.lastMs();
-        System.err.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+":WARN:  "+msg);
-        if (th!=null)
-            th.printStackTrace();
+        synchronized(_buffer)
+        {
+            tag(d,ms,":WARN:");
+            format(msg);
+            format(th);
+            System.err.println(_buffer.toString());
+        }
     }
-
-    private String format(String msg, Object arg0, Object arg1)
+    
+    private void tag(String d,int ms,String tag)
+    {
+        _buffer.setLength(0);
+        _buffer.append(d);
+        if (ms>99)
+            _buffer.append('.');
+        else if (ms>9)
+            _buffer.append(".0");
+        else
+            _buffer.append(".00");
+        _buffer.append(ms).append(tag).append(_name).append(':');
+    }
+    
+    private void format(String msg, Object arg0, Object arg1)
     {
         int i0=msg.indexOf("{}");
         int i1=i0<0?-1:msg.indexOf("{}",i0+2);
         
-        if (arg1!=null && i1>=0)
-            msg=msg.substring(0,i1)+arg1+msg.substring(i1+2);
-        if (arg0!=null && i0>=0)
-            msg=msg.substring(0,i0)+arg0+msg.substring(i0+2);
-        return msg;
+        if (i0>=0)
+        {
+            format(msg.substring(0,i0));
+            format(String.valueOf(arg0));
+            
+            if (i1>=0)
+            {
+                format(msg.substring(i0+2,i1));
+                format(String.valueOf(arg1));
+                format(msg.substring(i1+2));
+            }
+            else
+            {
+                format(msg.substring(i0+2));
+                if (arg1!=null)
+                {
+                    _buffer.append(' ');
+                    format(String.valueOf(arg1));
+                }
+            }
+        }
+        else
+        {
+            format(msg);
+            if (arg0!=null)
+            {
+                _buffer.append(' ');
+                format(String.valueOf(arg0));
+            }
+            if (arg1!=null)
+            {
+                _buffer.append(' ');
+                format(String.valueOf(arg1));
+            }
+        }
+    }
+    
+    private void format(String msg)
+    {
+        for (int i=0;i<msg.length();i++)
+        {
+            char c=msg.charAt(i);
+            if (Character.isISOControl(c))
+            {
+                if (c=='\n')
+                    _buffer.append('|');
+                else if (c=='\r')
+                    _buffer.append('<');
+                else
+                    _buffer.append('?');
+            }
+            else
+                _buffer.append(c);
+        }
+    }
+    
+    private void format(Throwable th)
+    {
+        _buffer.append('\n');
+        format(th.toString());
+        StackTraceElement[] elements = th.getStackTrace();
+        for (int i=0;elements!=null && i<elements.length;i++)
+        {
+            _buffer.append("\n\tat ");
+            format(elements[i].toString());
+        }
     }
     
     public Logger getLogger(String name)
     {
-        if ((name==null && this.name==null) ||
-            (name!=null && name.equals(this.name)))
+        if ((name==null && this._name==null) ||
+            (name!=null && name.equals(this._name)))
             return this;
         return new StdErrLog(name);
     }
     
     public String toString()
     {
-        return "STDERR"+name;
+        return "STDERR"+_name;
     }
+    
 
 }