diff --git a/RestSharp.Tests/UrlBuilderTests.cs b/RestSharp.Tests/UrlBuilderTests.cs index 909e2b31a..c8c52a0bb 100644 --- a/RestSharp.Tests/UrlBuilderTests.cs +++ b/RestSharp.Tests/UrlBuilderTests.cs @@ -53,12 +53,12 @@ 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" ); + request.AddParameter("foo", "bar"); var expected = new Uri("http://example.com/resource/?foo=bar"); var output = client.BuildUri(request); - var response = client.Execute( request ); + var response = client.Execute(request); Assert.Equal(expected, output); } @@ -149,5 +149,18 @@ public void GET_with_empty_request_and_bare_hostname() 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..ad62429e3 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..6ba871526 100644 --- a/RestSharp/RestClient.cs +++ b/RestSharp/RestClient.cs @@ -257,25 +257,32 @@ public Uri BuildUri(IRestRequest request) } } - if (request.Method != Method.POST - && request.Method != Method.PUT - && request.Method != Method.PATCH) + 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 - if (request.Parameters.Any(p => p.Type == ParameterType.GetOrPost)) - { - var data = EncodeParameters(request); - assembled = string.Format("{0}?{1}", assembled, data); - } + 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) + private string EncodeParameters(IRestRequest request, IEnumerable parameters) { var querystring = new StringBuilder(); - foreach (var p in request.Parameters.Where(p => p.Type == ParameterType.GetOrPost)) + foreach (var p in parameters) { if (querystring.Length > 1) querystring.Append("&"); @@ -285,7 +292,8 @@ private string EncodeParameters(IRestRequest request) return querystring.ToString(); } - private void ConfigureHttp(IRestRequest request, IHttp http) { + private void ConfigureHttp(IRestRequest request, IHttp http) + { http.AlwaysMultipartFormData = request.AlwaysMultipartFormData; http.CookieContainer = CookieContainer; @@ -293,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; } @@ -333,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; } @@ -346,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); } @@ -359,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); } @@ -373,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 }); } @@ -387,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[]) @@ -435,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, @@ -467,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);