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
6 changes: 6 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>
</Project>
2 changes: 0 additions & 2 deletions Seq.Api.sln.DotSettings

This file was deleted.

1 change: 0 additions & 1 deletion example/SeqTail/Program.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using DocoptNet;
using Seq.Api;
Expand Down
70 changes: 35 additions & 35 deletions src/Seq.Api/Client/SeqApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,95 +60,95 @@ public SeqApiClient(string serverUrl, string apiKey = null, bool useDefaultCrede

public HttpClient HttpClient => _httpClient;

public Task<RootEntity> GetRootAsync()
public Task<RootEntity> GetRootAsync(CancellationToken token = default)
{
return HttpGetAsync<RootEntity>("api");
return HttpGetAsync<RootEntity>("api", token);
}

public Task<TEntity> GetAsync<TEntity>(ILinked entity, string link, IDictionary<string, object> parameters = null)
public Task<TEntity> GetAsync<TEntity>(ILinked entity, string link, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
return HttpGetAsync<TEntity>(linkUri);
return HttpGetAsync<TEntity>(linkUri, token);
}

public Task<string> GetStringAsync(ILinked entity, string link, IDictionary<string, object> parameters = null)
public Task<string> GetStringAsync(ILinked entity, string link, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
return HttpGetStringAsync(linkUri);
return HttpGetStringAsync(linkUri, token);
}

public Task<List<TEntity>> ListAsync<TEntity>(ILinked entity, string link, IDictionary<string, object> parameters = null)
public Task<List<TEntity>> ListAsync<TEntity>(ILinked entity, string link, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
return HttpGetAsync<List<TEntity>>(linkUri);
return HttpGetAsync<List<TEntity>>(linkUri, token);
}

public async Task PostAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null)
public async Task PostAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Post, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
new StreamReader(stream).ReadToEnd();
}

public async Task<TResponse> PostAsync<TEntity, TResponse>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null)
public async Task<TResponse> PostAsync<TEntity, TResponse>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Post, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
return _serializer.Deserialize<TResponse>(new JsonTextReader(new StreamReader(stream)));
}

public async Task<string> PostReadStringAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null)
public async Task<string> PostReadStringAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Post, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
return await new StreamReader(stream).ReadToEndAsync();
}

public async Task<Stream> PostReadStreamAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null)
public async Task<Stream> PostReadStreamAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Post, linkUri) { Content = MakeJsonContent(content) };
return await HttpSendAsync(request).ConfigureAwait(false);
return await HttpSendAsync(request, token).ConfigureAwait(false);
}

public async Task PutAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null)
public async Task PutAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Put, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
new StreamReader(stream).ReadToEnd();
}

public async Task DeleteAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null)
public async Task DeleteAsync<TEntity>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Delete, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
new StreamReader(stream).ReadToEnd();
}

public async Task<TResponse> DeleteAsync<TEntity, TResponse>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null)
public async Task<TResponse> DeleteAsync<TEntity, TResponse>(ILinked entity, string link, TEntity content, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Delete, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
return _serializer.Deserialize<TResponse>(new JsonTextReader(new StreamReader(stream)));
}

public async Task<ObservableStream<TEntity>> StreamAsync<TEntity>(ILinked entity, string link, IDictionary<string, object> parameters = null)
public async Task<ObservableStream<TEntity>> StreamAsync<TEntity>(ILinked entity, string link, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
return await WebSocketStreamAsync(entity, link, parameters, reader => _serializer.Deserialize<TEntity>(new JsonTextReader(reader)));
return await WebSocketStreamAsync(entity, link, parameters, reader => _serializer.Deserialize<TEntity>(new JsonTextReader(reader)), token);
}

public async Task<ObservableStream<string>> StreamTextAsync(ILinked entity, string link, IDictionary<string, object> parameters = null)
public async Task<ObservableStream<string>> StreamTextAsync(ILinked entity, string link, IDictionary<string, object> parameters = null, CancellationToken token = default)
{
return await WebSocketStreamAsync(entity, link, parameters, reader => reader.ReadToEnd());
return await WebSocketStreamAsync(entity, link, parameters, reader => reader.ReadToEnd(), token);
}

async Task<ObservableStream<T>> WebSocketStreamAsync<T>(ILinked entity, string link, IDictionary<string, object> parameters, Func<TextReader, T> deserialize)
async Task<ObservableStream<T>> WebSocketStreamAsync<T>(ILinked entity, string link, IDictionary<string, object> parameters, Func<TextReader, T> deserialize, CancellationToken token = default)
{
var linkUri = ResolveLink(entity, link, parameters);

Expand All @@ -157,35 +157,35 @@ async Task<ObservableStream<T>> WebSocketStreamAsync<T>(ILinked entity, string l
if (_apiKey != null)
socket.Options.SetRequestHeader("X-Seq-ApiKey", _apiKey);

await socket.ConnectAsync(new Uri(linkUri), CancellationToken.None);
await socket.ConnectAsync(new Uri(linkUri), token);

return new ObservableStream<T>(socket, deserialize);
}

async Task<T> HttpGetAsync<T>(string url)
async Task<T> HttpGetAsync<T>(string url, CancellationToken token = default)
{
var request = new HttpRequestMessage(HttpMethod.Get, url);
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
return _serializer.Deserialize<T>(new JsonTextReader(new StreamReader(stream)));
}

async Task<string> HttpGetStringAsync(string url)
async Task<string> HttpGetStringAsync(string url, CancellationToken token = default)
{
var request = new HttpRequestMessage(HttpMethod.Get, url);
var stream = await HttpSendAsync(request).ConfigureAwait(false);
var stream = await HttpSendAsync(request, token).ConfigureAwait(false);
return await new StreamReader(stream).ReadToEndAsync();
}

async Task<Stream> HttpSendAsync(HttpRequestMessage request)
async Task<Stream> HttpSendAsync(HttpRequestMessage request, CancellationToken token = default)
{
if (_apiKey != null)
request.Headers.Add("X-Seq-ApiKey", _apiKey);

request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(SeqApiV6MediaType));

var response = await _httpClient.SendAsync(request).ConfigureAwait(false);
var response = await _httpClient.SendAsync(request, token).ConfigureAwait(false);
var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

if (response.IsSuccessStatusCode)
return stream;

Expand Down
4 changes: 1 addition & 3 deletions src/Seq.Api/Model/Backups/BackupEntity.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace Seq.Api.Model.Backups
namespace Seq.Api.Model.Backups
{
public class BackupEntity : Entity
{
Expand Down
25 changes: 13 additions & 12 deletions src/Seq.Api/ResourceGroups/ApiKeysResourceGroup.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Seq.Api.Model.Inputs;

Expand All @@ -12,36 +13,36 @@ internal ApiKeysResourceGroup(ISeqConnection connection)
{
}

public async Task<ApiKeyEntity> FindAsync(string id)
public async Task<ApiKeyEntity> FindAsync(string id, CancellationToken token = default)
{
if (id == null) throw new ArgumentNullException(nameof(id));
return await GroupGetAsync<ApiKeyEntity>("Item", new Dictionary<string, object> { { "id", id } }).ConfigureAwait(false);
return await GroupGetAsync<ApiKeyEntity>("Item", new Dictionary<string, object> { { "id", id } }, token).ConfigureAwait(false);
}

public async Task<List<ApiKeyEntity>> ListAsync(string ownerId = null)
public async Task<List<ApiKeyEntity>> ListAsync(string ownerId = null, CancellationToken token = default)
{
var parameters = new Dictionary<string, object> { { "ownerId", ownerId } };
return await GroupListAsync<ApiKeyEntity>("Items", parameters).ConfigureAwait(false);
return await GroupListAsync<ApiKeyEntity>("Items", parameters, token).ConfigureAwait(false);
}

public async Task<ApiKeyEntity> TemplateAsync()
public async Task<ApiKeyEntity> TemplateAsync(CancellationToken token = default)
{
return await GroupGetAsync<ApiKeyEntity>("Template").ConfigureAwait(false);
return await GroupGetAsync<ApiKeyEntity>("Template", token: token).ConfigureAwait(false);
}

public async Task<ApiKeyEntity> AddAsync(ApiKeyEntity entity)
public async Task<ApiKeyEntity> AddAsync(ApiKeyEntity entity, CancellationToken token = default)
{
return await GroupCreateAsync<ApiKeyEntity, ApiKeyEntity>(entity).ConfigureAwait(false);
return await GroupCreateAsync<ApiKeyEntity, ApiKeyEntity>(entity, token: token).ConfigureAwait(false);
}

public async Task RemoveAsync(ApiKeyEntity entity)
public async Task RemoveAsync(ApiKeyEntity entity, CancellationToken token = default)
{
await Client.DeleteAsync(entity, "Self", entity).ConfigureAwait(false);
await Client.DeleteAsync(entity, "Self", entity, token: token).ConfigureAwait(false);
}

public async Task UpdateAsync(ApiKeyEntity entity)
public async Task UpdateAsync(ApiKeyEntity entity, CancellationToken token = default)
{
await Client.PutAsync(entity, "Self", entity).ConfigureAwait(false);
await Client.PutAsync(entity, "Self", entity, token: token).ConfigureAwait(false);
}
}
}
Loading