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
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public ApiWithCredentials()

public IFluentApi<T> Create<T>() where T : class, new()
{
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(_apiUrl, _credentials), new ResponseParser(new ApiResponseDetector()));
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(new RouteParamsSubstitutor(_apiUrl), _credentials), new ResponseParser(new ApiResponseDetector()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public void Setup()
A.CallTo(() => _oAuthCredentials.ConsumerKey).Returns("testkey");
A.CallTo(() => _oAuthCredentials.ConsumerSecret).Returns("testsecret");

_requestBuilder = new RequestBuilder(_apiUri, _oAuthCredentials);
_requestBuilder = new RequestBuilder(new RouteParamsSubstitutor(_apiUri), _oAuthCredentials);
}

[TestCase]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public void SetUp()
{
var appSettingsCredentials = new StubbedConsumerCreds();
var apiUri = new ApiUri();
_requestBuilder = new RequestBuilder(apiUri, appSettingsCredentials);
_requestBuilder = new RequestBuilder(new RouteParamsSubstitutor(apiUri), appSettingsCredentials);
}

[Test]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class RequestBuilderTests
public void Setup()
{
_requestBuilder = new RequestBuilder(
EssentialDependencyCheck<IApiUri>.Instance,
new RouteParamsSubstitutor(new ApiUri()),
EssentialDependencyCheck<IOAuthCredentials>.Instance);
}

Expand Down Expand Up @@ -69,7 +69,7 @@ public void Should_use_api_uri_provided_by_IApiUri_interface()

var apiUri = A.Fake<IApiUri>();
A.CallTo(() => apiUri.Uri).Returns(expectedApiUri);
_requestBuilder = new RequestBuilder(apiUri, EssentialDependencyCheck<IOAuthCredentials>.Instance);
_requestBuilder = new RequestBuilder(new RouteParamsSubstitutor(apiUri), EssentialDependencyCheck<IOAuthCredentials>.Instance);

var requestData = new RequestData
{
Expand Down Expand Up @@ -131,7 +131,36 @@ public void Post_data_with_requestBody_passes_post_body_to_main_request()

var request = _requestBuilder.BuildRequest(requestData);
Assert.That(request.Body.Data, Is.EqualTo("I am a payload"));
Assert.That(request.Body.ContentType, Is.EqualTo("text/plain"));
Assert.That(request.Body.ContentType, Is.EqualTo("text/plain"));
}

[Test]
public void Post_data_with_requestBody_does_not_add_query_string_params()
{
var queryStringParameters = new Dictionary<string, string>();
var requestData = new RequestData
{
HttpMethod = HttpMethod.Post,
Payload = new RequestPayload("application/x-www-form-urlencoded", "foo=bar"),
RequiresSignature = true
};

var credentials = A.Fake<IOAuthCredentials>();
A.CallTo(() => credentials.ConsumerKey).Returns("MyKey");
A.CallTo(() => credentials.ConsumerSecret).Returns("MySecret");

var substitutor = A.Fake<IRouteParamsSubstitutor>();
A.CallTo(() => substitutor.SubstituteParamsInRequest(requestData))
.Returns(new ApiRequest
{
Parameters = queryStringParameters,
AbsoluteUrl = "http://www.7digital.com"
});

_requestBuilder = new RequestBuilder(substitutor, credentials);
_requestBuilder.BuildRequest(requestData);

Assert.That(queryStringParameters.Count, Is.EqualTo(0), "Unexpected query string parameter");
}

[Test]
Expand Down
2 changes: 1 addition & 1 deletion src/SevenDigital.Api.Wrapper/Api.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public ApiFactory(IApiUri apiUri, IOAuthCredentials oauthCredentials)

public IFluentApi<T> Create<T>() where T : class, new()
{
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(_apiUri, _oauthCredentials), new ResponseParser(new ApiResponseDetector()));
return new FluentApi<T>(new HttpClientMediator(), new RequestBuilder(new RouteParamsSubstitutor(_apiUri), _oauthCredentials), new ResponseParser(new ApiResponseDetector()));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace SevenDigital.Api.Wrapper.Requests
{
public interface IRouteParamsSubstitutor
{
ApiRequest SubstituteParamsInRequest(RequestData requestData);
}
}
20 changes: 11 additions & 9 deletions src/SevenDigital.Api.Wrapper/Requests/RequestBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ public class RequestBuilder : IRequestBuilder
private const string FormUrlEncoded = "application/x-www-form-urlencoded";

private readonly IOAuthCredentials _oAuthCredentials;
private readonly RouteParamsSubstitutor _routeParamsSubstitutor;
private readonly IRouteParamsSubstitutor _routeParamsSubstitutor;

public RequestBuilder(IApiUri apiUri, IOAuthCredentials oAuthCredentials)
public RequestBuilder(IRouteParamsSubstitutor routeParamsSubstitutor, IOAuthCredentials oAuthCredentials)
{
_oAuthCredentials = oAuthCredentials;
_routeParamsSubstitutor = new RouteParamsSubstitutor(apiUri);
_routeParamsSubstitutor = routeParamsSubstitutor;
}

public Request BuildRequest(RequestData requestData)
Expand Down Expand Up @@ -67,7 +67,7 @@ private string GetAuthorizationHeader(RequestData requestData, string fullUrl, A
return "oauth_consumer_key=" + _oAuthCredentials.ConsumerKey;
}

private string BuildOAuthHeader(RequestData requestData, string fullUrl, IDictionary<string, string> parameters, RequestPayload requestBody)
private string BuildOAuthHeader(RequestData requestData, string fullUrl, IDictionary<string, string> queryStringParameters, RequestPayload requestBody)
{
var httpMethod = requestData.HttpMethod.ToString().ToUpperInvariant();

Expand All @@ -87,24 +87,26 @@ private string BuildOAuthHeader(RequestData requestData, string fullUrl, IDictio
oauthRequest.TokenSecret = requestData.OAuthTokenSecret;
}

if (ShouldReadParamsFromBody(parameters, requestBody))
var headerParameters = queryStringParameters.ToDictionary(x => x.Key, x => x.Value);

if (ShouldReadParamsFromBody(queryStringParameters, requestBody))
{
var bodyParams = HttpUtility.ParseQueryString(requestBody.Data);
var keys = bodyParams.AllKeys.Where(x => !string.IsNullOrEmpty(x));
foreach (var key in keys)
{
parameters.Add(key, bodyParams[key]);
headerParameters.Add(key, bodyParams[key]);
}
}

return oauthRequest.GetAuthorizationHeader(parameters);
return oauthRequest.GetAuthorizationHeader(headerParameters);
}

private static bool ShouldReadParamsFromBody(IDictionary<string, string> parameters, RequestPayload requestBody)
private static bool ShouldReadParamsFromBody(IDictionary<string, string> queryStringParameters, RequestPayload requestBody)
{
return (requestBody.ContentType == FormUrlEncoded) &&
!string.IsNullOrEmpty(requestBody.Data) &&
(parameters.Count == 0);
(queryStringParameters.Count == 0);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace SevenDigital.Api.Wrapper.Requests
{
public class RouteParamsSubstitutor
public class RouteParamsSubstitutor : IRouteParamsSubstitutor
{
private readonly IBaseUriProvider _defaultBaseUriProvider;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
<Compile Include="Requests\BaseUriFromString.cs" />
<Compile Include="Requests\IBaseUriProvider.cs" />
<Compile Include="Requests\IRequestBuilder.cs" />
<Compile Include="Requests\IRouteParamsSubstitutor.cs" />
<Compile Include="Requests\RequestBuilder.cs" />
<Compile Include="Requests\RequestPayload.cs" />
<Compile Include="Requests\RouteParamsSubstitutor.cs" />
Expand Down