mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-09-04 22:51:36 +00:00
Compare commits
No commits in common. "d0284c62c0c70776ecb88349ac7f5b49bffe96cc" and "6156fb8154755a863f23a49c1dec918c3e4a7dfa" have entirely different histories.
d0284c62c0
...
6156fb8154
@ -470,8 +470,10 @@ namespace CryptoExchange.Net.Clients
|
|||||||
error = ParseErrorResponse((int)response.StatusCode, response.ResponseHeaders, accessor, readResult.Error?.Exception);
|
error = ParseErrorResponse((int)response.StatusCode, response.ResponseHeaders, accessor, readResult.Error?.Exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma warning disable CS0618 // Type or member is obsolete
|
||||||
if (error.Code == null || error.Code == 0)
|
if (error.Code == null || error.Code == 0)
|
||||||
error.Code = (int)response.StatusCode;
|
error.Code = (int)response.StatusCode;
|
||||||
|
#pragma warning restore CS0618 // Type or member is obsolete
|
||||||
|
|
||||||
return new WebCallResult<T>(response.StatusCode, response.ResponseHeaders, sw.Elapsed, responseLength, OutputOriginalData ? accessor.GetOriginalString() : null, request.RequestId, request.Uri.ToString(), request.Content, request.Method, request.GetHeaders(), ResultDataSource.Server, default, error!);
|
return new WebCallResult<T>(response.StatusCode, response.ResponseHeaders, sw.Elapsed, responseLength, OutputOriginalData ? accessor.GetOriginalString() : null, request.RequestId, request.Uri.ToString(), request.Content, request.Method, request.GetHeaders(), ResultDataSource.Server, default, error!);
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ namespace CryptoExchange.Net.Clients
|
|||||||
}
|
}
|
||||||
|
|
||||||
var waitEvent = new AsyncResetEvent(false);
|
var waitEvent = new AsyncResetEvent(false);
|
||||||
var subQuery = subscription.CreateSubscriptionQuery(socketConnection);
|
var subQuery = subscription.GetSubQuery(socketConnection);
|
||||||
if (subQuery != null)
|
if (subQuery != null)
|
||||||
{
|
{
|
||||||
// Send the request and wait for answer
|
// Send the request and wait for answer
|
||||||
|
@ -251,20 +251,4 @@ namespace CryptoExchange.Net.Objects
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
DEX
|
DEX
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Timeout behavior for queries
|
|
||||||
/// </summary>
|
|
||||||
public enum TimeoutBehavior
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Fail the request
|
|
||||||
/// </summary>
|
|
||||||
Fail,
|
|
||||||
/// <summary>
|
|
||||||
/// Mark the query as successful
|
|
||||||
/// </summary>
|
|
||||||
Succeed
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,11 +11,9 @@ namespace CryptoExchange.Net.Objects
|
|||||||
|
|
||||||
private int? _code;
|
private int? _code;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The int error code the server returned; or the http status code int value if there was no error code.<br />
|
/// The error code from the server
|
||||||
/// <br />
|
|
||||||
/// <i>Note:</i><br />
|
|
||||||
/// The <see cref="ErrorCode"/> property should be used for more generic error checking; it might contain a string error code if the server does not return an int code.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Use ErrorCode instead", false)]
|
||||||
public int? Code
|
public int? Code
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using CryptoExchange.Net.Interfaces;
|
using CryptoExchange.Net.Interfaces;
|
||||||
using CryptoExchange.Net.Logging.Extensions;
|
using CryptoExchange.Net.Logging.Extensions;
|
||||||
using CryptoExchange.Net.Objects;
|
using CryptoExchange.Net.Objects;
|
||||||
using CryptoExchange.Net.Objects.Errors;
|
|
||||||
using CryptoExchange.Net.Objects.Sockets;
|
using CryptoExchange.Net.Objects.Sockets;
|
||||||
using CryptoExchange.Net.RateLimiting;
|
using CryptoExchange.Net.RateLimiting;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
@ -253,11 +252,6 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
await (OnConnectRateLimited?.Invoke() ?? Task.CompletedTask).ConfigureAwait(false);
|
await (OnConnectRateLimited?.Invoke() ?? Task.CompletedTask).ConfigureAwait(false);
|
||||||
return new CallResult(new ServerRateLimitError(we.Message, we));
|
return new CallResult(new ServerRateLimitError(we.Message, we));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_socket.HttpStatusCode == HttpStatusCode.Unauthorized)
|
|
||||||
{
|
|
||||||
return new CallResult(new ServerError(new ErrorInfo(ErrorType.Unauthorized, "Server returned status code `401` when `101` was expected")));
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
// ClientWebSocket.HttpStatusCode is only available in .NET6+ https://learn.microsoft.com/en-us/dotnet/api/system.net.websockets.clientwebsocket.httpstatuscode?view=net-8.0
|
// ClientWebSocket.HttpStatusCode is only available in .NET6+ https://learn.microsoft.com/en-us/dotnet/api/system.net.websockets.clientwebsocket.httpstatuscode?view=net-8.0
|
||||||
// Try to read 429 from the message instead
|
// Try to read 429 from the message instead
|
||||||
|
@ -29,11 +29,6 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public TimeSpan? RequestTimeout { get; set; }
|
public TimeSpan? RequestTimeout { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// What should happen if the query times out
|
|
||||||
/// </summary>
|
|
||||||
public TimeoutBehavior TimeoutBehavior { get; set; } = TimeoutBehavior.Fail;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The number of required responses. Can be more than 1 when for example subscribing multiple symbols streams in a single request,
|
/// The number of required responses. Can be more than 1 when for example subscribing multiple symbols streams in a single request,
|
||||||
/// and each symbol receives it's own confirmation response
|
/// and each symbol receives it's own confirmation response
|
||||||
@ -188,7 +183,7 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override async Task<CallResult> Handle(SocketConnection connection, DataEvent<object> message, MessageHandlerLink check)
|
public override async Task<CallResult> Handle(SocketConnection connection, DataEvent<object> message, MessageHandlerLink check)
|
||||||
{
|
{
|
||||||
if (!PreCheckMessage(connection, message))
|
if (!PreCheckMessage(message))
|
||||||
return CallResult.SuccessResult;
|
return CallResult.SuccessResult;
|
||||||
|
|
||||||
CurrentResponses++;
|
CurrentResponses++;
|
||||||
@ -213,20 +208,18 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Validate if a message is actually processable by this query
|
/// Validate if a message is actually processable by this query
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual bool PreCheckMessage(SocketConnection connection, DataEvent<object> message) => true;
|
/// <param name="message"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual bool PreCheckMessage(DataEvent<object> message) => true;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Timeout()
|
public override void Timeout()
|
||||||
{
|
{
|
||||||
if (Completed)
|
if (Completed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Completed = true;
|
|
||||||
if (TimeoutBehavior == TimeoutBehavior.Fail)
|
|
||||||
Result = new CallResult<THandlerResponse>(new TimeoutError());
|
|
||||||
else
|
|
||||||
Result = new CallResult<THandlerResponse>(default, null, default);
|
|
||||||
|
|
||||||
|
Completed = true;
|
||||||
|
Result = new CallResult<THandlerResponse>(new TimeoutError());
|
||||||
ContinueAwaiter?.Set();
|
ContinueAwaiter?.Set();
|
||||||
_event.Set();
|
_event.Set();
|
||||||
}
|
}
|
||||||
|
@ -202,18 +202,6 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The number of current pending requests
|
|
||||||
/// </summary>
|
|
||||||
public int PendingRequests
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
lock (_listenersLock)
|
|
||||||
return _listeners.OfType<Query>().Where(x => !x.Completed).Count();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool _pausedActivity;
|
private bool _pausedActivity;
|
||||||
private readonly object _listenersLock;
|
private readonly object _listenersLock;
|
||||||
private readonly List<IMessageProcessor> _listeners;
|
private readonly List<IMessageProcessor> _listeners;
|
||||||
@ -531,10 +519,7 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
{
|
{
|
||||||
// If this message is for this listener then it is automatically confirmed, even if the subscription is not (yet) confirmed
|
// If this message is for this listener then it is automatically confirmed, even if the subscription is not (yet) confirmed
|
||||||
subscriptionProcessor.Confirmed = true;
|
subscriptionProcessor.Confirmed = true;
|
||||||
if (subscriptionProcessor.SubscriptionQuery?.TimeoutBehavior == TimeoutBehavior.Succeed)
|
// This doesn't trigger a waiting subscribe query, should probably also somehow set the wait event for that
|
||||||
// If this subscription has a query waiting for a timeout (success if there is no error response)
|
|
||||||
// then time it out now as the data is being received, so we assume it's successful
|
|
||||||
subscriptionProcessor.SubscriptionQuery.Timeout();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. Deserialize the message
|
// 5. Deserialize the message
|
||||||
@ -1011,7 +996,7 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
var subQuery = subscription.CreateSubscriptionQuery(this);
|
var subQuery = subscription.GetSubQuery(this);
|
||||||
if (subQuery == null)
|
if (subQuery == null)
|
||||||
{
|
{
|
||||||
subscription.IsResubscribing = false;
|
subscription.IsResubscribing = false;
|
||||||
@ -1046,7 +1031,7 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
|
|
||||||
internal async Task UnsubscribeAsync(Subscription subscription)
|
internal async Task UnsubscribeAsync(Subscription subscription)
|
||||||
{
|
{
|
||||||
var unsubscribeRequest = subscription.CreateUnsubscriptionQuery(this);
|
var unsubscribeRequest = subscription.GetUnsubQuery();
|
||||||
if (unsubscribeRequest == null)
|
if (unsubscribeRequest == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1059,7 +1044,7 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
if (!_socket.IsOpen)
|
if (!_socket.IsOpen)
|
||||||
return new CallResult(new WebError("Socket is not connected"));
|
return new CallResult(new WebError("Socket is not connected"));
|
||||||
|
|
||||||
var subQuery = subscription.CreateSubscriptionQuery(this);
|
var subQuery = subscription.GetSubQuery(this);
|
||||||
if (subQuery == null)
|
if (subQuery == null)
|
||||||
return CallResult.SuccessResult;
|
return CallResult.SuccessResult;
|
||||||
|
|
||||||
|
@ -80,16 +80,6 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string? Topic { get; set; }
|
public string? Topic { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The subscribe query for this subscription
|
|
||||||
/// </summary>
|
|
||||||
public Query? SubscriptionQuery { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The unsubscribe query for this subscription
|
|
||||||
/// </summary>
|
|
||||||
public Query? UnsubscriptionQuery { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ctor
|
/// ctor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -101,21 +91,11 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
Id = ExchangeHelpers.NextId();
|
Id = ExchangeHelpers.NextId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a new subscription query
|
|
||||||
/// </summary>
|
|
||||||
public Query? CreateSubscriptionQuery(SocketConnection connection)
|
|
||||||
{
|
|
||||||
var query = GetSubQuery(connection);
|
|
||||||
SubscriptionQuery = query;
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get the subscribe query to send when subscribing
|
/// Get the subscribe query to send when subscribing
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
protected abstract Query? GetSubQuery(SocketConnection connection);
|
public abstract Query? GetSubQuery(SocketConnection connection);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handle a subscription query response
|
/// Handle a subscription query response
|
||||||
@ -129,21 +109,11 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
/// <param name="message"></param>
|
/// <param name="message"></param>
|
||||||
public virtual void HandleUnsubQueryResponse(object message) { }
|
public virtual void HandleUnsubQueryResponse(object message) { }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a new unsubscription query
|
|
||||||
/// </summary>
|
|
||||||
public Query? CreateUnsubscriptionQuery(SocketConnection connection)
|
|
||||||
{
|
|
||||||
var query = GetUnsubQuery(connection);
|
|
||||||
UnsubscriptionQuery = query;
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get the unsubscribe query to send when unsubscribing
|
/// Get the unsubscribe query to send when unsubscribing
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
protected abstract Query? GetUnsubQuery(SocketConnection connection);
|
public abstract Query? GetUnsubQuery();
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual CallResult<object> Deserialize(IMessageAccessor message, Type type) => message.Deserialize(type);
|
public virtual CallResult<object> Deserialize(IMessageAccessor message, Type type) => message.Deserialize(type);
|
||||||
|
@ -22,9 +22,9 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override Query? GetSubQuery(SocketConnection connection) => null;
|
public override Query? GetSubQuery(SocketConnection connection) => null;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override Query? GetUnsubQuery(SocketConnection connection) => null;
|
public override Query? GetUnsubQuery() => null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user