From d00ac62cd47a8dd0302ee7a85b693aee8d8fd8cb Mon Sep 17 00:00:00 2001 From: Bruno Costa Date: Sat, 21 Sep 2013 18:13:05 +0100 Subject: [PATCH 1/2] Added support for querystring parameters for POST requests --- RestSharp.Tests/UrlBuilderTests.cs | 281 +++++++++++++++-------------- RestSharp/Enum.cs | 3 +- RestSharp/RestClient.cs | 47 +++-- 3 files changed, 176 insertions(+), 155 deletions(-) diff --git a/RestSharp.Tests/UrlBuilderTests.cs b/RestSharp.Tests/UrlBuilderTests.cs index 909e2b31a..648d24609 100644 --- a/RestSharp.Tests/UrlBuilderTests.cs +++ b/RestSharp.Tests/UrlBuilderTests.cs @@ -6,148 +6,161 @@ namespace RestSharp.Tests { - /// - /// Note: These tests do not handle QueryString building, which is handled in Http, not RestClient - /// - public class UrlBuilderTests - { - [Fact] - public void GET_with_leading_slash() - { - var request = new RestRequest("/resource"); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void POST_with_leading_slash() - { - var request = new RestRequest("/resource", Method.POST); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_with_leading_slash_and_baseurl_trailing_slash() - { - var request = new RestRequest("/resource"); - request.AddParameter("foo", "bar"); - var client = new RestClient("http://example.com/"); - - var expected = new Uri("http://example.com/resource?foo=bar"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_wth_trailing_slash_and_query_parameters() - { - var request = new RestRequest("/resource/"); - var client = new RestClient("http://example.com"); - request.AddParameter( "foo", "bar" ); - - var expected = new Uri("http://example.com/resource/?foo=bar"); - var output = client.BuildUri(request); - - var response = client.Execute( request ); - - Assert.Equal(expected, output); - } - - [Fact] - public void POST_with_leading_slash_and_baseurl_trailing_slash() - { - var request = new RestRequest("/resource", Method.POST); - var client = new RestClient("http://example.com/"); - - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_with_resource_containing_slashes() - { - var request = new RestRequest("resource/foo"); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource/foo"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void POST_with_resource_containing_slashes() - { - var request = new RestRequest("resource/foo", Method.POST); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource/foo"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_with_resource_containing_tokens() - { - var request = new RestRequest("resource/{foo}"); - request.AddUrlSegment("foo", "bar"); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource/bar"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } + /// + /// Note: These tests do not handle QueryString building, which is handled in Http, not RestClient + /// + public class UrlBuilderTests + { + [Fact] + public void GET_with_leading_slash() + { + var request = new RestRequest("/resource"); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_leading_slash() + { + var request = new RestRequest("/resource", Method.POST); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_with_leading_slash_and_baseurl_trailing_slash() + { + var request = new RestRequest("/resource"); + request.AddParameter("foo", "bar"); + var client = new RestClient("http://example.com/"); + + var expected = new Uri("http://example.com/resource?foo=bar"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_wth_trailing_slash_and_query_parameters() + { + var request = new RestRequest("/resource/"); + var client = new RestClient("http://example.com"); + request.AddParameter("foo", "bar"); + + var expected = new Uri("http://example.com/resource/?foo=bar"); + var output = client.BuildUri(request); + + var response = client.Execute(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_leading_slash_and_baseurl_trailing_slash() + { + var request = new RestRequest("/resource", Method.POST); + var client = new RestClient("http://example.com/"); + + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_with_resource_containing_slashes() + { + var request = new RestRequest("resource/foo"); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource/foo"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_resource_containing_slashes() + { + var request = new RestRequest("resource/foo", Method.POST); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource/foo"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_with_resource_containing_tokens() + { + var request = new RestRequest("resource/{foo}"); + request.AddUrlSegment("foo", "bar"); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource/bar"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_resource_containing_tokens() + { + var request = new RestRequest("resource/{foo}", Method.POST); + request.AddUrlSegment("foo", "bar"); + var client = new RestClient("http://example.com"); - [Fact] - public void POST_with_resource_containing_tokens() - { - var request = new RestRequest("resource/{foo}", Method.POST); - request.AddUrlSegment("foo", "bar"); - var client = new RestClient("http://example.com"); + var expected = new Uri("http://example.com/resource/bar"); + var output = client.BuildUri(request); - var expected = new Uri("http://example.com/resource/bar"); - var output = client.BuildUri(request); + Assert.Equal(expected, output); + } - Assert.Equal(expected, output); - } + [Fact] + public void GET_with_empty_request() + { + var request = new RestRequest(); + var client = new RestClient("http://example.com/resource"); - [Fact] - public void GET_with_empty_request() - { - var request = new RestRequest(); - var client = new RestClient("http://example.com/resource"); + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); + Assert.Equal(expected, output); + } - Assert.Equal(expected, output); - } + [Fact] + public void GET_with_empty_request_and_bare_hostname() + { + var request = new RestRequest(); + var client = new RestClient("http://example.com"); - [Fact] - public void GET_with_empty_request_and_bare_hostname() - { - var request = new RestRequest(); - var client = new RestClient("http://example.com"); + var expected = new Uri("http://example.com/"); + var output = client.BuildUri(request); - var expected = new Uri("http://example.com/"); - var output = client.BuildUri(request); + Assert.Equal(expected, output); + } - Assert.Equal(expected, output); - } + [Fact] + public void POST_with_querystring_containing_tokens() + { + var request = new RestRequest("resource", Method.POST); + request.AddParameter("foo", "bar", ParameterType.QueryString); - } + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource?foo=bar"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + } } diff --git a/RestSharp/Enum.cs b/RestSharp/Enum.cs index 669cd0e3d..327843035 100644 --- a/RestSharp/Enum.cs +++ b/RestSharp/Enum.cs @@ -25,7 +25,8 @@ public enum ParameterType GetOrPost, UrlSegment, HttpHeader, - RequestBody + RequestBody, + QueryString } /// diff --git a/RestSharp/RestClient.cs b/RestSharp/RestClient.cs index 4baaa08cd..2d534d8b5 100644 --- a/RestSharp/RestClient.cs +++ b/RestSharp/RestClient.cs @@ -257,30 +257,37 @@ public Uri BuildUri(IRestRequest request) } } - if (request.Method != Method.POST - && request.Method != Method.PUT - && request.Method != Method.PATCH) - { - // build and attach querystring if this is a get-style request - if (request.Parameters.Any(p => p.Type == ParameterType.GetOrPost)) - { - var data = EncodeParameters(request); - assembled = string.Format("{0}?{1}", assembled, data); - } - } + IEnumerable parameters = null; + + if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH) + { + // build and attach querystring if this is a get-style request + parameters = request.Parameters.Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString); + } + else + { + parameters = request.Parameters.Where(p => p.Type == ParameterType.QueryString); + } + + // build and attach querystring + if (parameters != null && parameters.Any()) + { + var data = EncodeParameters(request, parameters); + assembled = string.Format("{0}?{1}", assembled, data); + } return new Uri(assembled); } - private string EncodeParameters(IRestRequest request) - { - var querystring = new StringBuilder(); - foreach (var p in request.Parameters.Where(p => p.Type == ParameterType.GetOrPost)) - { - if (querystring.Length > 1) - querystring.Append("&"); - querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), (p.Value.ToString()).UrlEncode()); - } + private string EncodeParameters(IRestRequest request, IEnumerable parameters) + { + var querystring = new StringBuilder(); + foreach (var p in parameters) + { + if (querystring.Length > 1) + querystring.Append("&"); + querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), (p.Value.ToString()).UrlEncode()); + } return querystring.ToString(); } From b104eac15db1ec2ecb63d622839b10b141ad73bf Mon Sep 17 00:00:00 2001 From: Bruno Costa Date: Sat, 21 Sep 2013 18:46:47 +0100 Subject: [PATCH 2/2] Fix indentation --- RestSharp.Tests/UrlBuilderTests.cs | 290 ++++++++++++++--------------- RestSharp/Enum.cs | 2 +- RestSharp/RestClient.cs | 80 ++++---- 3 files changed, 187 insertions(+), 185 deletions(-) diff --git a/RestSharp.Tests/UrlBuilderTests.cs b/RestSharp.Tests/UrlBuilderTests.cs index 648d24609..c8c52a0bb 100644 --- a/RestSharp.Tests/UrlBuilderTests.cs +++ b/RestSharp.Tests/UrlBuilderTests.cs @@ -6,161 +6,161 @@ namespace RestSharp.Tests { - /// - /// Note: These tests do not handle QueryString building, which is handled in Http, not RestClient - /// - public class UrlBuilderTests - { - [Fact] - public void GET_with_leading_slash() - { - var request = new RestRequest("/resource"); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void POST_with_leading_slash() - { - var request = new RestRequest("/resource", Method.POST); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_with_leading_slash_and_baseurl_trailing_slash() - { - var request = new RestRequest("/resource"); - request.AddParameter("foo", "bar"); - var client = new RestClient("http://example.com/"); - - var expected = new Uri("http://example.com/resource?foo=bar"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_wth_trailing_slash_and_query_parameters() - { - var request = new RestRequest("/resource/"); - var client = new RestClient("http://example.com"); - request.AddParameter("foo", "bar"); - - var expected = new Uri("http://example.com/resource/?foo=bar"); - var output = client.BuildUri(request); - - var response = client.Execute(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void POST_with_leading_slash_and_baseurl_trailing_slash() - { - var request = new RestRequest("/resource", Method.POST); - var client = new RestClient("http://example.com/"); - - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_with_resource_containing_slashes() - { - var request = new RestRequest("resource/foo"); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource/foo"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void POST_with_resource_containing_slashes() - { - var request = new RestRequest("resource/foo", Method.POST); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource/foo"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void GET_with_resource_containing_tokens() - { - var request = new RestRequest("resource/{foo}"); - request.AddUrlSegment("foo", "bar"); - var client = new RestClient("http://example.com"); - - var expected = new Uri("http://example.com/resource/bar"); - var output = client.BuildUri(request); - - Assert.Equal(expected, output); - } - - [Fact] - public void POST_with_resource_containing_tokens() - { - var request = new RestRequest("resource/{foo}", Method.POST); - request.AddUrlSegment("foo", "bar"); - var client = new RestClient("http://example.com"); + /// + /// Note: These tests do not handle QueryString building, which is handled in Http, not RestClient + /// + public class UrlBuilderTests + { + [Fact] + public void GET_with_leading_slash() + { + var request = new RestRequest("/resource"); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_leading_slash() + { + var request = new RestRequest("/resource", Method.POST); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_with_leading_slash_and_baseurl_trailing_slash() + { + var request = new RestRequest("/resource"); + request.AddParameter("foo", "bar"); + var client = new RestClient("http://example.com/"); + + var expected = new Uri("http://example.com/resource?foo=bar"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_wth_trailing_slash_and_query_parameters() + { + var request = new RestRequest("/resource/"); + var client = new RestClient("http://example.com"); + request.AddParameter("foo", "bar"); + + var expected = new Uri("http://example.com/resource/?foo=bar"); + var output = client.BuildUri(request); + + var response = client.Execute(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_leading_slash_and_baseurl_trailing_slash() + { + var request = new RestRequest("/resource", Method.POST); + var client = new RestClient("http://example.com/"); + + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_with_resource_containing_slashes() + { + var request = new RestRequest("resource/foo"); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource/foo"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_resource_containing_slashes() + { + var request = new RestRequest("resource/foo", Method.POST); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource/foo"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void GET_with_resource_containing_tokens() + { + var request = new RestRequest("resource/{foo}"); + request.AddUrlSegment("foo", "bar"); + var client = new RestClient("http://example.com"); + + var expected = new Uri("http://example.com/resource/bar"); + var output = client.BuildUri(request); + + Assert.Equal(expected, output); + } + + [Fact] + public void POST_with_resource_containing_tokens() + { + var request = new RestRequest("resource/{foo}", Method.POST); + request.AddUrlSegment("foo", "bar"); + var client = new RestClient("http://example.com"); - var expected = new Uri("http://example.com/resource/bar"); - var output = client.BuildUri(request); + var expected = new Uri("http://example.com/resource/bar"); + var output = client.BuildUri(request); - Assert.Equal(expected, output); - } + Assert.Equal(expected, output); + } - [Fact] - public void GET_with_empty_request() - { - var request = new RestRequest(); - var client = new RestClient("http://example.com/resource"); + [Fact] + public void GET_with_empty_request() + { + var request = new RestRequest(); + var client = new RestClient("http://example.com/resource"); - var expected = new Uri("http://example.com/resource"); - var output = client.BuildUri(request); + var expected = new Uri("http://example.com/resource"); + var output = client.BuildUri(request); - Assert.Equal(expected, output); - } + Assert.Equal(expected, output); + } - [Fact] - public void GET_with_empty_request_and_bare_hostname() - { - var request = new RestRequest(); - var client = new RestClient("http://example.com"); + [Fact] + public void GET_with_empty_request_and_bare_hostname() + { + var request = new RestRequest(); + var client = new RestClient("http://example.com"); - var expected = new Uri("http://example.com/"); - var output = client.BuildUri(request); + var expected = new Uri("http://example.com/"); + var output = client.BuildUri(request); - Assert.Equal(expected, output); - } + Assert.Equal(expected, output); + } - [Fact] - public void POST_with_querystring_containing_tokens() - { - var request = new RestRequest("resource", Method.POST); - request.AddParameter("foo", "bar", ParameterType.QueryString); + [Fact] + public void POST_with_querystring_containing_tokens() + { + var request = new RestRequest("resource", Method.POST); + request.AddParameter("foo", "bar", ParameterType.QueryString); - var client = new RestClient("http://example.com"); + var client = new RestClient("http://example.com"); - var expected = new Uri("http://example.com/resource?foo=bar"); - var output = client.BuildUri(request); + var expected = new Uri("http://example.com/resource?foo=bar"); + var output = client.BuildUri(request); - Assert.Equal(expected, output); - } - } + Assert.Equal(expected, output); + } + } } diff --git a/RestSharp/Enum.cs b/RestSharp/Enum.cs index 327843035..ad62429e3 100644 --- a/RestSharp/Enum.cs +++ b/RestSharp/Enum.cs @@ -26,7 +26,7 @@ public enum ParameterType UrlSegment, HttpHeader, RequestBody, - QueryString + QueryString } /// diff --git a/RestSharp/RestClient.cs b/RestSharp/RestClient.cs index 2d534d8b5..6ba871526 100644 --- a/RestSharp/RestClient.cs +++ b/RestSharp/RestClient.cs @@ -257,42 +257,43 @@ public Uri BuildUri(IRestRequest request) } } - IEnumerable parameters = null; - - if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH) - { - // build and attach querystring if this is a get-style request - parameters = request.Parameters.Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString); - } - else - { - parameters = request.Parameters.Where(p => p.Type == ParameterType.QueryString); - } - - // build and attach querystring - if (parameters != null && parameters.Any()) - { - var data = EncodeParameters(request, parameters); - assembled = string.Format("{0}?{1}", assembled, data); - } + IEnumerable parameters = null; + + if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH) + { + // build and attach querystring if this is a get-style request + parameters = request.Parameters.Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString); + } + else + { + parameters = request.Parameters.Where(p => p.Type == ParameterType.QueryString); + } + + // build and attach querystring + if (parameters != null && parameters.Any()) + { + var data = EncodeParameters(request, parameters); + assembled = string.Format("{0}?{1}", assembled, data); + } return new Uri(assembled); } - private string EncodeParameters(IRestRequest request, IEnumerable parameters) - { - var querystring = new StringBuilder(); - foreach (var p in parameters) - { - if (querystring.Length > 1) - querystring.Append("&"); - querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), (p.Value.ToString()).UrlEncode()); - } + private string EncodeParameters(IRestRequest request, IEnumerable parameters) + { + var querystring = new StringBuilder(); + foreach (var p in parameters) + { + if (querystring.Length > 1) + querystring.Append("&"); + querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), (p.Value.ToString()).UrlEncode()); + } return querystring.ToString(); } - private void ConfigureHttp(IRestRequest request, IHttp http) { + private void ConfigureHttp(IRestRequest request, IHttp http) + { http.AlwaysMultipartFormData = request.AlwaysMultipartFormData; http.CookieContainer = CookieContainer; @@ -300,9 +301,9 @@ private void ConfigureHttp(IRestRequest request, IHttp http) { http.ResponseWriter = request.ResponseWriter; // move RestClient.DefaultParameters into Request.Parameters - foreach(var p in DefaultParameters) + foreach (var p in DefaultParameters) { - if(request.Parameters.Any(p2 => p2.Name == p.Name && p2.Type == p.Type)) + if (request.Parameters.Any(p2 => p2.Name == p.Name && p2.Type == p.Type)) { continue; } @@ -340,7 +341,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) { http.MaxRedirects = MaxRedirects; #endif - if(request.Credentials != null) + if (request.Credentials != null) { http.Credentials = request.Credentials; } @@ -353,7 +354,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) { Value = p.Value.ToString() }; - foreach(var header in headers) + foreach (var header in headers) { http.Headers.Add(header); } @@ -366,7 +367,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) { Value = p.Value.ToString() }; - foreach(var cookie in cookies) + foreach (var cookie in cookies) { http.Cookies.Add(cookie); } @@ -380,12 +381,12 @@ private void ConfigureHttp(IRestRequest request, IHttp http) { Value = p.Value.ToString() }; - foreach(var parameter in @params) + foreach (var parameter in @params) { http.Parameters.Add(parameter); } - foreach(var file in request.Files) + foreach (var file in request.Files) { http.Files.Add(new HttpFile { Name = file.Name, ContentType = file.ContentType, Writer = file.Writer, FileName = file.FileName, ContentLength = file.ContentLength }); } @@ -394,7 +395,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) { where p.Type == ParameterType.RequestBody select p).FirstOrDefault(); - if(body != null) + if (body != null) { object val = body.Value; if (val is byte[]) @@ -442,7 +443,8 @@ private RestResponse ConvertToRestResponse(IRestRequest request, HttpResponse ht foreach (var cookie in httpResponse.Cookies) { - restResponse.Cookies.Add(new RestResponseCookie { + restResponse.Cookies.Add(new RestResponseCookie + { Comment = cookie.Comment, CommentUri = cookie.CommentUri, Discard = cookie.Discard, @@ -474,8 +476,8 @@ private IRestResponse Deserialize(IRestRequest request, IRestResponse raw) response.Request = request; // Only attempt to deserialize if the request has a chance of containing a valid entry - if (response.StatusCode == HttpStatusCode.OK - || response.StatusCode == HttpStatusCode.Created + if (response.StatusCode == HttpStatusCode.OK + || response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.NonAuthoritativeInformation) { IDeserializer handler = GetHandler(raw.ContentType);