Skip to content

Commit 5cb44fc

Browse files
authored
Allow multiple meta headers (#103)
1 parent fad5615 commit 5cb44fc

File tree

6 files changed

+78
-32
lines changed

6 files changed

+78
-32
lines changed

src/Elastic.Transport/Components/TransportClient/HttpTransportClient.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,13 @@ private static HttpRequestMessage CreateRequestMessage(RequestData requestData)
380380

381381
if (requestData.MetaHeaderProvider is not null)
382382
{
383-
var value = requestData.MetaHeaderProvider.ProduceHeaderValue(requestData);
383+
foreach (var producer in requestData.MetaHeaderProvider.Producers)
384+
{
385+
var value = producer.ProduceHeaderValue(requestData);
384386

385-
if (!string.IsNullOrEmpty(value))
386-
requestMessage.Headers.TryAddWithoutValidation(requestData.MetaHeaderProvider.HeaderName, value);
387+
if (!string.IsNullOrEmpty(value))
388+
requestMessage.Headers.TryAddWithoutValidation(producer.HeaderName, value);
389+
}
387390
}
388391

389392
return requestMessage;

src/Elastic.Transport/Components/TransportClient/HttpWebRequestTransportClient.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,12 +325,15 @@ private static HttpWebRequest CreateWebRequest(RequestData requestData)
325325
if (requestData.Headers != null && requestData.Headers.HasKeys())
326326
request.Headers.Add(requestData.Headers);
327327

328-
if (requestData.MetaHeaderProvider is object)
328+
if (requestData.MetaHeaderProvider is not null)
329329
{
330-
var value = requestData.MetaHeaderProvider.ProduceHeaderValue(requestData);
330+
foreach (var producer in requestData.MetaHeaderProvider.Producers)
331+
{
332+
var value = producer.ProduceHeaderValue(requestData);
331333

332-
if (!string.IsNullOrEmpty(value))
333-
request.Headers.Add(requestData.MetaHeaderProvider.HeaderName, requestData.MetaHeaderProvider.ProduceHeaderValue(requestData));
334+
if (!string.IsNullOrEmpty(value))
335+
request.Headers.Add(producer.HeaderName, value);
336+
}
334337
}
335338

336339
var timeout = (int)requestData.RequestTimeout.TotalMilliseconds;

src/Elastic.Transport/Requests/MetaData/DefaultMetaHeaderProvider.cs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,64 @@
77
namespace Elastic.Transport;
88

99
/// <summary>
10-
///
10+
///
1111
/// </summary>
1212
public sealed class DefaultMetaHeaderProvider : MetaHeaderProvider
13+
{
14+
private readonly MetaHeaderProducer[] _producers;
15+
16+
/// <inheritdoc cref="MetaHeaderProvider.Producers"/>
17+
public override MetaHeaderProducer[] Producers => _producers;
18+
19+
/// <summary>
20+
///
21+
/// </summary>
22+
public DefaultMetaHeaderProvider(Type clientType, string serviceIdentifier) =>
23+
_producers = new MetaHeaderProducer[] { new DefaultMetaHeaderProducer(clientType, serviceIdentifier) };
24+
25+
/// <summary>
26+
///
27+
/// </summary>
28+
public DefaultMetaHeaderProvider(VersionInfo versionInfo, string serviceIdentifier) =>
29+
_producers = new MetaHeaderProducer[] { new DefaultMetaHeaderProducer(versionInfo, serviceIdentifier) };
30+
}
31+
32+
/// <summary>
33+
///
34+
/// </summary>
35+
public sealed class DefaultMetaHeaderProducer : MetaHeaderProducer
1336
{
1437
private const string MetaHeaderName = "x-elastic-client-meta";
1538

1639
private readonly MetaDataHeader _asyncMetaDataHeader;
1740
private readonly MetaDataHeader _syncMetaDataHeader;
1841

1942
/// <summary>
20-
///
43+
///
2144
/// </summary>
22-
public DefaultMetaHeaderProvider(Type clientType, string serviceIdentifier)
45+
public DefaultMetaHeaderProducer(Type clientType, string serviceIdentifier)
2346
{
2447
var clientVersionInfo = ReflectionVersionInfo.Create(clientType);
2548
_asyncMetaDataHeader = new MetaDataHeader(clientVersionInfo, serviceIdentifier, true);
2649
_syncMetaDataHeader = new MetaDataHeader(clientVersionInfo, serviceIdentifier, false);
2750
}
2851

2952
/// <summary>
30-
///
53+
///
3154
/// </summary>
32-
internal DefaultMetaHeaderProvider(ReflectionVersionInfo reflectionVersionInfo, string serviceIdentifier)
55+
public DefaultMetaHeaderProducer(VersionInfo versionInfo, string serviceIdentifier)
3356
{
34-
_asyncMetaDataHeader = new MetaDataHeader(reflectionVersionInfo, serviceIdentifier, true);
35-
_syncMetaDataHeader = new MetaDataHeader(reflectionVersionInfo, serviceIdentifier, false);
57+
_asyncMetaDataHeader = new MetaDataHeader(versionInfo, serviceIdentifier, true);
58+
_syncMetaDataHeader = new MetaDataHeader(versionInfo, serviceIdentifier, false);
3659
}
3760

3861
/// <summary>
39-
///
62+
///
4063
/// </summary>
4164
public override string HeaderName => MetaHeaderName;
4265

4366
/// <summary>
44-
///
67+
///
4568
/// </summary>
4669
/// <param name="requestData"></param>
4770
/// <returns></returns>

src/Elastic.Transport/Requests/MetaData/MetaHeaderProvider.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,28 @@
55
namespace Elastic.Transport;
66

77
/// <summary>
8-
/// Injects a metadata header into all outgoing requests
8+
/// Injects metadata headers into all outgoing requests.
99
/// </summary>
1010
public abstract class MetaHeaderProvider
1111
{
12-
/// <summary>Header name </summary>
12+
/// <summary>
13+
/// The list of all <see cref="MetaHeaderProducer"/>s for the provider.
14+
/// </summary>
15+
public abstract MetaHeaderProducer[] Producers { get; }
16+
}
17+
18+
/// <summary>
19+
/// Injects a metadata headers into all outgoing requests.
20+
/// </summary>
21+
public abstract class MetaHeaderProducer
22+
{
23+
/// <summary>
24+
/// The header name.
25+
/// </summary>
1326
public abstract string HeaderName { get; }
1427

15-
/// <summary> Produces the header value based on current outgoing <paramref name="requestData"/> </summary>
28+
/// <summary>
29+
/// Produces the header value based on current outgoing <paramref name="requestData"/>.
30+
/// </summary>
1631
public abstract string ProduceHeaderValue(RequestData requestData);
1732
}

src/Elastic.Transport/Requests/MetaData/ReflectionVersionInfo.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111

1212
namespace Elastic.Transport;
1313

14-
internal sealed class ReflectionVersionInfo : VersionInfo
14+
/// <summary>
15+
///
16+
/// </summary>
17+
public sealed class ReflectionVersionInfo : VersionInfo
1518
{
1619
private static readonly SemVersion Empty = new(0, 0, 0);
1720

@@ -20,13 +23,23 @@ private ReflectionVersionInfo(SemVersion version) :
2023
{
2124
}
2225

26+
/// <summary>
27+
///
28+
/// </summary>
29+
/// <typeparam name="T"></typeparam>
30+
/// <returns></returns>
2331
public static ReflectionVersionInfo Create<T>()
2432
{
2533
var version = DetermineVersionFromType(typeof(T));
2634
var versionInfo = new ReflectionVersionInfo(version);
2735
return versionInfo;
2836
}
2937

38+
/// <summary>
39+
///
40+
/// </summary>
41+
/// <param name="type"></param>
42+
/// <returns></returns>
3043
public static ReflectionVersionInfo Create(Type type)
3144
{
3245
var version = DetermineVersionFromType(type);

src/Elastic.Transport/Requests/MetaData/VersionInfo.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,7 @@ protected VersionInfo(int major, int minor, int patch, string? prerelease, strin
6363
public override string ToString()
6464
{
6565
var prefix = $"{Major}.{Minor}.{Patch}";
66-
var meta = string.Empty;
6766

68-
if (!string.IsNullOrEmpty(Metadata))
69-
{
70-
meta = $"+{Metadata}";
71-
if (meta.EndsWith("p"))
72-
{
73-
// Make sure release versions are not accidentally marked as prerelease version
74-
meta += "r";
75-
}
76-
}
77-
78-
return IsPrerelease ? $"{prefix}{meta}p" : $"{prefix}{meta}";
67+
return IsPrerelease ? $"{prefix}p" : $"{prefix}";
7968
}
8069
}

0 commit comments

Comments
 (0)