From 737af93b31c9b306a24363ff8b843819b6db4940 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 28 Nov 2011 16:42:32 -0800 Subject: [PATCH] #17160: Displaying clearer error messages in Live Writer Work Item: 17160 --HG-- branch : 1.x --- .../Core/XmlRpc/Controllers/HomeController.cs | 17 ++++++++++++-- .../Core/XmlRpc/Models/XRpcData.cs | 5 +++++ .../Core/XmlRpc/Models/XRpcMethodResponse.cs | 1 + .../Core/XmlRpc/Services/XmlRpcWriter.cs | 22 +++++++++++++++---- .../Orchard.Blogs/Services/XmlRpcHandler.cs | 5 +++-- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs b/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs index 9a1bc0eab..66f964e03 100644 --- a/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs +++ b/src/Orchard.Web/Core/XmlRpc/Controllers/HomeController.cs @@ -35,8 +35,21 @@ namespace Orchard.Core.XmlRpc.Controllers { private XRpcMethodResponse Dispatch(XRpcMethodCall request) { var context = new XmlRpcContext { ControllerContext = ControllerContext, HttpContext = HttpContext, Request = request }; - foreach (var handler in _xmlRpcHandlers) - handler.Process(context); + try { + foreach (var handler in _xmlRpcHandlers) { + handler.Process(context); + } + } + catch (OrchardCoreException e) { + // if a core exception is raised, report the error message, otherwise signal a 500 + context.Response = context.Response ?? new XRpcMethodResponse(); + + context.Response.Fault = new XRpcFault { + Code = 0, + Message = e.LocalizedMessage.ToString() + }; + } + return context.Response; } } diff --git a/src/Orchard.Web/Core/XmlRpc/Models/XRpcData.cs b/src/Orchard.Web/Core/XmlRpc/Models/XRpcData.cs index 1bd4a6e1c..fd9c317b0 100644 --- a/src/Orchard.Web/Core/XmlRpc/Models/XRpcData.cs +++ b/src/Orchard.Web/Core/XmlRpc/Models/XRpcData.cs @@ -39,4 +39,9 @@ namespace Orchard.Core.XmlRpc.Models { public override Type Type { get { return typeof(T); } } } + + public class XRpcFault { + public string Message { get; set; } + public int Code { get; set; } + } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/XmlRpc/Models/XRpcMethodResponse.cs b/src/Orchard.Web/Core/XmlRpc/Models/XRpcMethodResponse.cs index 2e31344e6..83ef59dd4 100644 --- a/src/Orchard.Web/Core/XmlRpc/Models/XRpcMethodResponse.cs +++ b/src/Orchard.Web/Core/XmlRpc/Models/XRpcMethodResponse.cs @@ -5,6 +5,7 @@ namespace Orchard.Core.XmlRpc.Models { public XRpcMethodResponse() { Params = new List(); } public IList Params { get; set; } + public XRpcFault Fault { get; set; } public XRpcMethodResponse Add(T value) { Params.Add(XRpcData.For(value)); diff --git a/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs b/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs index a67b12daa..1249ea20f 100644 --- a/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs +++ b/src/Orchard.Web/Core/XmlRpc/Services/XmlRpcWriter.cs @@ -41,10 +41,24 @@ namespace Orchard.Core.XmlRpc.Services { public XElement MapMethodResponse(XRpcMethodResponse rpcMethodResponse) { Argument.ThrowIfNull(rpcMethodResponse, "rpcMethodResponse"); - return new XElement( - "methodResponse", - new XElement( - "params", + // return a valid fault as per http://xmlrpc.scripting.com/spec.html + if(rpcMethodResponse.Fault != null) { + return new XElement("methodResponse", + new XElement("fault", + new XElement("value", + new XElement("struct", + new XElement("member", + new XElement("name", "faultCode"), + new XElement("value", + new XElement("int", rpcMethodResponse.Fault.Code))), + new XElement("member", + new XElement("name", "faultString"), + new XElement("value", + new XElement("string", rpcMethodResponse.Fault.Message))))))); + } + + return new XElement("methodResponse", + new XElement("params", rpcMethodResponse.Params.Select( p => new XElement("param", MapValue(p))))); } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/XmlRpcHandler.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/XmlRpcHandler.cs index 832756bc3..320aad7b0 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Services/XmlRpcHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/XmlRpcHandler.cs @@ -257,8 +257,9 @@ namespace Orchard.Blogs.Services { IUser user = ValidateUser(userName, password); var blogPost = _blogPostService.Get(postId, VersionOptions.DraftRequired); - if (blogPost == null) - throw new ArgumentException(); + if (blogPost == null) { + throw new OrchardCoreException(T("The specified Blog Post doesn't exist anymore. Please create a new Blog Post.")); + } _authorizationService.CheckAccess(publish ? Permissions.PublishBlogPost : Permissions.EditBlogPost, user, blogPost);