public async Task Invoke(HttpContext context, DiscoveryOptions discoveryOptions, INodeDiscoveryProvider discoveryProvider) { _discoveryProvider = discoveryProvider; var request = context.Request; var pathMatch = discoveryOptions.MatchPath; var isCapRequest = request.Path.StartsWithSegments(new PathString(pathMatch)); if (!isCapRequest) { await _next.Invoke(context); } else { //For performance reasons, we need to put this functionality in the else var isSwitchNode = request.Cookies.TryGetValue(NodeCookieName, out var requestNodeId); var isCurrentNode = discoveryOptions.NodeId.ToString() == requestNodeId; var isNodesPage = request.Path.StartsWithSegments(new PathString(pathMatch + "/nodes")); if (!isSwitchNode || isCurrentNode || isNodesPage) { await _next.Invoke(context); } else { _logger.LogDebug("started calling gateway proxy middleware"); if (TryGetRemoteNode(requestNodeId, out var node)) { try { DownstreamRequest = await _requestMapper.Map(request); SetDownStreamRequestUri(node, request.Path.Value); var response = await _requester.GetResponse(DownstreamRequest); await SetResponseOnHttpContext(context, response); } catch (Exception ex) { _logger.LogError(ex.Message); } } else { context.Response.Cookies.Delete(NodeCookieName); await _next.Invoke(context); } } } }
public ConsulProcessingNodeServer(INodeDiscoveryProvider discoveryProvider) { _discoveryProvider = discoveryProvider; }