-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHeaderPropagation.cs
More file actions
84 lines (75 loc) · 3.06 KB
/
HeaderPropagation.cs
File metadata and controls
84 lines (75 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//
// Use the code in this file to propagate specific headers from an existing
// ASP .NET HttpRequest object into an outgoing HttpRequestMessage object.
//
// Example usage from inside an ASP .NET controller:
//
// using (var client = new HeaderPropagatingHttpClient(this.Request))
// {
// var response = await client.GetAsync("http://backend");
// }
//
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading;
using Microsoft.AspNetCore.Http;
namespace mywebapi
{
public class HeaderPropagatingHttpClient : HttpClient
{
public HeaderPropagatingHttpClient(HttpRequest source)
: this(source, null)
{
}
public HeaderPropagatingHttpClient(HttpRequest source, HttpMessageHandler innerHandler)
: this(source, null, innerHandler)
{
}
public HeaderPropagatingHttpClient(HttpRequest source, string metaHeaderName, HttpMessageHandler innerHandler)
: base(new HeaderPropagatingHttpHandler(source, metaHeaderName, innerHandler))
{
}
}
public class HeaderPropagatingHttpHandler : MessageProcessingHandler
{
public HeaderPropagatingHttpHandler(HttpRequest source, string metaHeaderName = null, HttpMessageHandler innerHandler = null)
: base(innerHandler ?? new HttpClientHandler())
{
this.Source = source ?? throw new ArgumentNullException(nameof(source));
this.MetaHeaderName = metaHeaderName ?? "Context-Headers";
}
public HttpRequest Source { get; private set; }
public string MetaHeaderName { get; set; }
protected override HttpRequestMessage ProcessRequest(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (this.Source.Headers.ContainsKey(this.MetaHeaderName))
{
request.Headers.Add(this.MetaHeaderName, this.Source.Headers[this.MetaHeaderName] as IEnumerable<string>);
foreach (var header in this.Source.Headers[this.MetaHeaderName])
{
if (header[header.Length - 1] == '*')
{
var prefix = header.Substring(0, header.Length - 1);
foreach (var candidate in this.Source.Headers.Keys)
{
if (candidate.IndexOf(prefix) == 0)
{
request.Headers.Add(candidate, this.Source.Headers[candidate] as IEnumerable<string>);
}
}
}
else if (this.Source.Headers.ContainsKey(header))
{
request.Headers.Add(header, this.Source.Headers[header] as IEnumerable<string>);
}
}
}
return request;
}
protected override HttpResponseMessage ProcessResponse(HttpResponseMessage response, CancellationToken cancellationToken)
{
return response;
}
}
}