User: johnsimons
Date: 2010/01/14 01:18 PM

Modified:
 /MonoRail/trunk/lib/
  Newtonsoft.Json.XML, Newtonsoft.Json.dll
 /MonoRail/trunk/src/
  Changes.txt
 /MonoRail/trunk/src/Castle.MonoRail.Framework.Tests/
  UrlPartsBuilderTestCase.cs
 /MonoRail/trunk/src/Castle.MonoRail.Framework/Services/
  DefaultUrlBuilder.cs, UrlParts.cs
 /MonoRail/trunk/src/Castle.MonoRail.Framework/ViewComponents/
  AbstractPaginationViewComponent.cs

Log:
 - Applied Michael Davis patch fixing MR-ISSUE-494
  "AbstractPaginationViewComponent with PreserveQueryString = true 
double-encodes query string parameters"
 - Updated Newtonsoft.Json.dll to v3.5.0.0

File Changes:

Directory: /MonoRail/trunk/src/Castle.MonoRail.Framework.Tests/
===============================================================

File [modified]: UrlPartsBuilderTestCase.cs
Delta lines: +5 -0
===================================================================

--- MonoRail/trunk/src/Changes.txt      2010-01-14 17:27:00 UTC (rev 6667)
+++ MonoRail/trunk/src/Changes.txt      2010-01-14 20:18:34 UTC (rev 6668)
@@ -1,5 +1,10 @@
 Unreleased
 ==========
+- Applied Michael Davis patch fixing MR-ISSUE-494
+ "AbstractPaginationViewComponent with PreserveQueryString = true 
double-encodes query string parameters"
+
+- Updated Newtonsoft.Json.dll to v3.5.0.0
+
 - Removed HtmlHelper and ValidationHelper
 

Directory: /MonoRail/trunk/src/Castle.MonoRail.Framework/Services/
==================================================================

File [modified]: DefaultUrlBuilder.cs
Delta lines: +18 -14
===================================================================

--- MonoRail/trunk/src/Castle.MonoRail.Framework/Services/UrlParts.cs   
2010-01-14 17:27:00 UTC (rev 6667)
+++ MonoRail/trunk/src/Castle.MonoRail.Framework/Services/UrlParts.cs   
2010-01-14 20:18:34 UTC (rev 6668)
@@ -26,6 +26,7 @@
        public class UrlParts
        {
                private readonly StringBuilder url;
+               private readonly IServerUtility serverUtility;
                private PathInfoBuilder pathInfoBuilder;
                private PathInfoDictBuilder pathInfoDictBuilder;
                private bool nextPathBelongsToPathInfo;
@@ -35,10 +36,12 @@
                /// <summary>
                /// Initializes a new instance of the <see cref="UrlParts"/> 
class.
                /// </summary>
+               /// <param name="serverUtility">The server utility.</param>
                /// <param name="pathPieces">The path pieces.</param>
-               public UrlParts(params string[] pathPieces)
+               public UrlParts(IServerUtility serverUtility, params string[] 
pathPieces)
                {
                        url = new StringBuilder();
+                       this.serverUtility = serverUtility;
 
                        AppendPaths(pathPieces);
                }
@@ -46,9 +49,10 @@
                /// <summary>
                /// Pendent
                /// </summary>
+               /// <param name="serverUtility">The server utility.</param>
                /// <param name="url">The URL.</param>
                /// <returns></returns>
-               public static UrlParts Parse(string url)
+               public static UrlParts Parse(IServerUtility serverUtility, 
string url)
                {
                        if (url == null)
                        {
@@ -59,11 +63,11 @@
 
                        if (uri.IsAbsoluteUri)
                        {
-                               return CreateForAbsolutePath(uri);
+                               return CreateForAbsolutePath(serverUtility, 
uri);
                        }
                        else
                        {
-                               return CreateForRelativePath(url);
+                               return CreateForRelativePath(serverUtility, 
url);
                        }
                }
 
@@ -140,7 +144,7 @@
                {
                        if (queryStringDict != null)
                        {
-                               queryString = 
CommonUtils.BuildQueryString(queryStringDict);
+                               queryString = 
CommonUtils.BuildQueryString(serverUtility, queryStringDict, false);
                        }
 
                        return queryString;
@@ -192,7 +196,7 @@
                /// Builds the path.
                /// </summary>
                /// <returns></returns>
-               public string BuildPathForLink(IServerUtility serverUtiliy)
+               public string BuildPathForLink()
                {
                        StringBuilder sb = new StringBuilder(url.ToString());
 
@@ -201,12 +205,12 @@
                        if (queryStringDict != null && queryStringDict.Count != 
0)
                        {
                                sb.Append('?');
-                               
sb.Append(CommonUtils.BuildQueryString(serverUtiliy, QueryString, true));
+                               
sb.Append(CommonUtils.BuildQueryString(serverUtility, QueryString, true));
                        }
                        else if (!string.IsNullOrEmpty(queryString))
                        {
                                sb.Append('?');
-                               sb.Append(serverUtiliy.HtmlEncode(queryString));
+                               
sb.Append(serverUtility.HtmlEncode(queryString));
                        }
 
                        return sb.ToString();
@@ -305,7 +309,7 @@
                        }
                }
 
-               private static UrlParts CreateForRelativePath(string url)
+               private static UrlParts CreateForRelativePath(IServerUtility 
serverUtility, string url)
                {
                        string path = url;
                        string qs = null;
@@ -332,18 +336,18 @@
                                }
                        }
 
-                       UrlParts parts = new UrlParts(path);
+                       UrlParts parts = new UrlParts(serverUtility, path);
                        parts.SetQueryString(qs);
                        parts.PathInfoDict.Parse(pathInfo);
 
                        return parts;
                }
 
-               private static UrlParts CreateForAbsolutePath(Uri uri)
+               private static UrlParts CreateForAbsolutePath(IServerUtility 
serverUtility, Uri uri)
                {
                        string host = uri.AbsoluteUri.Substring(0, 
uri.AbsoluteUri.Length - uri.PathAndQuery.Length);
 
-                       UrlParts parts = new UrlParts(host);
+                       UrlParts parts = new UrlParts(serverUtility, host);
 
                        foreach (string segment in uri.Segments)
                        {
@@ -356,7 +360,7 @@
                        return parts;
                }
 
-               private static NameValueCollection 
CreateQueryStringNameValueCollection(string queryString)
+               private NameValueCollection 
CreateQueryStringNameValueCollection(string queryString)
                {
                        NameValueCollection coll = new 
NameValueCollection(StringComparer.InvariantCultureIgnoreCase);
 
@@ -371,7 +375,7 @@
 
                                if (pairs.Length == 2)
                                {
-                                       coll.Add(pairs[0], pairs[1]);
+                                       coll.Add(pairs[0], 
serverUtility.UrlDecode(pairs[1]));
                                }
                                else if (pairs.Length == 1)

File [modified]: UrlParts.cs
Delta lines: +4 -4
===================================================================

--- 
MonoRail/trunk/src/Castle.MonoRail.Framework/ViewComponents/AbstractPaginationViewComponent.cs
      2010-01-14 17:27:00 UTC (rev 6667)
+++ 
MonoRail/trunk/src/Castle.MonoRail.Framework/ViewComponents/AbstractPaginationViewComponent.cs
      2010-01-14 20:18:34 UTC (rev 6668)
@@ -214,7 +214,7 @@
                                urlParts.QueryString[pageParamName] = 
pageIndex.ToString();
                        }
 
-                       return urlParts.BuildPathForLink(EngineContext.Server);
+                       return urlParts.BuildPathForLink();
                }
 
                private void CreateUrlPartBuilder()
@@ -232,17 +232,17 @@
                        {
                                if (urlParam != null)
                                {
-                                       urlParts = 
UrlParts.Parse(urlParam.ToString());
+                                       urlParts = 
UrlParts.Parse(EngineContext.Server, urlParam.ToString());
                                }
                                else
                                {
                                        if (!PreserveQueryString) 
                                        {
-                                               urlParts = new 
UrlParts(EngineContext.Request.FilePath);
+                                               urlParts = new 
UrlParts(EngineContext.Server, EngineContext.Request.FilePath);
                                        }
                                        else
                                        {
-                                               urlParts = 
UrlParts.Parse(EngineContext.Request.Url);
+                                               urlParts = 
UrlParts.Parse(EngineContext.Server, EngineContext.Request.Url);
                                        }
                                }

Directory: /MonoRail/trunk/src/Castle.MonoRail.Framework/ViewComponents/
========================================================================

File [modified]: AbstractPaginationViewComponent.cs
Delta lines: +48 -29
===================================================================

--- 
MonoRail/trunk/src/Castle.MonoRail.Framework.Tests/UrlPartsBuilderTestCase.cs   
    2010-01-14 17:27:00 UTC (rev 6667)
+++ 
MonoRail/trunk/src/Castle.MonoRail.Framework.Tests/UrlPartsBuilderTestCase.cs   
    2010-01-14 20:18:34 UTC (rev 6668)
@@ -16,14 +16,23 @@
 {
        using Castle.MonoRail.Framework.Services;
        using NUnit.Framework;
+       using Test;
 
        [TestFixture]
        public class UrlPartsBuilderTestCase
        {
+               private StubServerUtility serverUtil;
+
+               [SetUp]
+               public void Init()
+               {
+                       serverUtil = new StubServerUtility();
+               }
+
                [Test]
                public void CanBuildPathUrls()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                
                        Assert.AreEqual("controller/action", 
builder.BuildPath());
                }
@@ -31,7 +40,7 @@
                [Test]
                public void BuildPathWithPathInfo()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfo.Add("State").Add("FL");
 
                        Assert.AreEqual("controller/action/State/FL", 
builder.BuildPath());
@@ -40,7 +49,7 @@
                [Test]
                public void BuildPathWithPathInfoDictionary()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict["State"] ="FL";
 
                        Assert.AreEqual("controller/action/State/FL", 
builder.BuildPath());
@@ -49,7 +58,7 @@
                [Test]
                public void BuildPathWithPathInfoAndQueryString()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict["State"] = "FL";
                        builder.SetQueryString("type=Residential");
 
@@ -59,7 +68,7 @@
                [Test]
                public void PathInfoDictParse_AcceptsNull()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict.Parse(null);
 
                        Assert.AreEqual("controller/action", 
builder.BuildPath());
@@ -68,7 +77,7 @@
                [Test]
                public void PathInfoDictParse_AcceptsEmptyString()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict.Parse("");
 
                        Assert.AreEqual("controller/action", 
builder.BuildPath());
@@ -77,7 +86,7 @@
                [Test]
                public void PathInfoDictParse_CanHandleMissingSlash()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict.Parse("State/Fl");
 
                        Assert.AreEqual("controller/action/State/Fl", 
builder.BuildPath());
@@ -86,7 +95,7 @@
                [Test]
                public void PathInfoDictParse_CanHandleMultipleEntries()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict.Parse("/State/FL/Type/Home");
 
                        Assert.AreEqual("controller/action/State/FL/Type/Home", 
builder.BuildPath());
@@ -95,7 +104,7 @@
                [Test]
                public void PathInfoDictParse_CanHandleOddNumberOfEntries()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict.Parse("/State/FL/Type/");
 
                        Assert.AreEqual("controller/action/State/FL/Type", 
builder.BuildPath());
@@ -104,7 +113,7 @@
                [Test]
                public void PathInfoDictParse_CanHandleOddNumberOfEntries2()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfoDict.Parse("/State/FL/Type");
 
                        Assert.AreEqual("controller/action/State/FL/Type", 
builder.BuildPath());
@@ -113,7 +122,7 @@
                [Test]
                public void ParseCanHandleAbsolutePaths()
                {
-                       UrlParts builder = 
UrlParts.Parse("http://localhost/home/index.ext";);
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"http://localhost/home/index.ext";);
 
                        Assert.AreEqual(0, builder.PathInfoDict.Count);
 
@@ -123,7 +132,7 @@
                [Test]
                public void ParseCanHandleAbsolutePathsWithQueryString()
                {
-                       UrlParts builder = 
UrlParts.Parse("http://localhost/home/index.ext?id=1&type=home";);
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"http://localhost/home/index.ext?id=1&type=home";);
 
                        Assert.AreEqual(0, builder.PathInfoDict.Count);
                        Assert.AreEqual("id=1&type=home", 
builder.QueryStringAsString());
@@ -134,7 +143,7 @@
                [Test]
                public void ParseCanHandleAbsolutePathsWithPathInfo()
                {
-                       UrlParts builder = 
UrlParts.Parse("http://localhost/home/index.ext/state/fl/";);
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"http://localhost/home/index.ext/state/fl/";);
 
                        Assert.AreEqual(1, builder.PathInfoDict.Count);
                        Assert.AreEqual("fl", builder.PathInfoDict["state"]);
@@ -146,7 +155,7 @@
                [Test]
                public void ParseCanHandleRelativePaths()
                {
-                       UrlParts builder = UrlParts.Parse("home/index.ext");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext");
 
                        Assert.AreEqual("home/index.ext", builder.BuildPath());
                }
@@ -154,7 +163,7 @@
                [Test]
                public void ParseCanHandleRelativePathsWithEmptyPathInfo()
                {
-                       UrlParts builder = UrlParts.Parse("home/index.ext/");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext/");
 
                        Assert.AreEqual("home/index.ext", builder.BuildPath());
                }
@@ -162,7 +171,7 @@
                [Test]
                public void ParseCanHandleRelativePathsWithPathInfo()
                {
-                       UrlParts builder = 
UrlParts.Parse("home/index.ext/state/fl");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext/state/fl");
 
                        Assert.AreEqual(1, builder.PathInfoDict.Count);
                        Assert.AreEqual("fl", builder.PathInfoDict["state"]);
@@ -174,7 +183,7 @@
                [Test]
                public void ParseCanHandleRelativePathsWithPathInfo2()
                {
-                       UrlParts builder = 
UrlParts.Parse("home/index.ext/state/fl/");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext/state/fl/");
 
                        Assert.AreEqual(1, builder.PathInfoDict.Count);
                        Assert.AreEqual("fl", builder.PathInfoDict["state"]);
@@ -186,7 +195,7 @@
                [Test]
                public void ParseCanHandleRelativePathsWithQueryString()
                {
-                       UrlParts builder = 
UrlParts.Parse("home/index.ext?id=1&name=john");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext?id=1&name=john");
 
                        Assert.AreEqual(0, builder.PathInfoDict.Count);
                        Assert.AreEqual("id=1&name=john", 
builder.QueryStringAsString());
@@ -197,7 +206,7 @@
                [Test]
                public void 
ParseCanHandleRelativePathsWithEmptyPathInfoAndQueryString()
                {
-                       UrlParts builder = 
UrlParts.Parse("home/index.ext/?id=1&name=john");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext/?id=1&name=john");
 
                        Assert.AreEqual(0, builder.PathInfoDict.Count);
                        Assert.AreEqual("id=1&name=john", 
builder.QueryStringAsString());
@@ -208,7 +217,7 @@
                [Test]
                public void 
ParseCanHandleRelativePathsWithPathInfoAndQueryString()
                {
-                       UrlParts builder = 
UrlParts.Parse("home/index.ext/state/fl/?id=1&name=john");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext/state/fl/?id=1&name=john");
 
                        Assert.AreEqual(1, builder.PathInfoDict.Count);
                        Assert.AreEqual("fl", builder.PathInfoDict["state"]);
@@ -220,7 +229,7 @@
                [Test]
                public void ParseCanHandleRelativePathsWithoutExtension()
                {
-                       UrlParts builder = UrlParts.Parse("home/index/state");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index/state");
 
                        Assert.AreEqual("home/index/state", 
builder.BuildPath());
                }
@@ -228,7 +237,7 @@
                [Test]
                public void 
ParseCanHandleRelativePathsWithoutExtensionAndQueryString()
                {
-                       UrlParts builder = 
UrlParts.Parse("home/index/state?id=1");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index/state?id=1");
 
                        Assert.AreEqual(0, builder.PathInfoDict.Count);
                        Assert.AreEqual("id=1", builder.QueryStringAsString());
@@ -240,7 +249,7 @@
                [Test]
                public void 
ParseCanHandleRelativePathsWithoutExtensionAndQueryStringContainingDot()
                {
-                       UrlParts builder = 
UrlParts.Parse("home/index/state?file=index.pdf");
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index/state?file=index.pdf");
 
                        Assert.AreEqual(0, builder.PathInfoDict.Count);
                        Assert.AreEqual("file=index.pdf", 
builder.QueryStringAsString());
@@ -250,9 +259,19 @@
                }
 
                [Test]
+               public void ParseCanHandleEscapedQueryStringParameters()
+               {
+                       UrlParts builder = UrlParts.Parse(serverUtil, 
"home/index.ext?date=01%2f01%2f2001");
+
+                       Assert.AreEqual("01/01/2001", 
builder.QueryString["date"]);
+
+                       Assert.AreEqual("home/index.ext?date=01%2f01%2f2001", 
builder.BuildPath());
+               }
+
+               [Test]
                public void QueryStringParsesStringCorrectly()
                {
-                       UrlParts builder = new UrlParts("home/index.ext");
+                       UrlParts builder = new UrlParts(serverUtil, 
"home/index.ext");
 
                        builder.QueryString["state"] = "FL";
 
@@ -262,7 +281,7 @@
                [Test]
                public void QueryStringIsExtractedAndParsed()
                {
-                       UrlParts builder = new UrlParts("home/index.ext");
+                       UrlParts builder = new UrlParts(serverUtil, 
"home/index.ext");
 
                        builder.SetQueryString("City=SP&State=MD");
 
@@ -274,7 +293,7 @@
                [Test]
                public void QueryStringCanHandleDuplicatedEntries()
                {
-                       UrlParts builder = new UrlParts("home/index.ext");
+                       UrlParts builder = new UrlParts(serverUtil, 
"home/index.ext");
 
                        builder.SetQueryString("City=SP&State=MD&State=NY");
 
@@ -284,7 +303,7 @@
                [Test]
                public void QueryStringCanReplaceEntries()
                {
-                       UrlParts builder = new UrlParts("home/index.ext");
+                       UrlParts builder = new UrlParts(serverUtil, 
"home/index.ext");
 
                        builder.QueryString["page"] = "1";
 
@@ -302,7 +321,7 @@
                [Test]
                public void InsertFrontPath_ShouldKeepExistingPath()
                {
-                       UrlParts builder = new UrlParts("controller", "action");
+                       UrlParts builder = new UrlParts(serverUtil, 
"controller", "action");
                        builder.PathInfo.Add("State").Add("FL");
 
                        builder.InsertFrontPath("http://something";);
@@ -313,7 +332,7 @@
                [Test]
                public void InsertFrontPath_ShouldHandleTwoPathsWithSlash()
                {
-                       UrlParts builder = new UrlParts();
+                       UrlParts builder = new UrlParts(serverUtil);
                        builder.AppendPath("/something");
 

Directory: /MonoRail/trunk/lib/
===============================

File [modified]: Newtonsoft.Json.XML
Delta lines: +3 -3
===================================================================

--- MonoRail/trunk/src/Castle.MonoRail.Framework/Services/DefaultUrlBuilder.cs  
2010-01-14 17:27:00 UTC (rev 6667)
+++ MonoRail/trunk/src/Castle.MonoRail.Framework/Services/DefaultUrlBuilder.cs  
2010-01-14 20:18:34 UTC (rev 6668)
@@ -184,7 +184,7 @@
 
                        if (encodeForLink)
                        {
-                               return url.BuildPathForLink(serverUtil);
+                               return url.BuildPathForLink();
                        }
 
                        return url.BuildPath();
@@ -279,7 +279,7 @@
 
                        if (parts == null)
                        {
-                               parts = new UrlParts(path, controller, action + 
(useExtensions ? SafeExt(current.Extension) : ""));
+                               parts = new UrlParts(serverUtil, path, 
controller, action + (useExtensions ? SafeExt(current.Extension) : ""));
                                AppendPathInfo(parts, parameters);
                        }
                        else
@@ -348,7 +348,7 @@
 
                                if (url != null)
                                {
-                                       return new UrlParts(url);
+                                       return new UrlParts(serverUtil, url);
                                }
                        }

File [modified]: Newtonsoft.Json.dll
Delta lines: None
None
Directory: /MonoRail/trunk/src/
===============================

File [modified]: Changes.txt
Delta lines: +0 -0
===================================================================

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Commits" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-commits?hl=en.


Reply via email to