Skip to content

Commit

Permalink
Merge pull request #39 from henrikfroehling/GH-37
Browse files Browse the repository at this point in the history
Resolves GH-37
  • Loading branch information
henrikfroehling committed Jul 28, 2018
2 parents 9a4fec6 + 31f685b commit b70e57f
Show file tree
Hide file tree
Showing 10 changed files with 352 additions and 230 deletions.
11 changes: 8 additions & 3 deletions Source/Lib/Trakt.NET/Modules/TraktAuthenticationModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -188,23 +188,28 @@ public Task<TraktResponse<ITraktAuthorization>> RefreshAuthorizationAsync(string
}

public Task<TraktNoContentResponse> RevokeAuthorizationAsync(CancellationToken cancellationToken = default)
=> RevokeAuthorizationAsync(Authorization.AccessToken, cancellationToken);
=> RevokeAuthorizationAsync(Authorization?.AccessToken, cancellationToken);

public Task<TraktNoContentResponse> RevokeAuthorizationAsync(string accessToken, CancellationToken cancellationToken = default)
=> RevokeAuthorizationAsync(accessToken, ClientId, cancellationToken);

public Task<TraktNoContentResponse> RevokeAuthorizationAsync(string accessToken, string clientId, CancellationToken cancellationToken = default)
=> RevokeAuthorizationAsync(accessToken, clientId, ClientSecret, cancellationToken);

public Task<TraktNoContentResponse> RevokeAuthorizationAsync(string accessToken, string clientId, string clientSecret, CancellationToken cancellationToken = default)
{
var request = new AuthorizationRevokeRequest
{
RequestBody = new AuthorizationRevokeRequestBody
{
AccessToken = accessToken
AccessToken = accessToken,
ClientId = clientId,
ClientSecret = clientSecret
}
};

var requestHandler = new AuthenticationRequestHandler(Client);
return requestHandler.RevokeAuthorizationAsync(request, clientId, cancellationToken);
return requestHandler.RevokeAuthorizationAsync(request, cancellationToken);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

internal sealed class AuthorizationRevokeRequest : APostRequest<AuthorizationRevokeRequestBody>
{
public override AuthorizationRequirement AuthorizationRequirement => AuthorizationRequirement.NotRequired;

public override string UriTemplate => "oauth/revoke";

public override AuthorizationRevokeRequestBody RequestBody { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,26 @@ internal sealed class AuthorizationRevokeRequestBody : IRequestBody
{
internal string AccessToken { get; set; }

internal string ClientId { get; set; }

internal string ClientSecret { get; set; }

public Task<string> ToJson(CancellationToken cancellationToken = default)
{
return Task.FromResult(HttpContentAsString);
}
=> Task.FromResult(HttpContentAsString);

private string HttpContentAsString => $"token={AccessToken}";
private string HttpContentAsString => $"{{ \"token\": \"{AccessToken}\", \"client_id\": \"{ClientId}\"," +
$" \"client_secret\": \"{ClientSecret}\" }}";

public void Validate()
{
if (string.IsNullOrEmpty(AccessToken) || AccessToken.ContainsSpace())
throw new ArgumentException("access token not valid", nameof(AccessToken));

if (string.IsNullOrEmpty(ClientId) || ClientId.ContainsSpace())
throw new ArgumentException("client id not valid", nameof(ClientId));

if (string.IsNullOrEmpty(ClientSecret) || ClientSecret.ContainsSpace())
throw new ArgumentException("client secret not valid", nameof(ClientSecret));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,14 @@ public async Task<TraktResponse<ITraktDevice>> GetDeviceAsync(DeviceRequest requ
try
{
request.Validate();
ExtendedHttpRequestMessage requestMessage = await _requestMessageBuilder.Reset(request).WithRequestBody(request.RequestBody).Build().ConfigureAwait(false);

ExtendedHttpRequestMessage requestMessage =
await _requestMessageBuilder.Reset(request)
.WithRequestBody(request.RequestBody)
.DisableAPIVersionHeader()
.DisableAPIClientIdHeader()
.Build().ConfigureAwait(false);

HttpResponseMessage responseMessage = await _client.HttpClientProvider.GetHttpClient().SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);

if (!responseMessage.IsSuccessStatusCode)
Expand Down Expand Up @@ -185,7 +192,14 @@ public async Task<TraktResponse<ITraktAuthorization>> PollForAuthorizationAsync(
try
{
request.Validate();
ExtendedHttpRequestMessage requestMessage = await _requestMessageBuilder.Reset(request).WithRequestBody(request.RequestBody).Build().ConfigureAwait(false);

ExtendedHttpRequestMessage requestMessage =
await _requestMessageBuilder.Reset(request)
.WithRequestBody(request.RequestBody)
.DisableAPIVersionHeader()
.DisableAPIClientIdHeader()
.Build().ConfigureAwait(false);

HttpResponseMessage responseMessage;
Stream responseContentStream;
HttpStatusCode responseCode;
Expand Down Expand Up @@ -250,19 +264,19 @@ public async Task<TraktResponse<ITraktAuthorization>> PollForAuthorizationAsync(
public Task<TraktResponse<ITraktAuthorization>> RefreshAuthorizationAsync(AuthorizationRefreshRequest request, CancellationToken cancellationToken = default)
=> ExecuteAuthorizationRequestAsync(request, true, cancellationToken);

public async Task<TraktNoContentResponse> RevokeAuthorizationAsync(AuthorizationRevokeRequest request, string clientId, CancellationToken cancellationToken = default)
public async Task<TraktNoContentResponse> RevokeAuthorizationAsync(AuthorizationRevokeRequest request, CancellationToken cancellationToken = default)
{
try
{
if (!_client.Authentication.IsAuthorized)
throw new TraktAuthorizationException("not authorized");
request.Validate();

if (string.IsNullOrEmpty(clientId) || clientId.ContainsSpace())
throw new ArgumentException("client id not valid", nameof(clientId));
ExtendedHttpRequestMessage requestMessage =
await _requestMessageBuilder.Reset(request)
.WithRequestBody(request.RequestBody)
.DisableAPIVersionHeader()
.DisableAPIClientIdHeader()
.Build().ConfigureAwait(false);

request.Validate();
ExtendedHttpRequestMessage requestMessage = await _requestMessageBuilder.Reset(request).WithRequestBody(request.RequestBody).Build().ConfigureAwait(false);
//HttpClient httpClient = _httpClientProvider.GetHttpClient(clientId, request.RequestBody.AccessToken);
HttpResponseMessage responseMessage = await _client.HttpClientProvider.GetHttpClient().SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);

if (!responseMessage.IsSuccessStatusCode)
Expand Down Expand Up @@ -314,7 +328,14 @@ public async Task<TraktNoContentResponse> RevokeAuthorizationAsync(Authorization
try
{
request.Validate();
ExtendedHttpRequestMessage requestMessage = await _requestMessageBuilder.Reset(request).WithRequestBody(request.RequestBody).Build().ConfigureAwait(false);

ExtendedHttpRequestMessage requestMessage =
await _requestMessageBuilder.Reset(request)
.WithRequestBody(request.RequestBody)
.DisableAPIVersionHeader()
.DisableAPIClientIdHeader()
.Build().ConfigureAwait(false);

HttpResponseMessage responseMessage = await _client.HttpClientProvider.GetHttpClient().SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);

HttpStatusCode responseCode = responseMessage.StatusCode;
Expand Down
6 changes: 2 additions & 4 deletions Source/Lib/Trakt.NET/Requests/Handler/HttpClientProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,17 @@ public virtual HttpClient GetHttpClient()
return httpClient;
}

private HttpClient SetupHttpClient()
protected virtual HttpClient SetupHttpClient()
{
var httpClient = new HttpClient();
SetDefaultRequestHeaders(httpClient);
return httpClient;
}

private void SetDefaultRequestHeaders(HttpClient httpClient)
protected virtual void SetDefaultRequestHeaders(HttpClient httpClient)
{
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(MEDIA_TYPE_HEADER);
httpClient.DefaultRequestHeaders.Add(Constants.APIVersionHeaderKey, $"{_client.Configuration.ApiVersion}");
httpClient.DefaultRequestHeaders.Add(Constants.APIClientIdHeaderKey, _client.ClientId);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ internal interface IAuthenticationRequestHandler

Task<TraktResponse<ITraktAuthorization>> RefreshAuthorizationAsync(AuthorizationRefreshRequest request, CancellationToken cancellationToken = default);

Task<TraktNoContentResponse> RevokeAuthorizationAsync(AuthorizationRevokeRequest request, string clientId, CancellationToken cancellationToken = default);
Task<TraktNoContentResponse> RevokeAuthorizationAsync(AuthorizationRevokeRequest request, CancellationToken cancellationToken = default);
}
}
45 changes: 42 additions & 3 deletions Source/Lib/Trakt.NET/Requests/Handler/RequestMessageBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,15 @@ internal class RequestMessageBuilder
private IRequest _request;
private IRequestBody _requestBody;
private readonly TraktClient _client;
private bool _useAPIVersionHeader;
private bool _useAPIClientIdHeader;

internal RequestMessageBuilder(TraktClient client) => _client = client ?? throw new ArgumentNullException(nameof(client));
internal RequestMessageBuilder(TraktClient client)
{
_useAPIVersionHeader = true;
_useAPIClientIdHeader = true;
_client = client ?? throw new ArgumentNullException(nameof(client));
}

internal RequestMessageBuilder(IRequest request, TraktClient client) : this(client) => _request = request;

Expand All @@ -36,16 +43,42 @@ internal RequestMessageBuilder WithRequestBody(IRequestBody requestBody)

internal RequestMessageBuilder Reset(IRequest request)
{
_useAPIVersionHeader = true;
_useAPIClientIdHeader = true;
_request = request;
_requestBody = null;
return this;
}

internal RequestMessageBuilder DisableAPIVersionHeader()
{
_useAPIVersionHeader = false;
return this;
}

internal RequestMessageBuilder EnableAPIVersionHeader()
{
_useAPIVersionHeader = true;
return this;
}

internal RequestMessageBuilder DisableAPIClientIdHeader()
{
_useAPIClientIdHeader = false;
return this;
}

internal RequestMessageBuilder EnableAPIClientIdHeader()
{
_useAPIClientIdHeader = true;
return this;
}

internal async Task<ExtendedHttpRequestMessage> Build(CancellationToken cancellationToken = default)
{
ExtendedHttpRequestMessage requestMessage = CreateRequestMessage();
await AddRequestBodyContent(requestMessage, cancellationToken).ConfigureAwait(false);
SetRequestMessageHeadersForAuthorization(requestMessage);
SetRequestMessageHeaders(requestMessage);
return requestMessage;
}

Expand Down Expand Up @@ -114,8 +147,14 @@ private async Task AddRequestBodyContent(ExtendedHttpRequestMessage requestMessa
}
}

private void SetRequestMessageHeadersForAuthorization(ExtendedHttpRequestMessage requestMessage)
private void SetRequestMessageHeaders(ExtendedHttpRequestMessage requestMessage)
{
if (_useAPIVersionHeader)
requestMessage.Headers.Add(Constants.APIVersionHeaderKey, $"{_client.Configuration.ApiVersion}");

if (_useAPIClientIdHeader)
requestMessage.Headers.Add(Constants.APIClientIdHeaderKey, _client.ClientId);

AuthorizationRequirement authorizationRequirement = _request.AuthorizationRequirement;

if (authorizationRequirement != AuthorizationRequirement.NotRequired)
Expand Down
Loading

0 comments on commit b70e57f

Please sign in to comment.