diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2013-03-23 15:08:14 -0700 |
---|---|---|
committer | Andrew Arnott <andrewarnott@gmail.com> | 2013-03-23 15:08:14 -0700 |
commit | 5bdaf4427a0963425e5fd36b80448065c61077b4 (patch) | |
tree | 451419a93894388a7b711c7058aac1c06b7d348e /src | |
parent | 28ecaad3e965105c0f32d43760f2f855504d2212 (diff) | |
download | DotNetOpenAuth-5bdaf4427a0963425e5fd36b80448065c61077b4.zip DotNetOpenAuth-5bdaf4427a0963425e5fd36b80448065c61077b4.tar.gz DotNetOpenAuth-5bdaf4427a0963425e5fd36b80448065c61077b4.tar.bz2 |
Fixes some OpenID redirect tests.
Diffstat (limited to 'src')
5 files changed, 65 insertions, 3 deletions
diff --git a/src/DotNetOpenAuth.Test/AutoRedirectHandler.cs b/src/DotNetOpenAuth.Test/AutoRedirectHandler.cs new file mode 100644 index 0000000..3f67259 --- /dev/null +++ b/src/DotNetOpenAuth.Test/AutoRedirectHandler.cs @@ -0,0 +1,33 @@ +namespace DotNetOpenAuth.Test { + using System; + using System.Collections.Generic; + using System.Linq; + using System.Net; + using System.Net.Http; + using System.Text; + using System.Threading.Tasks; + + using DotNetOpenAuth.Messaging; + + internal class AutoRedirectHandler : DelegatingHandler { + internal AutoRedirectHandler(HttpMessageHandler innerHandler) + : base(innerHandler) { + } + + protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { + HttpResponseMessage response = null; + do { + if (response != null) { + var modifiedRequest = MessagingUtilities.Clone(request); + modifiedRequest.RequestUri = new Uri(request.RequestUri, response.Headers.Location); + request = modifiedRequest; + } + + response = await base.SendAsync(request, cancellationToken); + } + while (response.StatusCode == HttpStatusCode.Redirect); + + return response; + } + } +} diff --git a/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj b/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj index 0e5a898..ab90935 100644 --- a/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj +++ b/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj @@ -104,6 +104,7 @@ </Reference> </ItemGroup> <ItemGroup> + <Compile Include="AutoRedirectHandler.cs" /> <Compile Include="Configuration\SectionTests.cs" /> <Compile Include="Hosting\AspNetHost.cs" /> <Compile Include="Hosting\HostingTests.cs" /> diff --git a/src/DotNetOpenAuth.Test/MockingHostFactories.cs b/src/DotNetOpenAuth.Test/MockingHostFactories.cs index a05fcdf..5dd09e2 100644 --- a/src/DotNetOpenAuth.Test/MockingHostFactories.cs +++ b/src/DotNetOpenAuth.Test/MockingHostFactories.cs @@ -28,7 +28,7 @@ namespace DotNetOpenAuth.Test { public CookieContainer CookieContainer { get; set; } public HttpMessageHandler CreateHttpMessageHandler() { - return new CookieDelegatingHandler(new ForwardingMessageHandler(this.handlers, this), this.CookieContainer); + return new AutoRedirectHandler(new CookieDelegatingHandler(new ForwardingMessageHandler(this.handlers, this), this.CookieContainer)); } public HttpClient CreateHttpClient(HttpMessageHandler handler = null) { diff --git a/src/DotNetOpenAuth.Test/Mocks/MockHttpRequest.cs b/src/DotNetOpenAuth.Test/Mocks/MockHttpRequest.cs index 87faac2..349be56 100644 --- a/src/DotNetOpenAuth.Test/Mocks/MockHttpRequest.cs +++ b/src/DotNetOpenAuth.Test/Mocks/MockHttpRequest.cs @@ -131,8 +131,21 @@ namespace DotNetOpenAuth.Test.Mocks { } internal static void RegisterMockResponse(this TestBase test, Uri requestUri, Uri responseUri, string contentType, WebHeaderCollection headers, string content) { + Requires.NotNull(requestUri, "requestUri"); + Requires.NotNull(responseUri, "responseUri"); + Requires.NotNullOrEmpty(contentType, "contentType"); + test.Handle(requestUri).By(req => { var response = new HttpResponseMessage(); + response.RequestMessage = req; + + if (requestUri != responseUri) { + // Simulate having followed redirects to get the final response. + var clonedRequest = MessagingUtilities.Clone(req); + clonedRequest.RequestUri = responseUri; + response.RequestMessage = clonedRequest; + } + response.CopyHeadersFrom(headers); response.Content = new StringContent(content, Encoding.Default, contentType); return response; diff --git a/src/DotNetOpenAuth.Test/OpenId/DiscoveryServices/UriDiscoveryServiceTests.cs b/src/DotNetOpenAuth.Test/OpenId/DiscoveryServices/UriDiscoveryServiceTests.cs index 0dfb880..3c54d98 100644 --- a/src/DotNetOpenAuth.Test/OpenId/DiscoveryServices/UriDiscoveryServiceTests.cs +++ b/src/DotNetOpenAuth.Test/OpenId/DiscoveryServices/UriDiscoveryServiceTests.cs @@ -9,6 +9,7 @@ namespace DotNetOpenAuth.Test.OpenId.DiscoveryServices { using System.Collections.Generic; using System.Linq; using System.Net; + using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -237,11 +238,25 @@ namespace DotNetOpenAuth.Test.OpenId.DiscoveryServices { await this.DiscoverAsync(url, version, expectedLocalId, providerEndpoint, expectSreg, useRedirect, null); } + private string RegisterDiscoveryRedirector(Uri baseUrl) { + var redirectorUrl = new Uri(baseUrl, "Discovery/htmldiscovery/redirect.aspx"); + this.Handle(redirectorUrl).By(req => { + string redirectTarget = HttpUtility.ParseQueryString(req.RequestUri.Query)["target"]; + var response = new HttpResponseMessage(HttpStatusCode.Redirect); + response.Headers.Location = new Uri(redirectTarget, UriKind.RelativeOrAbsolute); + response.RequestMessage = req; + return response; + }); + + return redirectorUrl.AbsoluteUri + "?target="; + } + private async Task DiscoverAsync(string url, ProtocolVersion version, Identifier expectedLocalId, string providerEndpoint, bool expectSreg, bool useRedirect, WebHeaderCollection headers) { Protocol protocol = Protocol.Lookup(version); Uri baseUrl = new Uri("http://localhost/"); + string redirectBase = this.RegisterDiscoveryRedirector(baseUrl); UriIdentifier claimedId = new Uri(baseUrl, url); - UriIdentifier userSuppliedIdentifier = new Uri(baseUrl, "Discovery/htmldiscovery/redirect.aspx?target=" + url); + UriIdentifier userSuppliedIdentifier = new Uri(redirectBase + Uri.EscapeDataString(url)); if (expectedLocalId == null) { expectedLocalId = claimedId; } @@ -255,7 +270,7 @@ namespace DotNetOpenAuth.Test.OpenId.DiscoveryServices { } else { throw new InvalidOperationException(); } - this.RegisterMockResponse(new Uri(idToDiscover), claimedId, contentType, headers ?? new WebHeaderCollection(), LoadEmbeddedFile(url)); + this.RegisterMockResponse(claimedId, claimedId, contentType, headers ?? new WebHeaderCollection(), LoadEmbeddedFile(url)); IdentifierDiscoveryResult expected = IdentifierDiscoveryResult.CreateForClaimedIdentifier( claimedId, |