mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-23 00:52:51 +08:00
Fix request id middleware
This commit is contained in:
parent
da922c0e04
commit
8b93f44077
@ -72,7 +72,7 @@ namespace Ocelot.Middleware
|
||||
builder.UseRateLimiting();
|
||||
|
||||
// Now we can look for the requestId
|
||||
builder.UseRequestIdMiddleware(); //obsolete?
|
||||
builder.UseRequestIdMiddleware();
|
||||
|
||||
// Allow pre authentication logic. The idea being people might want to run something custom before what is built in.
|
||||
builder.UseIfNotNull(middlewareConfiguration.PreAuthenticationMiddleware);
|
||||
|
@ -41,34 +41,40 @@ namespace Ocelot.RequestId.Middleware
|
||||
|
||||
private void SetOcelotRequestId(HttpContext context)
|
||||
{
|
||||
var key = DefaultRequestIdKey.Value;
|
||||
// if get request ID is set on upstream request then retrieve it
|
||||
var key = DownstreamRoute.ReRoute.RequestIdKey ?? DefaultRequestIdKey.Value;
|
||||
|
||||
if (DownstreamRoute.ReRoute.RequestIdKey != null)
|
||||
StringValues upstreamRequestIds;
|
||||
if (context.Request.Headers.TryGetValue(key, out upstreamRequestIds))
|
||||
{
|
||||
key = DownstreamRoute.ReRoute.RequestIdKey;
|
||||
context.TraceIdentifier = upstreamRequestIds.First();
|
||||
}
|
||||
|
||||
StringValues requestIds;
|
||||
// set request ID on downstream request, if required
|
||||
var requestId = new RequestId(DownstreamRoute?.ReRoute?.RequestIdKey, context.TraceIdentifier);
|
||||
|
||||
if (context.Request.Headers.TryGetValue(key, out requestIds))
|
||||
if (ShouldAddRequestId(requestId, DownstreamRequest.Headers))
|
||||
{
|
||||
var requestId = requestIds.First();
|
||||
var downstreamRequestHeaders = DownstreamRequest.Headers;
|
||||
AddRequestIdHeader(requestId, DownstreamRequest);
|
||||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(requestId) &&
|
||||
!HeaderExists(key, downstreamRequestHeaders))
|
||||
private bool ShouldAddRequestId(RequestId requestId, HttpRequestHeaders headers)
|
||||
{
|
||||
downstreamRequestHeaders.Add(key, requestId);
|
||||
return !string.IsNullOrEmpty(requestId?.RequestIdKey)
|
||||
&& !string.IsNullOrEmpty(requestId.RequestIdValue)
|
||||
&& !RequestIdInHeaders(requestId, headers);
|
||||
}
|
||||
|
||||
context.TraceIdentifier = requestId;
|
||||
}
|
||||
}
|
||||
|
||||
private bool HeaderExists(string headerKey, HttpRequestHeaders headers)
|
||||
private bool RequestIdInHeaders(RequestId requestId, HttpRequestHeaders headers)
|
||||
{
|
||||
IEnumerable<string> value;
|
||||
return headers.TryGetValues(headerKey, out value);
|
||||
return headers.TryGetValues(requestId.RequestIdKey, out value);
|
||||
}
|
||||
|
||||
private void AddRequestIdHeader(RequestId requestId, HttpRequestMessage httpRequestMessage)
|
||||
{
|
||||
httpRequestMessage.Headers.Add(requestId.RequestIdKey, requestId.RequestIdValue);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user