/// <summary> /// Processes an event when request is received. /// </summary> /// <param name="requestId">Unique Id of the request.</param> /// <param name="relayRequest">Relay request.</param> /// <returns>Task tracking request.</returns> public Task RequestReceivedAsync(string requestId, RelayRequest relayRequest) { lock (this.lockObject) { Console.SetCursorPosition(0, this.requestCount); Console.Write(string.Format( CultureInfo.InvariantCulture, "{0} - {1}", relayRequest.HttpMethod, relayRequest.RequestPathAndQuery)); this.requestConsoleDetailsMap[requestId] = new RequestConsoleDetails { RequestStartTime = DateTime.Now, RequestConsoleTopCursor = this.requestCount, RequestConsoleLeftCursor = Console.CursorLeft, }; this.requestCount += 2; Console.WriteLine(); } return(Task.CompletedTask); }
public async Task <RelayResponse> RelayAsync(Uri relayUrl, RelayRequest request) { using (var client = new HttpClient()) { client.BaseAddress = relayUrl; client.Timeout = TimeSpan.FromMilliseconds(_httpTimeout); var content = JsonConvert.SerializeObject(request); var stringContent = new StringContent(content, Encoding.UTF8, "application/json"); var result = await client.PostAsync("/relay", stringContent); result.EnsureSuccessStatusCode(); string contentResult = await result.Content.ReadAsStringAsync(); return(JsonConvert.DeserializeObject <RelayResponse>(contentResult)); } }
/// <summary> /// Executed when a new request is received. /// </summary> /// <param name="requestId">Unique request Id.</param> /// <param name="relayRequest">Relay request instance.</param> /// <returns>Task tracking operation.</returns> public Task RequestReceivedAsync(string requestId, RelayRequest relayRequest) { this.Dispatcher.Invoke(() => { this.logger.LogTrace("Received request with Id '{0}'", requestId); KeyValuePair <string, RequestDetails> requestItem = new KeyValuePair <string, RequestDetails>(requestId, new RequestDetails { Method = relayRequest.HttpMethod.Method, RequestHeaders = relayRequest.Headers.GetHeaderMap(), RequestData = this.GetUIFriendlyString(relayRequest.InputStream, relayRequest.Headers[HttpRequestHeader.ContentType], relayRequest.Headers[HttpRequestHeader.ContentEncoding]), RequestReceiveTime = relayRequest.RequestStartDateTime.DateTime, Url = relayRequest.RequestPathAndQuery, StatusCode = "Active", }); this.requestMap.Add(requestItem); }); return(Task.CompletedTask); }
private async Task <string> SendViaRelay( string relayUrl, TransactionInput transaction, BigInteger txFee, BigInteger gasPrice, BigInteger gasLimit, BigInteger nonce, string relayHubAddress, string relayAddress, string signature, string approvalData, BigInteger relayMaxNonce) { var requestData = new RelayRequest { EncodedFunction = transaction.Data, Signature = signature.HexToByteArray(), ApprovalData = approvalData.HexToByteArray(), From = transaction.From, To = transaction.To, GasPrice = gasPrice, GasLimit = gasLimit, RelayFee = txFee, RecipientNonce = nonce, RelayMaxNonce = relayMaxNonce, RelayHubAddress = relayHubAddress, UserAgent = _options.UserAgent }; RelayResponse relayResponse = await _relayClient.RelayAsync(new Uri(relayUrl), requestData) .ConfigureAwait(false); if (!string.IsNullOrEmpty(relayResponse.Error)) { throw new Exception(relayResponse.Error); } if (relayResponse.Nonce.Value.IsZero) { throw new Exception("Empty body received from server, or neither 'error' nor 'nonce' fields present."); } ValidateTx( relayResponse, transaction, txFee, gasPrice, gasLimit, nonce, relayHubAddress, relayAddress); var tx = relayResponse.ToTransaction(); string hash = string.Empty; var ethSendTransaction = new EthSendRawTransaction(_client); try { hash = await ethSendTransaction.SendRequestAsync(tx.GetRLPEncoded().ToHex().EnsureHexPrefix()) .ConfigureAwait(false); } catch (Exception ex) { if (!ex.Message.Contains("the tx doesn't have the correct nonce") && !ex.Message.Contains("known transaction") && !ex.Message.Contains("nonce too low")) { throw ex; } } var txHash = relayResponse.Hash; if (!string.IsNullOrEmpty(hash) && relayResponse.Hash.EnsureHexPrefix().ToLower() != hash.EnsureHexPrefix().ToLower()) { txHash = hash; } return(txHash); }