Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions RestSharp.Tests/UrlBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
}
}
3 changes: 2 additions & 1 deletion RestSharp/Enum.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public enum ParameterType
GetOrPost,
UrlSegment,
HttpHeader,
RequestBody
RequestBody,
QueryString
}

/// <summary>
Expand Down
53 changes: 31 additions & 22 deletions RestSharp/RestClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,25 +257,32 @@ public Uri BuildUri(IRestRequest request)
}
}

if (request.Method != Method.POST
&& request.Method != Method.PUT
&& request.Method != Method.PATCH)
IEnumerable<Parameter> 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<Parameter> 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("&");
Expand All @@ -285,17 +292,18 @@ 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;

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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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 });
}
Expand All @@ -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[])
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -467,8 +476,8 @@ private IRestResponse<T> Deserialize<T>(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);
Expand Down