Skip to content

Commit 4c3b2e9

Browse files
committed
Merge pull request restsharp#428 from BrunoMVPCosta/master
Allowing querystring parameters for POST requests.
2 parents 1be9a2d + b104eac commit 4c3b2e9

File tree

3 files changed

+48
-25
lines changed

3 files changed

+48
-25
lines changed

RestSharp.Tests/UrlBuilderTests.cs

+15-2
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ public void GET_wth_trailing_slash_and_query_parameters()
5353
{
5454
var request = new RestRequest("/resource/");
5555
var client = new RestClient("http://example.com");
56-
request.AddParameter( "foo", "bar" );
56+
request.AddParameter("foo", "bar");
5757

5858
var expected = new Uri("http://example.com/resource/?foo=bar");
5959
var output = client.BuildUri(request);
6060

61-
var response = client.Execute( request );
61+
var response = client.Execute(request);
6262

6363
Assert.Equal(expected, output);
6464
}
@@ -149,5 +149,18 @@ public void GET_with_empty_request_and_bare_hostname()
149149
Assert.Equal(expected, output);
150150
}
151151

152+
[Fact]
153+
public void POST_with_querystring_containing_tokens()
154+
{
155+
var request = new RestRequest("resource", Method.POST);
156+
request.AddParameter("foo", "bar", ParameterType.QueryString);
157+
158+
var client = new RestClient("http://example.com");
159+
160+
var expected = new Uri("http://example.com/resource?foo=bar");
161+
var output = client.BuildUri(request);
162+
163+
Assert.Equal(expected, output);
164+
}
152165
}
153166
}

RestSharp/Enum.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public enum ParameterType
2525
GetOrPost,
2626
UrlSegment,
2727
HttpHeader,
28-
RequestBody
28+
RequestBody,
29+
QueryString
2930
}
3031

3132
/// <summary>

RestSharp/RestClient.cs

+31-22
Original file line numberDiff line numberDiff line change
@@ -257,25 +257,32 @@ public Uri BuildUri(IRestRequest request)
257257
}
258258
}
259259

260-
if (request.Method != Method.POST
261-
&& request.Method != Method.PUT
262-
&& request.Method != Method.PATCH)
260+
IEnumerable<Parameter> parameters = null;
261+
262+
if (request.Method != Method.POST && request.Method != Method.PUT && request.Method != Method.PATCH)
263263
{
264264
// build and attach querystring if this is a get-style request
265-
if (request.Parameters.Any(p => p.Type == ParameterType.GetOrPost))
266-
{
267-
var data = EncodeParameters(request);
268-
assembled = string.Format("{0}?{1}", assembled, data);
269-
}
265+
parameters = request.Parameters.Where(p => p.Type == ParameterType.GetOrPost || p.Type == ParameterType.QueryString);
266+
}
267+
else
268+
{
269+
parameters = request.Parameters.Where(p => p.Type == ParameterType.QueryString);
270+
}
271+
272+
// build and attach querystring
273+
if (parameters != null && parameters.Any())
274+
{
275+
var data = EncodeParameters(request, parameters);
276+
assembled = string.Format("{0}?{1}", assembled, data);
270277
}
271278

272279
return new Uri(assembled);
273280
}
274281

275-
private string EncodeParameters(IRestRequest request)
282+
private string EncodeParameters(IRestRequest request, IEnumerable<Parameter> parameters)
276283
{
277284
var querystring = new StringBuilder();
278-
foreach (var p in request.Parameters.Where(p => p.Type == ParameterType.GetOrPost))
285+
foreach (var p in parameters)
279286
{
280287
if (querystring.Length > 1)
281288
querystring.Append("&");
@@ -285,17 +292,18 @@ private string EncodeParameters(IRestRequest request)
285292
return querystring.ToString();
286293
}
287294

288-
private void ConfigureHttp(IRestRequest request, IHttp http) {
295+
private void ConfigureHttp(IRestRequest request, IHttp http)
296+
{
289297
http.AlwaysMultipartFormData = request.AlwaysMultipartFormData;
290298

291299
http.CookieContainer = CookieContainer;
292300

293301
http.ResponseWriter = request.ResponseWriter;
294302

295303
// move RestClient.DefaultParameters into Request.Parameters
296-
foreach(var p in DefaultParameters)
304+
foreach (var p in DefaultParameters)
297305
{
298-
if(request.Parameters.Any(p2 => p2.Name == p.Name && p2.Type == p.Type))
306+
if (request.Parameters.Any(p2 => p2.Name == p.Name && p2.Type == p.Type))
299307
{
300308
continue;
301309
}
@@ -333,7 +341,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) {
333341
http.MaxRedirects = MaxRedirects;
334342
#endif
335343

336-
if(request.Credentials != null)
344+
if (request.Credentials != null)
337345
{
338346
http.Credentials = request.Credentials;
339347
}
@@ -346,7 +354,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) {
346354
Value = p.Value.ToString()
347355
};
348356

349-
foreach(var header in headers)
357+
foreach (var header in headers)
350358
{
351359
http.Headers.Add(header);
352360
}
@@ -359,7 +367,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) {
359367
Value = p.Value.ToString()
360368
};
361369

362-
foreach(var cookie in cookies)
370+
foreach (var cookie in cookies)
363371
{
364372
http.Cookies.Add(cookie);
365373
}
@@ -373,12 +381,12 @@ private void ConfigureHttp(IRestRequest request, IHttp http) {
373381
Value = p.Value.ToString()
374382
};
375383

376-
foreach(var parameter in @params)
384+
foreach (var parameter in @params)
377385
{
378386
http.Parameters.Add(parameter);
379387
}
380388

381-
foreach(var file in request.Files)
389+
foreach (var file in request.Files)
382390
{
383391
http.Files.Add(new HttpFile { Name = file.Name, ContentType = file.ContentType, Writer = file.Writer, FileName = file.FileName, ContentLength = file.ContentLength });
384392
}
@@ -387,7 +395,7 @@ private void ConfigureHttp(IRestRequest request, IHttp http) {
387395
where p.Type == ParameterType.RequestBody
388396
select p).FirstOrDefault();
389397

390-
if(body != null)
398+
if (body != null)
391399
{
392400
object val = body.Value;
393401
if (val is byte[])
@@ -435,7 +443,8 @@ private RestResponse ConvertToRestResponse(IRestRequest request, HttpResponse ht
435443

436444
foreach (var cookie in httpResponse.Cookies)
437445
{
438-
restResponse.Cookies.Add(new RestResponseCookie {
446+
restResponse.Cookies.Add(new RestResponseCookie
447+
{
439448
Comment = cookie.Comment,
440449
CommentUri = cookie.CommentUri,
441450
Discard = cookie.Discard,
@@ -467,8 +476,8 @@ private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse raw)
467476
response.Request = request;
468477

469478
// Only attempt to deserialize if the request has a chance of containing a valid entry
470-
if (response.StatusCode == HttpStatusCode.OK
471-
|| response.StatusCode == HttpStatusCode.Created
479+
if (response.StatusCode == HttpStatusCode.OK
480+
|| response.StatusCode == HttpStatusCode.Created
472481
|| response.StatusCode == HttpStatusCode.NonAuthoritativeInformation)
473482
{
474483
IDeserializer handler = GetHandler(raw.ContentType);

0 commit comments

Comments
 (0)