diff --git a/lib/PuppeteerSharp.Tests/NetworkManagerTests/NetworkManagerTests.cs b/lib/PuppeteerSharp.Tests/NetworkManagerTests/NetworkManagerTests.cs index 7f48f031b..341be6fb8 100644 --- a/lib/PuppeteerSharp.Tests/NetworkManagerTests/NetworkManagerTests.cs +++ b/lib/PuppeteerSharp.Tests/NetworkManagerTests/NetworkManagerTests.cs @@ -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(); + + using var loggerFactory = new LoggerFactory(); + var manager = CreateNetworkManager(loggerFactory); + + await manager.AddClientAsync(client); + await client.DidNotReceive().SendAsync("Network.setUserAgentOverride", Arg.Any(), Arg.Any(), Arg.Any()); + + await manager.SetUserAgentAsync("custom-user-agent", null); + await client.Received(1).SendAsync("Network.setUserAgentOverride", Arg.Any(), Arg.Any(), Arg.Any()); + } + + [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(); + + using var loggerFactory = new LoggerFactory(); + var manager = CreateNetworkManager(loggerFactory); + + await manager.AddClientAsync(client); + await client.DidNotReceive().SendAsync("Network.setUserAgentOverride", Arg.Any(), Arg.Any(), Arg.Any()); + + await manager.SetAcceptLanguageAsync("fr-FR"); + await client.Received(1).SendAsync("Network.setUserAgentOverride", Arg.Any(), Arg.Any(), Arg.Any()); + + await manager.SetAcceptLanguageAsync(null); + await client.Received(2).SendAsync("Network.setUserAgentOverride", Arg.Any(), Arg.Any(), Arg.Any()); + } + [Test, PuppeteerTest("NetworkManager.test.ts", "NetworkManager error handling", "should not throw on target close error")] public async Task ShouldNotThrowOnTargetCloseError() { diff --git a/lib/PuppeteerSharp/Cdp/NetworkManager.cs b/lib/PuppeteerSharp/Cdp/NetworkManager.cs index 6e0e967d0..d0c9a6767 100644 --- a/lib/PuppeteerSharp/Cdp/NetworkManager.cs +++ b/lib/PuppeteerSharp/Cdp/NetworkManager.cs @@ -31,6 +31,7 @@ internal class NetworkManager private UserAgentMetadata _userAgentMetadata; private string _platform; private string _acceptLanguage; + private bool _userAgentOverrideApplied; /// /// Initializes a new instance of the class. @@ -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) { @@ -656,6 +668,7 @@ await client.SendAsync( UserAgentMetadata = _userAgentMetadata, Platform = _platform, }).ConfigureAwait(false); + _userAgentOverrideApplied = !nothingToEmulate; } catch (Exception ex) when (CanIgnoreError(ex)) {