RpcRequestHandler.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using JsonRPC4.Common;
  2. using JsonRPC4.Router.Abstractions;
  3. using JsonRPC4.Router.Utilities;
  4. using Microsoft.Extensions.Logging;
  5. using Microsoft.Extensions.Options;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Threading.Tasks;
  11. namespace JsonRPC4.Router
  12. {
  13. public class RpcRequestHandler : IRpcRequestHandler
  14. {
  15. // Token: 0x17000032 RID: 50
  16. // (get) Token: 0x06000096 RID: 150 RVA: 0x000032A5 File Offset: 0x000014A5
  17. private IOptions<RpcServerConfiguration> serverConfig { get; }
  18. // Token: 0x17000033 RID: 51
  19. // (get) Token: 0x06000097 RID: 151 RVA: 0x000032AD File Offset: 0x000014AD
  20. private IRpcInvoker invoker { get; }
  21. // Token: 0x17000034 RID: 52
  22. // (get) Token: 0x06000098 RID: 152 RVA: 0x000032B5 File Offset: 0x000014B5
  23. private IRpcParser parser { get; }
  24. // Token: 0x17000035 RID: 53
  25. // (get) Token: 0x06000099 RID: 153 RVA: 0x000032BD File Offset: 0x000014BD
  26. private ILogger<RpcRequestHandler> logger { get; }
  27. // Token: 0x17000036 RID: 54
  28. // (get) Token: 0x0600009A RID: 154 RVA: 0x000032C5 File Offset: 0x000014C5
  29. private IRpcResponseSerializer responseSerializer { get; }
  30. // Token: 0x0600009B RID: 155 RVA: 0x000032D0 File Offset: 0x000014D0
  31. public RpcRequestHandler(IOptions<RpcServerConfiguration> serverConfig, IRpcInvoker invoker, IRpcParser parser, IRpcResponseSerializer responseSerializer, ILogger<RpcRequestHandler> logger)
  32. {
  33. if (serverConfig == null)
  34. {
  35. throw new ArgumentNullException("serverConfig");
  36. }
  37. this.serverConfig = serverConfig;
  38. if (invoker == null)
  39. {
  40. throw new ArgumentNullException("invoker");
  41. }
  42. this.invoker = invoker;
  43. if (parser == null)
  44. {
  45. throw new ArgumentNullException("parser");
  46. }
  47. this.parser = parser;
  48. if (responseSerializer == null)
  49. {
  50. throw new ArgumentNullException("responseSerializer");
  51. }
  52. this.responseSerializer = responseSerializer;
  53. this.logger = logger;
  54. }
  55. // Token: 0x0600009C RID: 156 RVA: 0x00003344 File Offset: 0x00001544
  56. public async Task<bool> HandleRequestAsync(RpcPath requestPath, Stream requestBody, IRouteContext routeContext, Stream responseBody)
  57. {
  58. try
  59. {
  60. ParsingResult result = parser.ParseRequests(requestBody);
  61. logger.ProcessingRequests(result.RequestCount);
  62. int? batchRequestLimit = serverConfig.Value.BatchRequestLimit;
  63. new List<RpcResponse>();
  64. List<RpcResponse> list;
  65. if (batchRequestLimit > 0 && result.RequestCount > batchRequestLimit)
  66. {
  67. string text = $"Request count exceeded batch request limit ({batchRequestLimit}).";
  68. list = new List<RpcResponse>
  69. {
  70. new RpcResponse(null, new RpcError(RpcErrorCode.InvalidRequest, text))
  71. };
  72. logger.LogError(text + " Returning error response.");
  73. }
  74. else
  75. {
  76. list = ((!result.Requests.Any()) ? new List<RpcResponse>() : (await invoker.InvokeBatchRequestAsync(result.Requests, routeContext, requestPath)));
  77. foreach (var error in result.Errors)
  78. {
  79. RpcId item = error.Id;
  80. RpcError item2 = error.Error;
  81. if (item == default(RpcId))
  82. {
  83. logger.ResponseFailedWithNoId(item2.Code, item2.Message);
  84. }
  85. else
  86. {
  87. list.Add(new RpcResponse(item, item2));
  88. }
  89. }
  90. }
  91. if (list == null || !list.Any())
  92. {
  93. logger.NoResponses();
  94. return false;
  95. }
  96. logger.Responses(list.Count);
  97. if (!result.IsBulkRequest)
  98. {
  99. await responseSerializer.SerializeAsync(list.Single(), responseBody);
  100. }
  101. else
  102. {
  103. await responseSerializer.SerializeBulkAsync(list, responseBody);
  104. }
  105. }
  106. catch (RpcException ex)
  107. {
  108. logger.LogException(ex, "Error occurred when proccessing Rpc request. Sending Rpc error response");
  109. RpcResponse response = new RpcResponse(null, ex.ToRpcError(serverConfig.Value.ShowServerExceptions));
  110. await responseSerializer.SerializeAsync(response, responseBody);
  111. }
  112. return true;
  113. }
  114. }
  115. }