static void PrepareRequestHeaders(ICommunicationContext context, HttpRequestMessage request, bool convertLegacyHeaders) { StringBuilder legacyForward = null; void appendParameter(string key, string value) { if (legacyForward == null) { legacyForward = new StringBuilder(); } if (legacyForward.Length > 0) { legacyForward.Append(";"); } legacyForward.Append(key).Append("=").Append(value); } var orRequest = context.Request; foreach (var headerKey in orRequest.Headers.Keys) { if (convertLegacyHeaders) { if (headerKey.Equals("X-Forwarded-Host", StringComparison.OrdinalIgnoreCase)) { appendParameter("host", orRequest.Headers[headerKey]); continue; } if (headerKey.Equals("X-Forwarded-For", StringComparison.OrdinalIgnoreCase)) { appendParameter("for", orRequest.Headers[headerKey]); continue; } if (headerKey.Equals("X-Forwarded-Proto", StringComparison.OrdinalIgnoreCase)) { appendParameter("proto", orRequest.Headers[headerKey]); continue; } if (headerKey.Equals("X-Forwarded-Base", StringComparison.OrdinalIgnoreCase)) { var baseHeaderValue = orRequest.Headers[headerKey]; var baseVal = $"\"{(baseHeaderValue[0] != '/' ? "/" + baseHeaderValue : baseHeaderValue)}\""; appendParameter("base", baseVal); continue; } } if (headerKey.Equals("host", StringComparison.OrdinalIgnoreCase)) { continue; } if (HttpHeaderClassification.IsMicrosoftHttpContentHeader(headerKey)) { if (request.Content == null) { continue; } request.Content.Headers.Add(headerKey, orRequest.Headers.GetValues(headerKey)); } else if (!HttpHeaderClassification.IsHopByHopHeader(headerKey)) { request.Headers.Add(headerKey, orRequest.Headers.GetValues(headerKey)); } } if (convertLegacyHeaders && legacyForward?.Length > 0) { request.Headers.Add("forwarded", legacyForward.ToString()); } request.Headers.Add("forwarded", CurrentForwarded(context)); }
static void PrepareRequestHeaders(ICommunicationContext context, HttpRequestMessage request, bool convertLegacyHeaders) { StringBuilder legacyForward = null; void appendParameter(string key, string value) { if (legacyForward == null) { legacyForward = new StringBuilder(); } if (legacyForward.Length > 0) { legacyForward.Append(";"); } legacyForward.Append(key).Append("=").Append(value); } foreach (var header in context.Request.Headers) { if (convertLegacyHeaders) { if (header.Key.Equals("X-Forwarded-Host", StringComparison.OrdinalIgnoreCase)) { appendParameter("host", header.Value); continue; } if (header.Key.Equals("X-Forwarded-For", StringComparison.OrdinalIgnoreCase)) { appendParameter("for", header.Value); continue; } if (header.Key.Equals("X-Forwarded-Proto", StringComparison.OrdinalIgnoreCase)) { appendParameter("proto", header.Value); continue; } } if (header.Key.Equals("host", StringComparison.OrdinalIgnoreCase)) { continue; } if (HttpHeaderClassification.IsMicrosoftHttpContentHeader(header.Key)) { if (request.Content == null) { continue; } request.Content.Headers.Add(header.Key, header.Value); } else if (!HttpHeaderClassification.IsHopByHopHeader(header.Key)) { request.Headers.Add(header.Key, header.Value); } } if (convertLegacyHeaders && legacyForward?.Length > 0) { request.Headers.Add("forwarded", legacyForward.ToString()); } request.Headers.Add("forwarded", CurrentForwarded(context)); }