Skip to content

Commit

Permalink
Set Playwright HttpCredentials only on new BrowserSession via AppHost
Browse files Browse the repository at this point in the history
  • Loading branch information
adiel committed Feb 27, 2024
1 parent e15ab4c commit b1705cf
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 40 deletions.
13 changes: 4 additions & 9 deletions src/Coypu.AcceptanceTests/BasicAuth.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,22 +35,17 @@ public void It_passes_through_basic_auth_from_url_as_auth_header()
{
Timeout = TimeSpan.FromMilliseconds(1000),
Port = site.BaseUri.Port,
AppHost = "http://username:passw0rd@localhost",
AppHost = "http://someUser:passw0rd@localhost",
Driver = typeof(PlaywrightDriver), // Selenium can't do this
Headless = false,
Browser = Drivers.Browser.Chromium
};

browser = new BrowserSession(configuration);
browser.Visit("/headers");
Assert.That(browser, Shows.Content("Authorization: " + GetBasicAuthHeader("username", "passw0rd")));

browser.Visit("http://un2:pw2@localhost:" + site.BaseUri.Port + "/headers");
Assert.That(browser, Shows.Content("Authorization: " + GetBasicAuthHeader("un2", "pw2")));
browser.Visit("/");

browser.Visit("http://localhost:" + site.BaseUri.Port + "/headers");
Assert.That(browser, Shows.Content("Authorization:"));
Assert.That(browser, Shows.No.Content("Authorization: Basic"));
browser.Visit("/headers");
Assert.That(browser, Shows.Content("Authorization: " + GetBasicAuthHeader("someUser", "passw0rd")));
}

private string GetBasicAuthHeader(string username, string password)
Expand Down
15 changes: 13 additions & 2 deletions src/Coypu.AcceptanceTests/sites/SelfHostedSite.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mime;
Expand Down Expand Up @@ -39,9 +40,19 @@ public SelfHostedSite()
return Results.NoContent();
});
_app.MapGet("/headers",
(HttpRequest req) =>
(HttpRequest req, HttpResponse res) =>
{
return Results.Text(req.Headers.Select(h => $"{h.Key}: {h.Value}").Aggregate((a, b) => $"{a}\n{b}"));
if (string.IsNullOrEmpty(req.Headers["Authorization"])) {
res.Headers.Add("WWW-Authenticate", "Basic realm= \"Coypu Test\"");
return Results.Unauthorized();
};
return Results.Content(
"<HTML><BODY>" +
req.Headers.Select(h => $"{h.Key}: {h.Value}").Aggregate((a, b) => $"{a}: {b}</br>") +
"<img src=\"/235.gif\" />" +
"<img src=\"https://github.com/featurist/coypu/pull/235.gif\" />" +
"</BODY></HTML>",
MediaTypeNames.Text.Html, Encoding.UTF8);
});

_app.StartAsync().Wait();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public StubDriverFactory(IDriver driver)
this.driver = driver;
}

public IDriver NewWebDriver(Type driverType, Drivers.Browser browser, bool Headless)
public IDriver NewWebDriver(Type driverType, Drivers.Browser browser, bool Headless, string appHost)
{
return driver;
}
Expand Down
4 changes: 2 additions & 2 deletions src/Coypu/ActivatorDriverFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ public class ActivatorDriverFactory : DriverFactory
{
public static int OpenDrivers { get; set; }

public IDriver NewWebDriver(Type driverType, Drivers.Browser browser, bool headless)
public IDriver NewWebDriver(Type driverType, Drivers.Browser browser, bool headless, string appHost)
{
try
{
var driver = (IDriver)Activator.CreateInstance(driverType, browser, headless);
var driver = (IDriver)Activator.CreateInstance(driverType, browser, headless, appHost);
OpenDrivers++;
return driver;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Coypu/BrowserSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ internal BrowserSession(SessionConfiguration sessionConfiguration,
RestrictedResourceDownloader restrictedResourceDownloader)
: base(sessionConfiguration,
null,
driverFactory.NewWebDriver(sessionConfiguration.Driver, sessionConfiguration.Browser, sessionConfiguration.Headless),
driverFactory.NewWebDriver(sessionConfiguration.Driver, sessionConfiguration.Browser, sessionConfiguration.Headless, sessionConfiguration.AppHost),
timingStrategy,
waiter,
urlBuilder,
Expand Down
2 changes: 1 addition & 1 deletion src/Coypu/DriverFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ namespace Coypu
{
public interface DriverFactory
{
IDriver NewWebDriver(Type driverType, Drivers.Browser browser, bool headless);
IDriver NewWebDriver(Type driverType, Drivers.Browser browser, bool headless, string appHost);
}
}
54 changes: 31 additions & 23 deletions src/Coypu/Drivers/Playwright/PlaywrightDriver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
using System.Text.RegularExpressions;
using Cookie = System.Net.Cookie;
using Microsoft.Playwright;
using System.Text;
using System.Collections.Immutable;
using System.Threading.Tasks;

#pragma warning disable 1591

Expand All @@ -15,12 +16,12 @@ public class PlaywrightDriver : IDriver
{
private readonly Browser _browser;
private readonly bool _headless;
private readonly Dialogs _dialogs;
private readonly IPlaywright _playwright;
private readonly Dialogs _dialogs;
private readonly IPlaywright _playwright;
private readonly IBrowser _playwrightBrowser;
private readonly IBrowserContext _context;
private IBrowserContext _context;

public PlaywrightDriver(Browser browser, bool headless)
public PlaywrightDriver(Browser browser, bool headless, string appHost)
{
_dialogs = new Dialogs();
_playwright = Microsoft.Playwright.Playwright.CreateAsync().Sync();
Expand All @@ -31,18 +32,37 @@ public PlaywrightDriver(Browser browser, bool headless)
_playwrightBrowser = browserType.LaunchAsync(
new BrowserTypeLaunchOptions
{
Headless = headless,
Channel = PlaywrightBrowserChannel(browser)
Headless = headless,
Channel = PlaywrightBrowserChannel(browser),
}
).Sync();
var page = _playwrightBrowser.NewPageAsync().Sync();
NewContext(appHost);
}

private void NewContext(string appHost)
{
var options = new BrowserNewPageOptions();
if (Uri.IsWellFormedUriString(appHost, UriKind.Absolute))
{
var userInfo = new Uri(appHost).UserInfo;
if (!string.IsNullOrEmpty(userInfo)) {
var credentials = userInfo.Split(':');
options.HttpCredentials = new HttpCredentials
{
Username = credentials[0],
Password = credentials[1]
};
}
}

var page = _playwrightBrowser.NewPageAsync(options).Sync();
_context = page.Context;

Cookies = new Cookies(_context);
_context.SetDefaultTimeout(10000);
}
}

private string PlaywrightBrowserChannel(Browser browser)
private string PlaywrightBrowserChannel(Browser browser)
{
if (browser == Browser.Chrome)
return "chrome";
Expand Down Expand Up @@ -200,22 +220,10 @@ public void CancelPrompt(string text, DriverScope scope, Action trigger)
public void Visit(string url,
Scope scope)
{
string userInfo = new Uri(url).UserInfo;
if (string.IsNullOrEmpty(userInfo))
{
_context.SetExtraHTTPHeadersAsync(new Dictionary<string, string> {
{ "Authorization", string.Empty }
}).Sync();
} else {
var base64EncodedAuthenticationString = Convert.ToBase64String(Encoding.ASCII.GetBytes(userInfo));
_context.SetExtraHTTPHeadersAsync(new Dictionary<string, string> {
{ "Authorization", "Basic " + base64EncodedAuthenticationString }
}).Sync();
}
IResponse response = PlaywrightPage(scope).GotoAsync(url).Sync();
if (response != null && response.Status != 200)
{
throw new Exception("Failed to load page");
throw new Exception("Failed to load page");
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Coypu/Drivers/Selenium/SeleniumWebDriver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class SeleniumWebDriver : IDriver
private IWebDriver _webDriver;
private readonly WindowHandleFinder _windowHandleFinder;

public SeleniumWebDriver(Browser browser, bool headless)
public SeleniumWebDriver(Browser browser, bool headless, string _appHost = null)
: this(new DriverFactory().NewWebDriver(browser, headless), browser) { }

protected SeleniumWebDriver(IWebDriver webDriver,
Expand Down

0 comments on commit b1705cf

Please sign in to comment.