// // System.Web.HttpException // // Authors: // Patrik Torstensson (Patrik.Torstensson@labs2.com) // Gonzalo Paniagua Javier (gonzalo@ximian.com) // // (c) 2002 Patrik Torstensson // (c) 2003 Ximian, Inc. (http://www.ximian.com) // Copyright (C) 2005 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System.IO; using System.Runtime.Serialization; using System.Runtime.InteropServices; using System.Security.Permissions; using System.Text; using System.Web.Util; #if !TARGET_J2EE using System.Web.Compilation; #endif namespace System.Web { // CAS [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] #if NET_2_0 [Serializable] #endif public class HttpException : ExternalException { int http_code = 500; public HttpException () { } public HttpException (string message) : base (message) { } public HttpException (string message, Exception innerException) : base (message, innerException) { } public HttpException (int httpCode, string message) : base (message) { http_code = httpCode; } #if NET_2_0 protected HttpException (SerializationInfo info, StreamingContext context) : base (info, context) { http_code = info.GetInt32 ("_httpCode"); } [SecurityPermission (SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("_httpCode", http_code); } #endif public HttpException (int httpCode, string message, int hr) : base (message, hr) { http_code = httpCode; } public HttpException (string message, int hr) : base (message, hr) { } public HttpException (int httpCode, string message, Exception innerException) : base (message, innerException) { http_code = httpCode; } public string GetHtmlErrorMessage () { if (!(this.InnerException is HtmlizedException)) return GetDefaultErrorMessage (); return GetHtmlizedErrorMessage (); } internal virtual string Description { get { return "Error processing request."; } } string GetDefaultErrorMessage () { StringBuilder builder = new StringBuilder ("\r\n
\r\n", Description); builder.Append ("Error Message: "); if (http_code != 0) builder.AppendFormat ("HTTP {0}. ", http_code); builder.AppendFormat ("{0}\r\n
\r\n", HtmlEncode (this.Message)); if (InnerException != null) { builder.AppendFormat ("Stack Trace: "); builder.Append ("
"); WriteTextAsCode (builder, InnerException.ToString ()); #if TARGET_J2EE //Required, because toString of Java doesn't print stackTrace WriteTextAsCode (builder, InnerException.StackTrace); #endif builder.Append (" |
\r\n"); } builder.Append ("
\r\n", HtmlEncode (exc.Description)); builder.AppendFormat ("Error message: {0}\r\n
\r\n", HtmlEncode (exc.ErrorMessage)); if (exc.FileName != null) builder.AppendFormat ("File name: {0}", HtmlEncode (exc.FileName)); if (exc.FileText != null) { if (exc.SourceFile != exc.FileName) builder.AppendFormat ("
Source File: {0}", exc.SourceFile); builder.Append ("\r\n
\r\n"); builder.Append ("
"); WriteSource (builder, exc); builder.Append (" |
\r\n"); } builder.Append ("
\r\n", HtmlEncode (exc.Description)); builder.AppendFormat ("Error message: {0}\r\n
\r\n", HtmlEncode (exc.ErrorMessage)); if (exc.FileName != null) builder.AppendFormat ("File name: {0}", HtmlEncode (exc.FileName)); if (exc.FileText != null) { if (exc.SourceFile != exc.FileName) builder.AppendFormat ("
Source File: {0}", exc.SourceFile); if (exc is ParseException) { builder.Append (" Line: "); builder.Append (exc.ErrorLines [0]); } builder.Append ("\r\n
\r\n"); if (exc is ParseException) { builder.Append ("Source Error: \r\n"); builder.Append ("
"); WriteSource (builder, exc); builder.Append (" |
\r\n"); } else { builder.Append ("
"); WriteSource (builder, exc); builder.Append (" |
\r\n"); } } builder.Append ("
\r\n");
builder.AppendFormat ("{0}", HtmlEncode (text));
builder.Append ("
\r\n");
}
#if TARGET_J2EE
static void WriteSource (StringBuilder builder, HtmlizedException e)
{
builder.Append ("");
WritePageSource (builder, e);
builder.Append ("
\r\n");
}
#else
static void WriteSource (StringBuilder builder, HtmlizedException e)
{
builder.Append ("");
if (e is CompilationException)
WriteCompilationSource (builder, e);
else
WritePageSource (builder, e);
builder.Append ("
\r\n");
}
#endif
static void WriteCompilationSource (StringBuilder builder, HtmlizedException e)
{
int [] a = e.ErrorLines;
string s;
int line = 0;
int index = 0;
int errline = 0;
if (a != null && a.Length > 0)
errline = a [0];
TextReader reader = new StringReader (e.FileText);
while ((s = reader.ReadLine ()) != null) {
line++;
if (errline == line)
builder.Append ("");
builder.AppendFormat ("Line {0}: {1}\r\n", line, HtmlEncode (s));
if (line == errline) {
builder.Append ("");
errline = (++index < a.Length) ? a [index] : 0;
}
}
}
static void WritePageSource (StringBuilder builder, HtmlizedException e)
{
string s;
int line = 0;
int beginerror = e.ErrorLines [0];
int enderror = e.ErrorLines [1];
int begin = beginerror - 3;
int end = enderror + 3;
if (begin <= 0)
begin = 1;
TextReader reader = new StringReader (e.FileText);
while ((s = reader.ReadLine ()) != null) {
line++;
if (line < begin)
continue;
if (line > end)
break;
if (beginerror == line)
builder.Append ("");
builder.AppendFormat ("{0}\r\n", HtmlEncode (s));
if (enderror <= line) {
builder.Append ("");
enderror = end + 1; // one shot
}
}
}
public int GetHttpCode ()
{
return http_code;
}
public static HttpException CreateFromLastError (string message)
{
WebTrace.WriteLine ("CreateFromLastError");
return new HttpException (message, 0);
}
}
}