Skip to content

Commit b9d558a

Browse files
committed
feat: set user agent to gtr mod version
1 parent fbe2517 commit b9d558a

4 files changed

Lines changed: 107 additions & 6 deletions

File tree

Connectivity/NetworkUserAgent.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using System.Net.Http;
3+
4+
namespace TNRD.Zeepkist.GTR.Connectivity;
5+
6+
internal sealed class NetworkUserAgent
7+
{
8+
public const string HeaderName = "User-Agent";
9+
10+
public string Value { get; }
11+
12+
public NetworkUserAgent(string gtrVersion, string zeepSdkVersion)
13+
{
14+
if (string.IsNullOrWhiteSpace(gtrVersion))
15+
throw new ArgumentException("GTR version is required.", nameof(gtrVersion));
16+
if (string.IsNullOrWhiteSpace(zeepSdkVersion))
17+
throw new ArgumentException("ZeepSDK version is required.", nameof(zeepSdkVersion));
18+
19+
Value = $"ZeepkistGTR/{gtrVersion} (ZeepSDK {zeepSdkVersion})";
20+
}
21+
22+
public void Apply(HttpClient client)
23+
{
24+
if (client == null)
25+
throw new ArgumentNullException(nameof(client));
26+
27+
client.DefaultRequestHeaders.UserAgent.Clear();
28+
client.DefaultRequestHeaders.UserAgent.ParseAdd(Value);
29+
}
30+
31+
public void Apply(Action<string, string> setHeader)
32+
{
33+
if (setHeader == null)
34+
throw new ArgumentNullException(nameof(setHeader));
35+
36+
setHeader(HeaderName, Value);
37+
}
38+
}

Plugin.cs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Net.WebSockets;
55
using System.Threading;
66
using BepInEx;
7+
using BepInEx.Bootstrap;
78
using Microsoft.Extensions.DependencyInjection;
89
using Microsoft.Extensions.Hosting;
910
using Serilog;
@@ -83,6 +84,9 @@ private void ConfigureServices(IServiceCollection services)
8384
services.AddSingleton(Config);
8485
services.AddSingleton(Logger);
8586
services.AddSingleton(Info);
87+
services.AddSingleton(new NetworkUserAgent(
88+
MyPluginInfo.PLUGIN_VERSION,
89+
Chainloader.PluginInfos["ZeepSDK"].Metadata.Version.ToString()));
8690
services.AddSingleton<IHostLifetime, NoopHostLifetime>();
8791
services.AddMemoryCache();
8892
services.AddEagerService<SpainRoutingService>();
@@ -153,17 +157,22 @@ private void ConfigureServices(IServiceCollection services)
153157
services.AddTransient<V7Reader>();
154158
services.AddSingleton<ApiHttpClient>();
155159
services.AddHttpClient();
156-
services.AddHttpClient(SpainRoutingService.TraceClientKey, client =>
160+
services.AddHttpClient(SpainRoutingService.TraceClientKey, (provider, client) =>
157161
{
162+
provider.GetRequiredService<NetworkUserAgent>().Apply(client);
158163
client.BaseAddress = CloudflareTraceRequest.BaseAddress;
159164
client.Timeout = CloudflareTraceRequest.Timeout;
160165
});
161-
services.AddHttpClient(AlternativeDomainFallbackHandler.TransportClientKey, client =>
162-
{
163-
client.Timeout = AlternativeDomainFallbackHandler.RequestTimeout;
164-
});
165-
services.AddHttpClient(GhostRepository.ClientKey, client =>
166+
services.AddHttpClient(
167+
AlternativeDomainFallbackHandler.TransportClientKey,
168+
(provider, client) =>
169+
{
170+
provider.GetRequiredService<NetworkUserAgent>().Apply(client);
171+
client.Timeout = AlternativeDomainFallbackHandler.RequestTimeout;
172+
});
173+
services.AddHttpClient(GhostRepository.ClientKey, (provider, client) =>
166174
{
175+
provider.GetRequiredService<NetworkUserAgent>().Apply(client);
167176
client.Timeout = TimeSpan.FromSeconds(60);
168177
});
169178
services.AddSingleton(provider =>
@@ -183,6 +192,7 @@ private void ConfigureServices(IServiceCollection services)
183192
routingService.SelectedBackendUrl,
184193
"Backend API URL");
185194
client.Timeout = Timeout.InfiniteTimeSpan;
195+
provider.GetRequiredService<NetworkUserAgent>().Apply(client);
186196
AddDefaultHeaders(client);
187197
})
188198
.AddHttpMessageHandler(provider => new AlternativeDomainFallbackHandler(
@@ -199,6 +209,7 @@ private void ConfigureServices(IServiceCollection services)
199209
routingService.SelectedGraphQLUrl,
200210
"GraphQL URL");
201211
client.Timeout = Timeout.InfiniteTimeSpan;
212+
provider.GetRequiredService<NetworkUserAgent>().Apply(client);
202213
AddDefaultHeaders(client);
203214
},
204215
clientBuilder => clientBuilder.AddHttpMessageHandler(provider =>
@@ -215,7 +226,11 @@ private void ConfigureServices(IServiceCollection services)
215226
"GraphQL URL");
216227
client.Uri = GraphqlWebSocketUri.FromHttp(graphQlUri);
217228
if (client.Socket is ClientWebSocket socket)
229+
{
230+
provider.GetRequiredService<NetworkUserAgent>()
231+
.Apply((name, value) => socket.Options.SetRequestHeader(name, value));
218232
AddDefaultHeaders((name, value) => socket.Options.SetRequestHeader(name, value));
233+
}
219234
});
220235
}
221236

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System.Net.Http;
2+
using TNRD.Zeepkist.GTR.Connectivity;
3+
using Xunit;
4+
5+
namespace Zeepkist.GTR.Mod.Tests;
6+
7+
public class NetworkUserAgentTests
8+
{
9+
[Fact]
10+
public void ValueUsesGtrBuildAndLoadedZeepSdkVersions()
11+
{
12+
NetworkUserAgent userAgent = new("1.7.0", "2.6.1");
13+
14+
Assert.Equal("ZeepkistGTR/1.7.0 (ZeepSDK 2.6.1)", userAgent.Value);
15+
}
16+
17+
[Fact]
18+
public void ApplyReplacesExistingHttpUserAgent()
19+
{
20+
using HttpClient client = new();
21+
client.DefaultRequestHeaders.UserAgent.ParseAdd("ExistingClient/1.0");
22+
NetworkUserAgent userAgent = new("1.7.0", "2.6.1");
23+
24+
userAgent.Apply(client);
25+
26+
Assert.Equal(
27+
"ZeepkistGTR/1.7.0 (ZeepSDK 2.6.1)",
28+
client.DefaultRequestHeaders.UserAgent.ToString());
29+
}
30+
31+
[Fact]
32+
public void ApplySetsWebSocketHeader()
33+
{
34+
string name = null;
35+
string value = null;
36+
NetworkUserAgent userAgent = new("1.7.0", "2.6.1");
37+
38+
userAgent.Apply((headerName, headerValue) =>
39+
{
40+
name = headerName;
41+
value = headerValue;
42+
});
43+
44+
Assert.Equal("User-Agent", name);
45+
Assert.Equal("ZeepkistGTR/1.7.0 (ZeepSDK 2.6.1)", value);
46+
}
47+
}

Zeepkist.GTR.Mod.Tests/Zeepkist.GTR.Mod.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
<Compile Include="..\Connectivity\CloudflareTraceParser.cs" Link="Source\CloudflareTraceParser.cs" />
3232
<Compile Include="..\Connectivity\CloudflareTraceRequest.cs" Link="Source\CloudflareTraceRequest.cs" />
3333
<Compile Include="..\Connectivity\ISpainRoutingState.cs" Link="Source\ISpainRoutingState.cs" />
34+
<Compile Include="..\Connectivity\NetworkUserAgent.cs" Link="Source\NetworkUserAgent.cs" />
3435
<Compile Include="..\Connectivity\ServiceEndpoint.cs" Link="Source\ServiceEndpoint.cs" />
3536
<Compile Include="..\Connectivity\SpainTraceResult.cs" Link="Source\SpainTraceResult.cs" />
3637
<Compile Include="..\Ghosting\GhostLimits.cs" Link="Source\GhostLimits.cs" />

0 commit comments

Comments
 (0)