Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -810,6 +810,39 @@ public async Task ShouldHandleCachedRedirects()
Assert.That(responses.Select(response => response.Status), Is.EqualTo(new[] { HttpStatusCode.OK, HttpStatusCode.Found, HttpStatusCode.OK }));
}

[Test, PuppeteerTest("NetworkManager.test.ts", "NetworkManager", "should not override the user agent when nothing is emulated")]
public async Task ShouldNotOverrideTheUserAgentWhenNothingIsEmulated()
{
var client = Substitute.For<ICDPSession>();

using var loggerFactory = new LoggerFactory();
var manager = CreateNetworkManager(loggerFactory);

await manager.AddClientAsync(client);
await client.DidNotReceive().SendAsync("Network.setUserAgentOverride", Arg.Any<NetworkSetUserAgentOverrideRequest>(), Arg.Any<bool>(), Arg.Any<CommandOptions>());

await manager.SetUserAgentAsync("custom-user-agent", null);
await client.Received(1).SendAsync("Network.setUserAgentOverride", Arg.Any<NetworkSetUserAgentOverrideRequest>(), Arg.Any<bool>(), Arg.Any<CommandOptions>());
}

[Test, PuppeteerTest("NetworkManager.test.ts", "NetworkManager", "should reset the override when the emulated accept-language is cleared")]
public async Task ShouldResetTheOverrideWhenTheEmulatedAcceptLanguageIsCleared()
{
var client = Substitute.For<ICDPSession>();

using var loggerFactory = new LoggerFactory();
var manager = CreateNetworkManager(loggerFactory);

await manager.AddClientAsync(client);
await client.DidNotReceive().SendAsync("Network.setUserAgentOverride", Arg.Any<NetworkSetUserAgentOverrideRequest>(), Arg.Any<bool>(), Arg.Any<CommandOptions>());

await manager.SetAcceptLanguageAsync("fr-FR");
await client.Received(1).SendAsync("Network.setUserAgentOverride", Arg.Any<NetworkSetUserAgentOverrideRequest>(), Arg.Any<bool>(), Arg.Any<CommandOptions>());

await manager.SetAcceptLanguageAsync(null);
await client.Received(2).SendAsync("Network.setUserAgentOverride", Arg.Any<NetworkSetUserAgentOverrideRequest>(), Arg.Any<bool>(), Arg.Any<CommandOptions>());
}

[Test, PuppeteerTest("NetworkManager.test.ts", "NetworkManager error handling", "should not throw on target close error")]
public async Task ShouldNotThrowOnTargetCloseError()
{
Expand Down
13 changes: 13 additions & 0 deletions lib/PuppeteerSharp/Cdp/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ internal class NetworkManager
private UserAgentMetadata _userAgentMetadata;
private string _platform;
private string _acceptLanguage;
private bool _userAgentOverrideApplied;

/// <summary>
/// Initializes a new instance of the <see cref="NetworkManager"/> class.
Expand Down Expand Up @@ -639,6 +640,17 @@ private void PatchRequestEventHeaders(RequestWillBeSentResponse requestWillBeSen

private async Task ApplyUserAgentAsync(ICDPSession client)
{
var nothingToEmulate = _userAgent == null &&
_userAgentMetadata == null &&
_acceptLanguage == null &&
_platform == null;

// Still need to send once to reset a previously-applied override.
if (nothingToEmulate && !_userAgentOverrideApplied)
{
return;
}

var userAgent = _userAgent ?? await _frameManager.Page.Browser.GetUserAgentAsync().ConfigureAwait(false);
if (userAgent == null)
{
Expand All @@ -656,6 +668,7 @@ await client.SendAsync(
UserAgentMetadata = _userAgentMetadata,
Platform = _platform,
}).ConfigureAwait(false);
_userAgentOverrideApplied = !nothingToEmulate;
}
catch (Exception ex) when (CanIgnoreError(ex))
{
Expand Down
Loading