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

Commit a190753

Browse files
committed
Merge branch 'master' of github.com:ServiceStack/ServiceStack.Text
2 parents f7fdd63 + 4bcf8ef commit a190753

File tree

4 files changed

+94
-37
lines changed

4 files changed

+94
-37
lines changed

src/ServiceStack.Text/HttpUtils.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ public static string SendStringToUrl(this string url, string method = null,
430430

431431
if (ResultsFilter != null)
432432
{
433-
return ResultsFilter.GetString(webReq);
433+
return ResultsFilter.GetString(webReq, requestBody);
434434
}
435435

436436
if (requestBody != null)
@@ -497,7 +497,7 @@ public static byte[] SendBytesToUrl(this string url, string method = null,
497497

498498
if (ResultsFilter != null)
499499
{
500-
return ResultsFilter.GetBytes(webReq);
500+
return ResultsFilter.GetBytes(webReq, requestBody);
501501
}
502502

503503
if (requestBody != null)
@@ -800,8 +800,8 @@ public static string PutXmlToUrl(this string url, object data,
800800

801801
public interface IHttpResultsFilter : IDisposable
802802
{
803-
string GetString(HttpWebRequest webReq);
804-
byte[] GetBytes(HttpWebRequest webReq);
803+
string GetString(HttpWebRequest webReq, string reqBody);
804+
byte[] GetBytes(HttpWebRequest webReq, byte[] reqBody);
805805
void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fileName);
806806
}
807807

@@ -812,8 +812,8 @@ public class HttpResultsFilter : IHttpResultsFilter
812812
public string StringResult { get; set; }
813813
public byte[] BytesResult { get; set; }
814814

815-
public Func<HttpWebRequest, string> StringResultFn { get; set; }
816-
public Func<HttpWebRequest, byte[]> BytesResultFn { get; set; }
815+
public Func<HttpWebRequest, string, string> StringResultFn { get; set; }
816+
public Func<HttpWebRequest, byte[], byte[]> BytesResultFn { get; set; }
817817
public Action<HttpWebRequest, Stream, string> UploadFileFn { get; set; }
818818

819819
public HttpResultsFilter(string stringResult=null, byte[] bytesResult=null)
@@ -830,17 +830,17 @@ public void Dispose()
830830
HttpUtils.ResultsFilter = previousFilter;
831831
}
832832

833-
public string GetString(HttpWebRequest webReq)
833+
public string GetString(HttpWebRequest webReq, string reqBody)
834834
{
835835
return StringResultFn != null
836-
? StringResultFn(webReq)
836+
? StringResultFn(webReq, reqBody)
837837
: StringResult;
838838
}
839839

840-
public byte[] GetBytes(HttpWebRequest webReq)
840+
public byte[] GetBytes(HttpWebRequest webReq, byte[] reqBody)
841841
{
842842
return BytesResultFn != null
843-
? BytesResultFn(webReq)
843+
? BytesResultFn(webReq, reqBody)
844844
: BytesResult;
845845
}
846846

src/ServiceStack.Text/Support/TimeSpanConverter.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ public class TimeSpanConverter
88
{
99
public static string ToXsdDuration(TimeSpan timeSpan)
1010
{
11-
var sb = new StringBuilder("P");
11+
var sb = new StringBuilder();
1212

13-
double ticks = timeSpan.Ticks;
13+
sb.Append(timeSpan.Ticks < 0 ? "-P" : "P");
1414

15+
double ticks = Math.Abs(timeSpan.Ticks);
1516
double totalSeconds = ticks / TimeSpan.TicksPerSecond;
1617
int wholeSeconds = (int) totalSeconds;
1718
int seconds = wholeSeconds;
@@ -55,6 +56,13 @@ public static TimeSpan FromXsdDuration(string xsdDuration)
5556
int hours = 0;
5657
int minutes = 0;
5758
double seconds = 0;
59+
int sign = 1;
60+
61+
if (xsdDuration.StartsWith("-", StringComparison.Ordinal))
62+
{
63+
sign = -1;
64+
xsdDuration = xsdDuration.Substring(1); //strip sign
65+
}
5866

5967
string[] t = xsdDuration.Substring(1).SplitOnFirst('T'); //strip P
6068

@@ -100,7 +108,7 @@ public static TimeSpan FromXsdDuration(string xsdDuration)
100108
+ (minutes * 60)
101109
+ (seconds);
102110

103-
var interval = (long) (totalSecs * TimeSpan.TicksPerSecond);
111+
var interval = (long) (totalSecs * TimeSpan.TicksPerSecond * sign);
104112

105113
return TimeSpan.FromTicks(interval);
106114
}

tests/ServiceStack.Text.Tests/HttpUtilsMockTests.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,23 @@ public void Can_Mock_StringFn_Api_responses()
8282
{
8383
using (new HttpResultsFilter
8484
{
85-
StringResultFn = webReq => webReq.RequestUri.ToString().Contains("google")
86-
? "mocked-google"
87-
: "mocked-yahoo"
85+
StringResultFn = (webReq, reqBody) =>
86+
{
87+
if (reqBody != null && reqBody.Contains("{\"a\":1}")) return "mocked-by-body";
88+
89+
return webReq.RequestUri.ToString().Contains("google")
90+
? "mocked-google"
91+
: "mocked-yahoo";
92+
}
8893
})
8994
{
9095
Assert.That(ExampleGoogleUrl.GetJsonFromUrl(), Is.EqualTo("mocked-google"));
9196
Assert.That(ExampleYahooUrl.GetJsonFromUrl(), Is.EqualTo("mocked-yahoo"));
9297

9398
Assert.That(ExampleGoogleUrl.PostJsonToUrl(json: "{\"postdata\":1}"), Is.EqualTo("mocked-google"));
9499
Assert.That(ExampleYahooUrl.PostJsonToUrl(json: "{\"postdata\":1}"), Is.EqualTo("mocked-yahoo"));
100+
101+
Assert.That(ExampleYahooUrl.PostJsonToUrl(json: "{\"a\":1}"), Is.EqualTo("mocked-by-body"));
95102
}
96103
}
97104

@@ -100,16 +107,23 @@ public void Can_Mock_BytesFn_Api_responses()
100107
{
101108
using (new HttpResultsFilter
102109
{
103-
BytesResultFn = webReq => webReq.RequestUri.ToString().Contains("google")
104-
? "mocked-google".ToUtf8Bytes()
105-
: "mocked-yahoo".ToUtf8Bytes()
110+
BytesResultFn = (webReq, reqBody) =>
111+
{
112+
if (reqBody != null && reqBody.FromUtf8Bytes().Contains("{\"a\":1}")) return "mocked-by-body".ToUtf8Bytes();
113+
114+
return webReq.RequestUri.ToString().Contains("google")
115+
? "mocked-google".ToUtf8Bytes()
116+
: "mocked-yahoo".ToUtf8Bytes();
117+
}
106118
})
107119
{
108120
Assert.That(ExampleGoogleUrl.GetBytesFromUrl(), Is.EqualTo("mocked-google".ToUtf8Bytes()));
109121
Assert.That(ExampleYahooUrl.GetBytesFromUrl(), Is.EqualTo("mocked-yahoo".ToUtf8Bytes()));
110122

111123
Assert.That(ExampleGoogleUrl.PostBytesToUrl(requestBody: "postdata=1".ToUtf8Bytes()), Is.EqualTo("mocked-google".ToUtf8Bytes()));
112124
Assert.That(ExampleYahooUrl.PostBytesToUrl(requestBody: "postdata=1".ToUtf8Bytes()), Is.EqualTo("mocked-yahoo".ToUtf8Bytes()));
125+
126+
Assert.That(ExampleYahooUrl.PostBytesToUrl(requestBody: "{\"a\":1}".ToUtf8Bytes()), Is.EqualTo("mocked-by-body".ToUtf8Bytes()));
113127
}
114128
}
115129

tests/ServiceStack.Text.Tests/TimeSpanConverterTests.cs

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,69 @@ namespace ServiceStack.Text.Tests
77
[TestFixture]
88
public class TimeSpanConverterTests
99
{
10+
private readonly TimeSpan oneTick = new TimeSpan(1);
11+
private readonly TimeSpan oneDay = new TimeSpan(1, 0, 0, 0);
12+
private readonly TimeSpan oneHour = new TimeSpan(1, 0, 0);
13+
private readonly TimeSpan oneMinute = new TimeSpan(0, 1, 0);
14+
private readonly TimeSpan oneSecond = new TimeSpan(0, 0, 1);
15+
private readonly TimeSpan oneMilliSecond = new TimeSpan(0, 0, 0, 0, 1);
16+
private readonly TimeSpan oneDayHourMinuteSecondMilliSecond = new TimeSpan(1, 1, 1, 1, 1);
17+
private readonly TimeSpan threeThousandSixHundredAndFiveDays = TimeSpan.FromDays(3605);
18+
private readonly TimeSpan arbitraryTimeSpan = new TimeSpan(1, 2, 3, 4, 567).Add(TimeSpan.FromTicks(1));
19+
1020
[Test]
1121
public void Can_Serialize_TimeSpan()
1222
{
13-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1, 0, 0, 0)), Is.EqualTo("P1D"));
14-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1, 0, 0)), Is.EqualTo("PT1H"));
15-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(0, 1, 0)), Is.EqualTo("PT1M"));
16-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(0, 0, 1)), Is.EqualTo("PT1S"));
17-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(0, 0, 0, 0, 1)), Is.EqualTo("PT0.001S"));
18-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1, 1, 1, 1, 1)), Is.EqualTo("P1DT1H1M1.001S"));
19-
20-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1)), Is.EqualTo("PT0.0000001S"));
23+
Assert.That(TimeSpanConverter.ToXsdDuration(oneDay), Is.EqualTo("P1D"));
24+
Assert.That(TimeSpanConverter.ToXsdDuration(oneHour), Is.EqualTo("PT1H"));
25+
Assert.That(TimeSpanConverter.ToXsdDuration(oneMinute), Is.EqualTo("PT1M"));
26+
Assert.That(TimeSpanConverter.ToXsdDuration(oneSecond), Is.EqualTo("PT1S"));
27+
Assert.That(TimeSpanConverter.ToXsdDuration(oneMilliSecond), Is.EqualTo("PT0.001S"));
28+
Assert.That(TimeSpanConverter.ToXsdDuration(oneDayHourMinuteSecondMilliSecond), Is.EqualTo("P1DT1H1M1.001S"));
29+
Assert.That(TimeSpanConverter.ToXsdDuration(arbitraryTimeSpan), Is.EqualTo("P1DT2H3M4.5670001S"));
30+
31+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneDay), Is.EqualTo("-P1D"));
32+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneHour), Is.EqualTo("-PT1H"));
33+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneMinute), Is.EqualTo("-PT1M"));
34+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneSecond), Is.EqualTo("-PT1S"));
35+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneMilliSecond), Is.EqualTo("-PT0.001S"));
36+
Assert.That(TimeSpanConverter.ToXsdDuration(-arbitraryTimeSpan), Is.EqualTo("-P1DT2H3M4.5670001S"));
37+
38+
Assert.That(TimeSpanConverter.ToXsdDuration(oneTick), Is.EqualTo("PT0.0000001S"));
39+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneTick), Is.EqualTo("-PT0.0000001S"));
40+
2141
Assert.That(TimeSpanConverter.ToXsdDuration(TimeSpan.Zero), Is.EqualTo("PT0S"));
22-
Assert.That(TimeSpanConverter.ToXsdDuration(new DateTime(2010,1,1) - new DateTime(2000,1,1)), Is.EqualTo("P3653D"));
42+
43+
Assert.That(TimeSpanConverter.ToXsdDuration(threeThousandSixHundredAndFiveDays), Is.EqualTo("P3605D"));
44+
Assert.That(TimeSpanConverter.ToXsdDuration(-threeThousandSixHundredAndFiveDays), Is.EqualTo("-P3605D"));
2345
}
2446

2547
[Test]
2648
public void Can_deserialize_TimeSpan()
2749
{
28-
Assert.That(TimeSpanConverter.FromXsdDuration("P1D"), Is.EqualTo(new TimeSpan(1, 0, 0, 0)));
29-
Assert.That(TimeSpanConverter.FromXsdDuration("PT1H"), Is.EqualTo(new TimeSpan(1, 0, 0)));
30-
Assert.That(TimeSpanConverter.FromXsdDuration("PT1M"), Is.EqualTo(new TimeSpan(0, 1, 0)));
31-
Assert.That(TimeSpanConverter.FromXsdDuration("PT1S"), Is.EqualTo(new TimeSpan(0, 0, 1)));
32-
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.001S"), Is.EqualTo(new TimeSpan(0, 0, 0, 0, 1)));
33-
Assert.That(TimeSpanConverter.FromXsdDuration("P1DT1H1M1.001S"), Is.EqualTo(new TimeSpan(1, 1, 1, 1, 1)));
34-
35-
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.0000001S"), Is.EqualTo(new TimeSpan(1)));
50+
Assert.That(TimeSpanConverter.FromXsdDuration("P1D"), Is.EqualTo(oneDay));
51+
Assert.That(TimeSpanConverter.FromXsdDuration("PT1H"), Is.EqualTo(oneHour));
52+
Assert.That(TimeSpanConverter.FromXsdDuration("PT1M"), Is.EqualTo(oneMinute));
53+
Assert.That(TimeSpanConverter.FromXsdDuration("PT1S"), Is.EqualTo(oneSecond));
54+
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.001S"), Is.EqualTo(oneMilliSecond));
55+
Assert.That(TimeSpanConverter.FromXsdDuration("P1DT1H1M1.001S"), Is.EqualTo(oneDayHourMinuteSecondMilliSecond));
56+
Assert.That(TimeSpanConverter.FromXsdDuration("P1DT2H3M4.5670001S"), Is.EqualTo(arbitraryTimeSpan));
57+
58+
Assert.That(TimeSpanConverter.FromXsdDuration("-P1D"), Is.EqualTo(-oneDay));
59+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT1H"), Is.EqualTo(-oneHour));
60+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT1M"), Is.EqualTo(-oneMinute));
61+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT1S"), Is.EqualTo(-oneSecond));
62+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT0.001S"), Is.EqualTo(-oneMilliSecond));
63+
Assert.That(TimeSpanConverter.FromXsdDuration("-P1DT1H1M1.001S"), Is.EqualTo(-oneDayHourMinuteSecondMilliSecond));
64+
Assert.That(TimeSpanConverter.FromXsdDuration("-P1DT2H3M4.5670001S"), Is.EqualTo(-arbitraryTimeSpan));
65+
66+
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.0000001S"), Is.EqualTo(oneTick));
67+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT0.0000001S"), Is.EqualTo(-oneTick));
68+
3669
Assert.That(TimeSpanConverter.FromXsdDuration("PT0S"), Is.EqualTo(TimeSpan.Zero));
37-
Assert.That(TimeSpanConverter.FromXsdDuration("P3650D"), Is.EqualTo(TimeSpan.FromDays(3650)));
70+
71+
Assert.That(TimeSpanConverter.FromXsdDuration("P3605D"), Is.EqualTo(threeThousandSixHundredAndFiveDays));
72+
Assert.That(TimeSpanConverter.FromXsdDuration("-P3605D"), Is.EqualTo(-threeThousandSixHundredAndFiveDays));
3873
}
3974
}
4075
}

0 commit comments

Comments
 (0)