Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for eTag and CancellationToken for each method. + .net8 support #78

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
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
20 changes: 10 additions & 10 deletions ESI.NET/ESI.NET.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
</PropertyGroup>

<PropertyGroup>
<TargetFrameworks>netcoreapp3.1;netstandard2.0;net462;net47;net471;net472;net48;net6.0;net7.0</TargetFrameworks>
<TargetFrameworks>net6.0;net7.0;netcoreapp3.1;netstandard2.0;net8.0</TargetFrameworks>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2023.12.12</Version>
<Authors>Psianna Archeia</Authors>
Expand All @@ -21,15 +21,15 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.0.0" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.14.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="System.Collections.Immutable" Version="1.5.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.14.1" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="8.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.Collections.Immutable" Version="8.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.0.2" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
</ItemGroup>

Expand Down
1 change: 1 addition & 0 deletions ESI.NET/EsiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ public void SetCharacterData(AuthorizedCharacterData data)
Universe = new UniverseLogic(client, config, data);
}

[Obsolete]
public void SetIfNoneMatchHeader(string eTag)
=> EsiRequest.ETag = eTag;
}
Expand Down
28 changes: 21 additions & 7 deletions ESI.NET/EsiRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ESI.NET
Expand All @@ -12,7 +13,18 @@ internal static class EsiRequest
{
internal static string ETag;

public static async Task<EsiResponse<T>> Execute<T>(HttpClient client, EsiConfig config, RequestSecurity security, HttpMethod httpMethod, string endpoint, Dictionary<string, string> replacements = null, string[] parameters = null, object body = null, string token = null)
public static async Task<EsiResponse<T>> Execute<T>(
HttpClient client,
EsiConfig config,
RequestSecurity security,
HttpMethod httpMethod,
string endpoint,
string eTag = null,
CancellationToken cancellationToken = default,
Dictionary<string, string> replacements = null,
string[] parameters = null,
object body = null,
string token = null)
{
var path = $"{httpMethod}|{endpoint}";

Expand All @@ -32,22 +44,24 @@ public static async Task<EsiResponse<T>> Execute<T>(HttpClient client, EsiConfig
if (security == RequestSecurity.Authenticated)
{
if (token == null)
throw new ArgumentException("The request endpoint requires SSO authentication and a Token has not been provided.");
throw new ArgumentException(
"The request endpoint requires SSO authentication and a Token has not been provided.");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
}

if (ETag != null)
if (eTag != null || ETag != null)
{
request.Headers.Add("If-None-Match", $"\"{ETag}\"");
request.Headers.Add("If-None-Match", $"\"{eTag ?? ETag}\"");
ETag = null;
}

//Serialize post body data
if (body != null)
request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json");
request.Content =
new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json");

//Output final object
return new EsiResponse<T>(await client.SendAsync(request).ConfigureAwait(false), path);
return new EsiResponse<T>(await client.SendAsync(request, cancellationToken).ConfigureAwait(false), path);
}

public enum RequestSecurity
Expand All @@ -56,4 +70,4 @@ public enum RequestSecurity
Authenticated
}
}
}
}
37 changes: 28 additions & 9 deletions ESI.NET/Logic/AllianceLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using ESI.NET.Models.Alliance;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using static ESI.NET.EsiRequest;

Expand All @@ -12,22 +13,32 @@ public class AllianceLogic
private readonly HttpClient _client;
private readonly EsiConfig _config;

public AllianceLogic(HttpClient client, EsiConfig config) { _client = client; _config = config; }
public AllianceLogic(HttpClient client, EsiConfig config)
{
_client = client;
_config = config;
}

/// <summary>
/// /alliances/
/// </summary>
/// <returns></returns>
public async Task<EsiResponse<int[]>> All()
=> await Execute<int[]>(_client, _config, RequestSecurity.Public, HttpMethod.Get, "/alliances/");
public async Task<EsiResponse<int[]>> All(string eTag = null, CancellationToken cancellationToken = default)
=> await Execute<int[]>(_client, _config, RequestSecurity.Public, HttpMethod.Get, "/alliances/",
eTag: eTag,
cancellationToken: cancellationToken);

/// <summary>
/// /alliances/{alliance_id}/
/// </summary>
/// <param name="allianceId"></param>
/// <returns></returns>
public async Task<EsiResponse<Alliance>> Information(int alliance_id)
=> await Execute<Alliance>(_client, _config, RequestSecurity.Public, HttpMethod.Get, "/alliances/{alliance_id}/",
public async Task<EsiResponse<Alliance>> Information(int alliance_id, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<Alliance>(_client, _config, RequestSecurity.Public, HttpMethod.Get,
"/alliances/{alliance_id}/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "alliance_id", alliance_id.ToString() }
Expand All @@ -38,8 +49,12 @@ public async Task<EsiResponse<Alliance>> Information(int alliance_id)
/// </summary>
/// <param name="alliance_id"></param>
/// <returns></returns>
public async Task<EsiResponse<int[]>> Corporations(int alliance_id)
=> await Execute<int[]>(_client, _config, RequestSecurity.Public, HttpMethod.Get, "/alliances/{alliance_id}/corporations/",
public async Task<EsiResponse<int[]>> Corporations(int alliance_id, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<int[]>(_client, _config, RequestSecurity.Public, HttpMethod.Get,
"/alliances/{alliance_id}/corporations/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "alliance_id", alliance_id.ToString() }
Expand All @@ -50,8 +65,12 @@ public async Task<EsiResponse<int[]>> Corporations(int alliance_id)
/// </summary>
/// <param name="alliance_id"></param>
/// <returns></returns>
public async Task<EsiResponse<Images>> Icons(int alliance_id)
=> await Execute<Images>(_client, _config, RequestSecurity.Public, HttpMethod.Get, "/alliances/{alliance_id}/icons/",
public async Task<EsiResponse<Images>> Icons(int alliance_id, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<Images>(_client, _config, RequestSecurity.Public, HttpMethod.Get,
"/alliances/{alliance_id}/icons/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "alliance_id", alliance_id.ToString() }
Expand Down
44 changes: 32 additions & 12 deletions ESI.NET/Logic/AssetsLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using ESI.NET.Models.SSO;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using static ESI.NET.EsiRequest;

Expand Down Expand Up @@ -32,8 +33,12 @@ public AssetsLogic(HttpClient client, EsiConfig config, AuthorizedCharacterData
/// </summary>
/// <param name="page"></param>
/// <returns></returns>
public async Task<EsiResponse<List<Item>>> ForCharacter(int page = 1)
=> await Execute<List<Item>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get, "/characters/{character_id}/assets/",
public async Task<EsiResponse<List<Item>>> ForCharacter(int page = 1, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<List<Item>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get,
"/characters/{character_id}/assets/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "character_id", character_id.ToString() }
Expand All @@ -49,8 +54,11 @@ public async Task<EsiResponse<List<Item>>> ForCharacter(int page = 1)
/// </summary>
/// <param name="item_ids"></param>
/// <returns></returns>
public async Task<EsiResponse<List<ItemLocation>>> LocationsForCharacter(List<long> item_ids)
=> await Execute<List<ItemLocation>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post, "/characters/{character_id}/assets/locations/",
public async Task<EsiResponse<List<ItemLocation>>> LocationsForCharacter(List<long> item_ids,
CancellationToken cancellationToken = default)
=> await Execute<List<ItemLocation>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post,
"/characters/{character_id}/assets/locations/",
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "character_id", character_id.ToString() }
Expand All @@ -63,8 +71,11 @@ public async Task<EsiResponse<List<ItemLocation>>> LocationsForCharacter(List<lo
/// </summary>
/// <param name="item_ids"></param>
/// <returns></returns>
public async Task<EsiResponse<List<ItemName>>> NamesForCharacter(List<long> item_ids)
=> await Execute<List<ItemName>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post, "/characters/{character_id}/assets/names/",
public async Task<EsiResponse<List<ItemName>>> NamesForCharacter(List<long> item_ids,
CancellationToken cancellationToken = default)
=> await Execute<List<ItemName>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post,
"/characters/{character_id}/assets/names/",
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "character_id", character_id.ToString() }
Expand All @@ -78,8 +89,12 @@ public async Task<EsiResponse<List<ItemName>>> NamesForCharacter(List<long> item
/// </summary>
/// <param name="page"></param>
/// <returns></returns>
public async Task<EsiResponse<List<Item>>> ForCorporation(int page = 1)
=> await Execute<List<Item>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get, "/corporations/{corporation_id}/assets/",
public async Task<EsiResponse<List<Item>>> ForCorporation(int page = 1, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<List<Item>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get,
"/corporations/{corporation_id}/assets/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "corporation_id", corporation_id.ToString() }
Expand All @@ -95,8 +110,11 @@ public async Task<EsiResponse<List<Item>>> ForCorporation(int page = 1)
/// </summary>
/// <param name="item_ids"></param>
/// <returns></returns>
public async Task<EsiResponse<List<ItemLocation>>> LocationsForCorporation(List<long> item_ids)
=> await Execute<List<ItemLocation>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post, "/corporations/{corporation_id}/assets/locations/",
public async Task<EsiResponse<List<ItemLocation>>> LocationsForCorporation(List<long> item_ids,
CancellationToken cancellationToken = default)
=> await Execute<List<ItemLocation>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post,
"/corporations/{corporation_id}/assets/locations/",
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "corporation_id", corporation_id.ToString() }
Expand All @@ -109,8 +127,10 @@ public async Task<EsiResponse<List<ItemLocation>>> LocationsForCorporation(List<
/// </summary>
/// <param name="item_ids"></param>
/// <returns></returns>
public async Task<EsiResponse<List<ItemName>>> NamesForCorporation(List<long> item_ids)
=> await Execute<List<ItemName>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post, "/corporations/{corporation_id}/assets/names/",
public async Task<EsiResponse<List<ItemName>>> NamesForCorporation(List<long> item_ids, CancellationToken cancellationToken = default)
=> await Execute<List<ItemName>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Post,
"/corporations/{corporation_id}/assets/names/",
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "corporation_id", corporation_id.ToString() }
Expand Down
37 changes: 28 additions & 9 deletions ESI.NET/Logic/BookmarksLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using ESI.NET.Models.SSO;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using static ESI.NET.EsiRequest;

Expand All @@ -14,7 +15,9 @@ public class BookmarksLogic
private readonly AuthorizedCharacterData _data;
private readonly int character_id, corporation_id;

public BookmarksLogic(HttpClient client, EsiConfig config, AuthorizedCharacterData data = null)
public BookmarksLogic(HttpClient client, EsiConfig config, AuthorizedCharacterData data = null,
string eTag = null,
CancellationToken cancellationToken = default)
{
_client = client;
_config = config;
Expand All @@ -31,8 +34,12 @@ public BookmarksLogic(HttpClient client, EsiConfig config, AuthorizedCharacterDa
/// /characters/{character_id}/bookmarks/
/// </summary>
/// <returns></returns>
public async Task<EsiResponse<List<Bookmark>>> ForCharacter(int page = 1)
=> await Execute<List<Bookmark>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get, "/characters/{character_id}/bookmarks/",
public async Task<EsiResponse<List<Bookmark>>> ForCharacter(int page = 1, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<List<Bookmark>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get,
"/characters/{character_id}/bookmarks/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "character_id", character_id.ToString() }
Expand All @@ -47,8 +54,12 @@ public async Task<EsiResponse<List<Bookmark>>> ForCharacter(int page = 1)
/// /characters/{character_id}/bookmarks/folders/
/// </summary>
/// <returns></returns>
public async Task<EsiResponse<List<Folder>>> FoldersForCharacter(int page = 1)
=> await Execute<List<Folder>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get, "/characters/{character_id}/bookmarks/folders/",
public async Task<EsiResponse<List<Folder>>> FoldersForCharacter(int page = 1, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<List<Folder>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get,
"/characters/{character_id}/bookmarks/folders/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "character_id", character_id.ToString() }
Expand All @@ -63,8 +74,12 @@ public async Task<EsiResponse<List<Folder>>> FoldersForCharacter(int page = 1)
/// /corporations/{corporation_id}/bookmarks/
/// </summary>
/// <returns></returns>
public async Task<EsiResponse<List<Bookmark>>> ForCorporation(int page = 1)
=> await Execute<List<Bookmark>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get, "/corporations/{corporation_id}/bookmarks/",
public async Task<EsiResponse<List<Bookmark>>> ForCorporation(int page = 1, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<List<Bookmark>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get,
"/corporations/{corporation_id}/bookmarks/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "corporation_id", corporation_id.ToString() }
Expand All @@ -79,8 +94,12 @@ public async Task<EsiResponse<List<Bookmark>>> ForCorporation(int page = 1)
/// /corporations/{corporation_id}/bookmarks/folders/
/// </summary>
/// <returns></returns>
public async Task<EsiResponse<List<Folder>>> FoldersForCorporation(int page = 1)
=> await Execute<List<Folder>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get, "/corporations/{corporation_id}/bookmarks/folders/",
public async Task<EsiResponse<List<Folder>>> FoldersForCorporation(int page = 1, string eTag = null,
CancellationToken cancellationToken = default)
=> await Execute<List<Folder>>(_client, _config, RequestSecurity.Authenticated, HttpMethod.Get,
"/corporations/{corporation_id}/bookmarks/folders/",
eTag: eTag,
cancellationToken: cancellationToken,
replacements: new Dictionary<string, string>()
{
{ "corporation_id", corporation_id.ToString() }
Expand Down
Loading