using System; using System.Net; using System.Runtime.Serialization; using System.Security.Permissions; using System.Web; namespace WebDAVSharp.Server.Exceptions { /// /// This exception, or a descendant, is thrown when requests fail, specifying the status code /// that the server should return back to the client. /// [Serializable] public class WebDavException : HttpException { private const string StatusCodeKey = "StatusCode"; private const string StatusDescriptionKey = "StatusDescription"; /// /// Initializes a new instance of the class. /// public WebDavException() : this(HttpStatusCode.InternalServerError) { // Do nothing here } /// /// Initializes a new instance of the class. /// /// The exception message stating the reason for the exception being thrown. public WebDavException(string message) : this(HttpStatusCode.InternalServerError, message) { // Do nothing here } /// /// Initializes a new instance of the class. /// /// The exception message stating the reason for the exception being thrown. /// The /// that is the cause for this exception; /// or /// null if no inner exception is specified. public WebDavException(string message, Exception innerException) : this(HttpStatusCode.InternalServerError, message, innerException) { // Do nothing here } /// /// Initializes a new instance of the class. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// The parameter is null. /// The class name is null or is zero (0). protected WebDavException(SerializationInfo info, StreamingContext context) : base(info, context) { StatusCode = info.GetInt32(StatusCodeKey); StatusDescription = info.GetString(StatusDescriptionKey); } /// /// Initializes a new instance of the class. /// /// The HTTP status code that this maps to. /// The exception message stating the reason for the exception being thrown. /// The /// that is the cause for this exception; /// or /// null if no inner exception is specified. public WebDavException(HttpStatusCode statusCode, string message = null, Exception innerException = null) : base(GetMessage(statusCode, message), innerException) { StatusCode = (int)statusCode; StatusDescription = HttpWorkerRequest.GetStatusDescription((int)statusCode); } /// /// Gets the HTTP status code that this maps to. /// /// /// The status code. /// public int StatusCode { get; private set; } /// /// Gets the status description for the HTTP . /// /// /// The status description. /// public string StatusDescription { get; private set; } /// /// When overridden in a derived class, sets the with information about the exception. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// The parameter is a null reference (Nothing in Visual Basic). [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { base.GetObjectData(info, context); info.AddValue(StatusCodeKey, StatusCode); info.AddValue(StatusDescriptionKey, StatusDescription); } /// /// Gets the message. /// /// The status code. /// The message. /// The message and the status description. private static string GetMessage(HttpStatusCode statusCode, string message) { string format = "%s"; if (!String.IsNullOrWhiteSpace(message)) format = message; return format.Replace("%s", HttpWorkerRequest.GetStatusDescription((int)statusCode)); } } }