2009-06-04 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web / HttpException.cs
index f6c2151f50e0588f17d6ce93b65f7e6cef93423f..6385ffe7cb325273c38e77e17cc1d297dcaada43 100644 (file)
@@ -87,12 +87,17 @@ namespace System.Web
                }
                
 #if NET_2_0
-               protected HttpException (SerializationInfo info, StreamingContext context)
+               protected
+#else
+               internal
+#endif
+               HttpException (SerializationInfo info, StreamingContext context)
                        : base (info, context)
                {
                        http_code = info.GetInt32 ("_httpCode");
                }
 
+#if NET_2_0
                [SecurityPermission (SecurityAction.Demand, SerializationFormatter = true)]
                public override void GetObjectData (SerializationInfo info, StreamingContext context)
                {
@@ -118,7 +123,7 @@ namespace System.Web
                        http_code = httpCode;
                }
 
-               public HttpException (int httpCode, string message, Exception innerException, string resourceName)
+               internal HttpException (int httpCode, string message, Exception innerException, string resourceName)
                        : this (httpCode, message, innerException)
                {
                        resource_name = resourceName;
@@ -127,11 +132,16 @@ namespace System.Web
                public string GetHtmlErrorMessage ()
                {
                        try {
-                               if (HttpContext.Current.IsCustomErrorEnabled)
-                                       return GetCustomErrorDefaultMessage ();
+                               HttpContext ctx = HttpContext.Current;
+                               if (ctx != null && ctx.IsCustomErrorEnabled) {
+                                       if (http_code != 404 && http_code != 403)
+                                               return GetCustomErrorDefaultMessage ();
+                                       else
+                                               return GetDefaultErrorMessage (false);
+                               }
                                
                                if (!(this.InnerException is HtmlizedException))
-                                       return GetDefaultErrorMessage ();
+                                       return GetDefaultErrorMessage (true);
                                
                                return GetHtmlizedErrorMessage ();
                        } catch (Exception ex) {
@@ -162,6 +172,23 @@ namespace System.Web
 
                void WriteFileTop (StringBuilder builder, string title)
                {
+#if TARGET_J2EE
+                       builder.AppendFormat ("<html><head><title>{0}</title><style type=\"text/css\">", title);
+                       builder.AppendFormat (
+                               @"body {{font-family:{0};font-weight:normal;font-size: 9pt;color:black;background-color: white}}
+p {{font-family:{0};font-weight:normal;color:black;margin-top: -5px}}
+b {{font-family:{0};font-weight:bold;color:black;margin-top: -5px}}
+h1 {{ font-family:{0};font-weight:normal;font-size:18pt;color:red }}
+h2 {{ font-family:{0};font-weight:normal;font-size:14pt;color:maroon }}
+pre {{font-family:""Lucida Console"",""DejaVu Sans Mono"",monospace;font-size: 10pt}}
+div.bodyText {{font-family: {0}}}
+table.sampleCode {{width: 100%; background-color: #ffffcc; }}
+.errorText {{color: red; font-weight: bold}}
+.marker {{font-weight: bold; color: black;text-decoration: none;}}
+.version {{color: gray;}}
+.error {{margin-bottom: 10px;}}
+.expandable {{ text-decoration:underline; font-weight:bold; color:navy; cursor:pointer; }}", errorStyleFonts);
+#else
                        builder.Append ("<?xml version=\"1.0\" ?>\n");
                        builder.Append ("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
                        builder.AppendFormat ("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"><head><title>{0}</title><style type=\"text/css\">", title);
@@ -171,7 +198,7 @@ p {{font-family:{0};font-weight:normal;color:black;margin-top: -5px}}
 b {{font-family:{0};font-weight:bold;color:black;margin-top: -5px}}
 h1 {{ font-family:{0};font-weight:normal;font-size:18pt;color:red }}
 h2 {{ font-family:{0};font-weight:normal;font-size:14pt;color:maroon }}
-pre {{font-family:""Lucida Console"",""DejaVu Sans Mono"",monospace;font-size: 0.9em}}
+pre,code {{font-family:""Lucida Console"",""DejaVu Sans Mono"",monospace;font-size: 0.9em,white-space: pre-line}}
 div.bodyText {{font-family: {0}}}
 table.sampleCode {{width: 100%; background-color: #ffffcc; }}
 .errorText {{color: red; font-weight: bold}}
@@ -179,39 +206,44 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
 .version {{color: gray;}}
 .error {{margin-bottom: 10px;}}
 .expandable {{ text-decoration:underline; font-weight:bold; color:navy; cursor:pointer; }}", errorStyleFonts);
+#endif
 
                        builder.AppendFormat (
                                "</style></head><body><h1>Server Error in '{0}' Application</h1><hr style=\"color: silver\"/>",
                                HtmlEncode (HttpRuntime.AppDomainAppVirtualPath));
                }
                
-               void WriteFileBottom (StringBuilder builder)
+               void WriteFileBottom (StringBuilder builder, bool showTrace)
                {
-                       builder.Append ("<hr style=\"color: silver\"/>");
-                       builder.AppendFormat ("<strong>Version information: </strong> Mono Version: {0}; ASP.NET Version: {0}</body></html>\r\n<!--", Environment.Version);
+                       if (showTrace) {
+                               builder.Append ("<hr style=\"color: silver\"/>");
+                               builder.AppendFormat ("<strong>Version information: </strong> Mono Version: {0}; ASP.NET Version: {0}</body></html>\r\n", Environment.Version);
                        
-                       string trace, message;
-                       bool haveTrace;
-                       Exception ex = this;
-                       
-                       while (ex != null) {
-                               trace = ex.StackTrace;
-                               message = ex.Message;
-                               haveTrace = (trace != null && trace.Length > 0);
+                               string trace, message;
+                               bool haveTrace;
+                               Exception ex = this;
+
+                               builder.Append ("\r\n<!--");
+                               while (ex != null) {
+                                       trace = ex.StackTrace;
+                                       message = ex.Message;
+                                       haveTrace = (trace != null && trace.Length > 0);
                                
-                               if (!haveTrace && (message == null || message.Length == 0)) {
-                                       ex = ex.InnerException;
-                                       continue;
-                               }
+                                       if (!haveTrace && (message == null || message.Length == 0)) {
+                                               ex = ex.InnerException;
+                                               continue;
+                                       }
 
-                               builder.Append ("\r\n[" + ex.GetType () + "]: " + HtmlEncode (message) + "\r\n");
-                               if (haveTrace)
-                                       builder.Append (ex.StackTrace);
+                                       builder.Append ("\r\n[" + ex.GetType () + "]: " + HtmlEncode (message) + "\r\n");
+                                       if (haveTrace)
+                                               builder.Append (ex.StackTrace);
                                
-                               ex = ex.InnerException;
-                       }
+                                       ex = ex.InnerException;
+                               }
                        
-                       builder.Append ("\r\n-->");
+                               builder.Append ("\r\n-->");
+                       } else
+                               builder.Append ("</body></html>\r\n");
                }
 
                string GetCustomErrorDefaultMessage ()
@@ -262,11 +294,11 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
 
     &lt;/system.web&gt;
 &lt;/configuration&gt;</pre></td></tr></table>");
-                       WriteFileBottom (builder);
+                       WriteFileBottom (builder, false);
                        return builder.ToString ();
                }
                
-               string GetDefaultErrorMessage ()
+               string GetDefaultErrorMessage (bool showTrace)
                {
                        Exception ex, baseEx;
                        ex = baseEx = GetBaseException ();
@@ -279,7 +311,7 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
                        if (http_code == 404)
                                builder.Append ("The resource cannot be found.");
                        else
-                               builder.AppendFormat (HtmlEncode (ex.Message));
+                               builder.Append (HtmlEncode (ex.Message));
                        builder.Append ("</em></h2>\r\n<p><strong>Description: </strong>");
                        
                        if (http_code != 0)
@@ -288,15 +320,15 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
                        builder.Append ("</p>\r\n");
 
                        if (resource_name != null && resource_name.Length > 0)
-                               builder.AppendFormat ("<p><strong>Resource URL: </strong>{0}</p>\r\n", resource_name);
+                               builder.AppendFormat ("<p><strong>Requested URL: </strong>{0}</p>\r\n", resource_name);
                        
-                       if (baseEx != null && http_code != 404) {
+                       if (showTrace && baseEx != null && http_code != 404 && http_code != 403) {
                                builder.Append ("<p><strong>Stack Trace: </strong></p>");
                                builder.Append ("<table summary=\"Stack Trace\" class=\"sampleCode\">\r\n<tr><td>");
                                WriteTextAsCode (builder, baseEx.ToString ());
                                builder.Append ("</td></tr>\r\n</table>\r\n");
                        }
-                       WriteFileBottom (builder);
+                       WriteFileBottom (builder, showTrace);
                        
                        return builder.ToString ();
                }
@@ -325,7 +357,7 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
                        WriteFileTop (builder, exc.Title);
                        builder.AppendFormat ("<h2><em>{0}</em></h2>\r\n", exc.Title);
                        builder.AppendFormat ("<p><strong>Description: </strong>{0}\r\n</p>\r\n", HtmlEncode (exc.Description));
-                       string errorMessage = HtmlEncode (exc.ErrorMessage).Replace ("\n", "<br/>");
+                       string errorMessage = HtmlEncode (exc.ErrorMessage);
                        
                        builder.Append ("<p><strong>");
                        if (isParseException)
@@ -333,7 +365,12 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
                        else if (isCompileException)
                                builder.Append ("Compiler ");
                        
-                       builder.AppendFormat ("Error Message: </strong>{0}</p>", errorMessage);
+                       builder.Append ("Error Message: </strong>");
+#if NET_2_0
+                       builder.AppendFormat ("<code>{0}</code></p>", errorMessage);
+#else
+                       builder.AppendFormat ("<blockquote><pre>{0}</pre></blockquote></p>", errorMessage);
+#endif
 
                        StringBuilder longCodeVersion = null;
                        
@@ -358,9 +395,17 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
                                else
                                        builder.Append (exc.FileName);
 
-                               if ((isParseException || isCompileException) && exc.ErrorLines.Length > 0) {
-                                       builder.Append ("&nbsp;&nbsp;<strong>Line: </strong>");
-                                       builder.Append (exc.ErrorLines [0]);
+                               if (isParseException || isCompileException) {
+                                       int[] errorLines = exc.ErrorLines;
+                                       int numErrors = errorLines != null ? errorLines.Length : 0;
+                                       if (numErrors > 0) {
+                                               builder.AppendFormat ("&nbsp;&nbsp;<strong>Line{0}: </strong>", numErrors > 1 ? "s" : String.Empty);
+                                               for (int i = 0; i < numErrors; i++) {
+                                                       if (i > 0)
+                                                               builder.Append (", ");
+                                                       builder.Append (exc.ErrorLines [i]);
+                                               }
+                                       }
                                }
                                builder.Append ("</p>");
                        } else if (exc.FileName != null)
@@ -378,13 +423,13 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
                                        StringBuilder sb = new StringBuilder ();
                                        foreach (string s in output)
                                                sb.Append (s + "\r\n");
-                                       WriteExpandableBlock (builder, "Show Detailed Compiler Output", sb.ToString ());
+                                       WriteExpandableBlock (builder, "compilerOutput", "Show Detailed Compiler Output", sb.ToString ());
                                }
                        }
 #endif
                        
                        if (longCodeVersion != null && longCodeVersion.Length > 0) {
-                               WriteExpandableBlock (builder, "Show Complete Compilation Source", longCodeVersion.ToString ());
+                               WriteExpandableBlock (builder, "fullCode", "Show Complete Compilation Source", longCodeVersion.ToString ());
                                needToggleJS = true;
                        }
 
@@ -402,16 +447,16 @@ table.sampleCode {{width: 100%; background-color: #ffffcc; }}
                                                "}\r\n" +
                                                "</script>\r\n");
                        
-                       WriteFileBottom (builder);
+                       WriteFileBottom (builder, true);
                        
                        return builder.ToString ();
                }
 
-               static void WriteExpandableBlock (StringBuilder builder, string title, string contents)
+               static void WriteExpandableBlock (StringBuilder builder, string id, string title, string contents)
                {
-                       builder.AppendFormat ("<br><div class=\"expandable\" onclick=\"ToggleVisible ('fullCode')\">{0}:</div><br/>" +
-                                             "<div id=\"fullCode\" style=\"display: none\"><table summary=\"Details\" class=\"sampleCode\"><tr><td>" +
-                                             "<code><pre>\r\n", title);
+                       builder.AppendFormat ("<br><div class=\"expandable\" onclick=\"ToggleVisible ('{1}')\">{0}:</div><br/>" +
+                                             "<div id=\"{1}\" style=\"display: none\"><table summary=\"Details\" class=\"sampleCode\"><tr><td>" +
+                                             "<code><pre>\r\n", title, id);
                        builder.Append (contents);
                        builder.Append ("</pre></code></td></tr></table></div>");
                }