Fix request id middleware

This commit is contained in:
Philip Wood 2017-04-18 11:05:37 +01:00
parent da922c0e04
commit 8b93f44077
2 changed files with 26 additions and 20 deletions

View File

@ -72,7 +72,7 @@ namespace Ocelot.Middleware
builder.UseRateLimiting(); builder.UseRateLimiting();
// Now we can look for the requestId // 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. // Allow pre authentication logic. The idea being people might want to run something custom before what is built in.
builder.UseIfNotNull(middlewareConfiguration.PreAuthenticationMiddleware); builder.UseIfNotNull(middlewareConfiguration.PreAuthenticationMiddleware);

View File

@ -41,34 +41,40 @@ namespace Ocelot.RequestId.Middleware
private void SetOcelotRequestId(HttpContext context) 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(); AddRequestIdHeader(requestId, DownstreamRequest);
var downstreamRequestHeaders = DownstreamRequest.Headers; }
}
if (!string.IsNullOrEmpty(requestId) && private bool ShouldAddRequestId(RequestId requestId, HttpRequestHeaders headers)
!HeaderExists(key, downstreamRequestHeaders))
{ {
downstreamRequestHeaders.Add(key, requestId); return !string.IsNullOrEmpty(requestId?.RequestIdKey)
&& !string.IsNullOrEmpty(requestId.RequestIdValue)
&& !RequestIdInHeaders(requestId, headers);
} }
context.TraceIdentifier = requestId; private bool RequestIdInHeaders(RequestId requestId, HttpRequestHeaders headers)
}
}
private bool HeaderExists(string headerKey, HttpRequestHeaders headers)
{ {
IEnumerable<string> value; 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);
} }
} }
} }