Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 138e097

Browse files
committed
improve querystring handling
1 parent 824510a commit 138e097

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

src/ServiceStack.Text/HttpUtils.cs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,22 @@ public static class HttpUtils
2121

2222
public static string AddQueryParam(this string url, string key, object val, bool encode = true)
2323
{
24-
return url.AddQueryParam(key, val.ToString(), encode);
24+
return url.AddQueryParam(key, val?.ToString(), encode);
2525
}
2626

2727
public static string AddQueryParam(this string url, object key, string val, bool encode = true)
2828
{
29-
return AddQueryParam(url, (key ?? "").ToString(), val, encode);
29+
return AddQueryParam(url, key?.ToString(), val, encode);
3030
}
3131

3232
public static string AddQueryParam(this string url, string key, string val, bool encode = true)
3333
{
34-
if (string.IsNullOrEmpty(url)) return null;
34+
if (url == null)
35+
url = "";
36+
37+
if (key == null || val == null)
38+
return url;
39+
3540
var prefix = string.Empty;
3641
if (!url.EndsWith("?") && !url.EndsWith("&"))
3742
{
@@ -42,7 +47,12 @@ public static string AddQueryParam(this string url, string key, string val, bool
4247

4348
public static string SetQueryParam(this string url, string key, string val)
4449
{
45-
if (string.IsNullOrEmpty(url)) return null;
50+
if (url == null)
51+
url = "";
52+
53+
if (key == null || val == null)
54+
return url;
55+
4656
var qsPos = url.IndexOf('?');
4757
if (qsPos != -1)
4858
{
@@ -69,19 +79,29 @@ public static string SetQueryParam(this string url, string key, string val)
6979

7080
public static string AddHashParam(this string url, string key, object val)
7181
{
72-
return url.AddHashParam(key, val.ToString());
82+
return url.AddHashParam(key, val?.ToString());
7383
}
7484

7585
public static string AddHashParam(this string url, string key, string val)
7686
{
77-
if (string.IsNullOrEmpty(url)) return null;
87+
if (url == null)
88+
url = "";
89+
90+
if (key == null || val == null)
91+
return url;
92+
7893
var prefix = url.IndexOf('#') == -1 ? "#" : "/";
7994
return url + prefix + key + "=" + val.UrlEncode();
8095
}
8196

8297
public static string SetHashParam(this string url, string key, string val)
8398
{
84-
if (string.IsNullOrEmpty(url)) return null;
99+
if (url == null)
100+
url = "";
101+
102+
if (key == null || val == null)
103+
return url;
104+
85105
var hPos = url.IndexOf('#');
86106
if (hPos != -1)
87107
{

src/ServiceStack.Text/StringExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ public static string DecodeJsv(this string value)
107107

108108
public static string UrlEncode(this string text, bool upperCase=false)
109109
{
110-
if (String.IsNullOrEmpty(text)) return text;
110+
if (string.IsNullOrEmpty(text))
111+
return text;
111112

112113
var sb = StringBuilderThreadStatic.Allocate();
113114
var fmt = upperCase ? "X2" : "x2";

tests/ServiceStack.Text.Tests/HttpUtilsTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ public void Can_AddQueryParam()
1616
Assert.That("http://example.com?".AddQueryParam("f", "1"), Is.EqualTo("http://example.com?f=1"));
1717
Assert.That("http://example.com?f=1&".AddQueryParam("f", "2"), Is.EqualTo("http://example.com?f=1&f=2"));
1818
Assert.That("http://example.com?ab=0".AddQueryParam("a", "1"), Is.EqualTo("http://example.com?ab=0&a=1"));
19+
20+
Assert.That("".AddQueryParam("a", ""), Is.EqualTo("?a="));
21+
Assert.That("".AddQueryParam("a", null), Is.EqualTo(""));
22+
Assert.That("/".AddQueryParam("a", null), Is.EqualTo("/"));
23+
Assert.That("/".AddQueryParam("a", ""), Is.EqualTo("/?a="));
24+
Assert.That("/".AddQueryParam("a", "b"), Is.EqualTo("/?a=b"));
25+
Assert.That((null as string).AddQueryParam("a", "b"), Is.EqualTo("?a=b"));
1926
}
2027

2128
[Test]
@@ -38,6 +45,13 @@ public void Can_AddHashParam()
3845
Assert.That("http://example.com#s=0/f=1/s=1".AddHashParam("f", "2"), Is.EqualTo("http://example.com#s=0/f=1/s=1/f=2"));
3946
Assert.That("http://example.com#s=rf/f=1".AddHashParam("f", "2"), Is.EqualTo("http://example.com#s=rf/f=1/f=2"));
4047
Assert.That("http://example.com#ab=0".AddHashParam("a", "1"), Is.EqualTo("http://example.com#ab=0/a=1"));
48+
49+
Assert.That("".AddHashParam("a", ""), Is.EqualTo("#a="));
50+
Assert.That("".AddHashParam("a", null), Is.EqualTo(""));
51+
Assert.That("/".AddHashParam("a", null), Is.EqualTo("/"));
52+
Assert.That("/".AddHashParam("a", ""), Is.EqualTo("/#a="));
53+
Assert.That("/".AddHashParam("a", "b"), Is.EqualTo("/#a=b"));
54+
Assert.That((null as string).AddHashParam("a", "b"), Is.EqualTo("#a=b"));
4155
}
4256

4357
[Test]

0 commit comments

Comments
 (0)