private Task <PrivateApiResponse> SetBidirectionalStreamAndDoRequest( SignedPrivateApiRequest request, Stream bidirectionalStream) { SetRequestStream(bidirectionalStream); SetResponseStream(bidirectionalStream); return(base.DoApiRequest(request)); }
public override async Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request) { var socket = CreateSocketFromCurrentEndPoint(); await socket.ConnectAsync(currentEndpoint.Address, currentEndpoint.Port); using (var networkStream = new NetworkStream(socket, true)) return(await SetBidirectionalStreamAndDoRequest(request, networkStream)); }
private async Task <PrivateApiResponse> ConnectAndDoRequest(IPEndPoint useEndPoint, SignedPrivateApiRequest request) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { NoDelay = true, LingerState = new LingerOption(true, SockerLingerTimeoutInSeconds) }; await socket.ConnectAsync(useEndPoint.Address, useEndPoint.Port); using (var networkStream = new NetworkStream(socket, true)) return(await SetBidirectionalStreamAndDoRequest(request, networkStream)); }
private static void AssertSignatureIsValide(PrivateApiRequest request, SignedPrivateApiRequest signedRequest) { using (var rsa = RSA.Create()) { rsa.ImportParameters(TestData.Credentials.PrivateRsaParameters); string signableString = request.FormatIntoSignableString(TestData.RequestNonce); var signableStringData = Encoding.UTF8.GetBytes(signableString); bool isValidSignature = rsa.VerifyData(signableStringData, signedRequest.Signature, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1); Assert.That(isValidSignature, Is.True); } }
public override async Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request) { // Only one usage of each socket address (protocol/network address/port) is normally permitted // 31.172.83.53:18017 on Fairlay Wallet.Service/SocialBot.Service/Exchange.Service await preventMultipleCallsToSameAddress.WaitAsync(); try { return(await ConnectAndDoRequest(endPoints[0], request)); } catch { try { // Try next one in list and if it works move first broken server to end of the list var result = await ConnectAndDoRequest(endPoints[1], request); var firstNotWorking = endPoints[0]; endPoints.Remove(endPoints[0]); endPoints.Add(firstNotWorking); return(result); } catch { // If that didn't help go to the current end of the list (usually the next as we have 3) // and do the same, move the currently broken first to the end and use the last next time. // If this fails too we are outa here and will crash with the exception thrown here. var result = await ConnectAndDoRequest(endPoints.Last(), request); var lastWorking = endPoints.Last(); endPoints.Remove(lastWorking); endPoints.Insert(0, lastWorking); return(result); } } finally { preventMultipleCallsToSameAddress.Release(); } }
public virtual async Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request) { await requestWriter.WriteRequest(request); return(await responseReader.ReadResponse()); }
public override Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request) { WriteFakeApiResponseToInMemoryResponseStream(); return(base.DoApiRequest(request)); }
public Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request) => null; //ncrunch: no coverage
/// <summary> /// https://github.com/Fairlay/FairlayDotNetClient/wiki/Private-API#fairlay-private-api-documentation-v0 /// </summary> public static string FormatIntoApiRequestMessage(this SignedPrivateApiRequest request) => $"{Convert.ToBase64String(request.Signature)}|{request.Nonce}|{request.UserId}|" + $"{request.Header}|{request.Body}{EndOfDataToken}";