Skip to content
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
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ Console.WriteLine("First Device Name: " + myDevices[0].Properties.Name);
var accessCode = seam.AccessCodes.Create(deviceId: myDevices[0].DeviceId, code: "1234");
```

## Advanced Usage

### Setting the request timeout

Requests time out after 30 seconds by default.
Pass the `timeout` option, in milliseconds, to override this:

```csharp
var seam = new SeamClient(apiToken: "YOUR_API_KEY", timeout: 60000);
```

The default may also be changed for every client at once:

```csharp
GlobalSeamRequestConfiguration.Instance.Timeout = 60000;
```

## Development and Testing

### Quickstart
Expand Down
56 changes: 56 additions & 0 deletions output/csharp/src/Seam.Test/Client/TimeoutTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
namespace Seam.Test;

using Seam.Client;

public class TimeoutTests
{
[Fact]
public void DefaultTimeoutIs30Seconds()
{
Assert.Equal(30000, SeamRequestConfiguration.DefaultTimeout);
}

[Fact]
public void NewConfigurationUsesTheDefaultTimeout()
{
var configuration = new SeamRequestConfiguration();

Assert.Equal(SeamRequestConfiguration.DefaultTimeout, configuration.Timeout);
}

[Fact]
public void GlobalConfigurationUsesTheDefaultTimeout()
{
Assert.Equal(
SeamRequestConfiguration.DefaultTimeout,
GlobalSeamRequestConfiguration.Instance.Timeout
);
}

[Fact]
public void ConfigurationTimeoutCanBeOverridden()
{
var configuration = new SeamRequestConfiguration { Timeout = 60000 };

Assert.Equal(60000, configuration.Timeout);
}

[Fact]
public void MergedConfigurationTakesTheTimeoutFromTheSecondConfiguration()
{
var first = new SeamRequestConfiguration { Timeout = 60000 };
var second = new SeamRequestConfiguration { Timeout = 5000 };

var merged = SeamRequestConfiguration.MergeConfigurations(first, second);

Assert.Equal(5000, merged.Timeout);
}

[Fact]
public void ClientAcceptsATimeout()
{
var seam = new SeamClient(apiToken: "seam_apikey_token", timeout: 60000);

Assert.NotNull(seam);
}
}
25 changes: 15 additions & 10 deletions output/csharp/src/Seam/Client/Seam.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ public partial class SeamClient : ISeamClient
{
private readonly string _baseUrl;
private readonly string _apiToken;
private readonly int? _timeout;

/// <summary>
/// Specifies the settings on a <see cref="JsonSerializer" /> object.
Expand Down Expand Up @@ -210,19 +211,22 @@ public partial class SeamClient : ISeamClient
/// <summary>
/// Initializes a new instance of the <see cref="ApiClient" />
/// </summary>
/// <param name="basePath">The target service's base path in URL format.</param>
/// <param name="apiToken">The target service's API Token.</param>
/// <param name="timeout">The request timeout in milliseconds. Defaults to
/// <see cref="SeamRequestConfiguration.DefaultTimeout" />.</param>
/// <exception cref="ArgumentException"></exception>
public SeamClient(string apiToken)
: this(GlobalSeamRequestConfiguration.Instance.BasePath, apiToken) { }
public SeamClient(string apiToken, int? timeout = null)
: this(GlobalSeamRequestConfiguration.Instance.BasePath, apiToken, timeout) { }

/// <summary>
/// Initializes a new instance of the <see cref="ApiClient" />
/// </summary>
/// <param name="basePath">The target service's base path in URL format.</param>
/// <param name="apiToken">The target service's API Token.</param>
/// <param name="timeout">The request timeout in milliseconds. Defaults to
/// <see cref="SeamRequestConfiguration.DefaultTimeout" />.</param>
/// <exception cref="ArgumentException"></exception>
public SeamClient(string basePath, string apiToken)
public SeamClient(string basePath, string apiToken, int? timeout = null)
{
if (string.IsNullOrEmpty(basePath))
throw new ArgumentException("basePath cannot be empty");
Expand All @@ -232,6 +236,7 @@ public SeamClient(string basePath, string apiToken)

_baseUrl = basePath;
_apiToken = apiToken;
_timeout = timeout;
}

/// <summary>
Expand Down Expand Up @@ -503,7 +508,7 @@ IReadableSeamRequestConfiguration configuration
{
ClientCertificates = configuration.ClientCertificates,
CookieContainer = cookies,
MaxTimeout = configuration.Timeout,
MaxTimeout = _timeout ?? configuration.Timeout,
Proxy = configuration.Proxy,
UserAgent = configuration.UserAgent,
// UseDefaultCredentials = configuration.UseDefaultCredentials,
Expand Down Expand Up @@ -633,7 +638,7 @@ private async Task<ApiResponse<T>> ExecAsync<T>(
var clientOptions = new RestClientOptions(baseUrl)
{
ClientCertificates = configuration.ClientCertificates,
MaxTimeout = configuration.Timeout,
MaxTimeout = _timeout ?? configuration.Timeout,
Proxy = configuration.Proxy,
UserAgent = configuration.UserAgent,
ThrowOnAnyError = false,
Expand Down Expand Up @@ -1061,10 +1066,10 @@ public void Dispose() { }
[Obsolete("Please use Seam.Client.SeamClient instead")]
public class Seam : SeamClient
{
public Seam(string apiToken)
: base(apiToken) { }
public Seam(string apiToken, int? timeout = null)
: base(apiToken, timeout) { }

public Seam(string basePath, string apiToken)
: base(basePath, apiToken) { }
public Seam(string basePath, string apiToken, int? timeout = null)
: base(basePath, apiToken, timeout) { }
}
}
11 changes: 9 additions & 2 deletions output/csharp/src/Seam/Client/SeamRequestConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ public class SeamRequestConfiguration : IReadableSeamRequestConfiguration
/// <value>Version of the package.</value>
public const string Version = "1.0.0";

/// <summary>
/// Default HTTP timeout (milliseconds) applied to every request.
/// </summary>
/// <value>Default HTTP timeout (milliseconds).</value>
public const int DefaultTimeout = 30000;

/// <summary>
/// Identifier for ISO 8601 DateTime Format
/// </summary>
Expand Down Expand Up @@ -138,7 +144,7 @@ public SeamRequestConfiguration()
{ };

// Setting Timeout has side effects (forces ApiClient creation).
Timeout = 100000;
Timeout = DefaultTimeout;
}

/// <summary>
Expand Down Expand Up @@ -221,7 +227,8 @@ public virtual IDictionary<string, string> DefaultHeader
public virtual IDictionary<string, string> DefaultHeaders { get; set; }

/// <summary>
/// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds.
/// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Defaults to
/// <see cref="DefaultTimeout" /> milliseconds.
/// </summary>
public virtual int Timeout { get; set; }

Expand Down
17 changes: 17 additions & 0 deletions output/csharp/src/Seam/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,20 @@ Console.WriteLine("First Device Name: " + myDevices[0].Properties.Name);

var accessCode = seam.AccessCodes.Create(deviceId: myDevices[0].DeviceId, code: "1234");
```

## Advanced Usage

### Setting the request timeout

Requests time out after 30 seconds by default.
Pass the `timeout` option, in milliseconds, to override this:

```csharp
var seam = new SeamClient(apiToken: "YOUR_API_KEY", timeout: 60000);
```

The default may also be changed for every client at once:

```csharp
GlobalSeamRequestConfiguration.Instance.Timeout = 60000;
```
Loading