//-----------------------------------------------------------------------
//
// Copyright (c) Outercurve Foundation. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.Test.Mocks {
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OpenId.RelyingParty;
using DotNetOpenAuth.Test.OpenId;
using DotNetOpenAuth.Yadis;
using Validation;
internal static class MockHttpRequest {
internal static void RegisterMockXrdsResponse(this TestBase test, IdentifierDiscoveryResult endpoint) {
Requires.NotNull(endpoint, "endpoint");
string identityUri;
if (endpoint.ClaimedIdentifier == endpoint.Protocol.ClaimedIdentifierForOPIdentifier) {
identityUri = endpoint.UserSuppliedIdentifier;
} else {
identityUri = endpoint.UserSuppliedIdentifier ?? endpoint.ClaimedIdentifier;
}
RegisterMockXrdsResponse(test, new Uri(identityUri), new IdentifierDiscoveryResult[] { endpoint });
}
internal static void RegisterMockXrdsResponse(this TestBase test, Uri respondingUri, IEnumerable endpoints) {
Requires.NotNull(endpoints, "endpoints");
var xrds = new StringBuilder();
xrds.AppendLine(@"
");
foreach (var endpoint in endpoints) {
string template = @"
{0}
{1}
{2}
{2}
";
string serviceTypeUri;
if (endpoint.ClaimedIdentifier == endpoint.Protocol.ClaimedIdentifierForOPIdentifier) {
serviceTypeUri = endpoint.Protocol.OPIdentifierServiceTypeURI;
} else {
serviceTypeUri = endpoint.Protocol.ClaimedIdentifierServiceTypeURI;
}
string xrd = string.Format(
CultureInfo.InvariantCulture,
template,
HttpUtility.HtmlEncode(serviceTypeUri),
HttpUtility.HtmlEncode(endpoint.ProviderEndpoint.AbsoluteUri),
HttpUtility.HtmlEncode(endpoint.ProviderLocalIdentifier));
xrds.Append(xrd);
}
xrds.Append(@"
");
test.Handle(respondingUri).By(xrds.ToString(), ContentTypes.Xrds);
}
internal static void RegisterMockXrdsResponse(this TestBase test, UriIdentifier directedIdentityAssignedIdentifier, IdentifierDiscoveryResult providerEndpoint) {
IdentifierDiscoveryResult identityEndpoint = IdentifierDiscoveryResult.CreateForClaimedIdentifier(
directedIdentityAssignedIdentifier,
directedIdentityAssignedIdentifier,
providerEndpoint.ProviderLocalIdentifier,
new ProviderEndpointDescription(providerEndpoint.ProviderEndpoint, providerEndpoint.Capabilities),
10,
10);
RegisterMockXrdsResponse(test, identityEndpoint);
}
internal static void RegisterMockXrdsResponse(this TestBase test, string embeddedResourcePath, out Identifier id) {
id = new Uri(new Uri("http://localhost/"), embeddedResourcePath);
test.Handle(new Uri(id))
.By(OpenIdTestBase.LoadEmbeddedFile(embeddedResourcePath), "application/xrds+xml");
}
internal static void RegisterMockRPDiscovery(this TestBase test, bool ssl) {
string template = @"
{0}
{1}
{2}
";
string xrds = string.Format(
CultureInfo.InvariantCulture,
template,
HttpUtility.HtmlEncode(Protocol.V20.RPReturnToTypeURI),
HttpUtility.HtmlEncode(OpenIdTestBase.RPRealmUri.AbsoluteUri),
HttpUtility.HtmlEncode(OpenIdTestBase.RPRealmUriSsl.AbsoluteUri));
test.Handle(ssl ? OpenIdTestBase.RPRealmUriSsl : OpenIdTestBase.RPRealmUri)
.By(xrds, ContentTypes.Xrds);
}
internal static void RegisterMockRedirect(this TestBase test, Uri origin, Uri redirectLocation) {
var response = new HttpResponseMessage(HttpStatusCode.Redirect);
response.Headers.Location = redirectLocation;
test.Handle(origin).By(req => response);
}
internal static void RegisterMockXrdsResponses(this TestBase test, IEnumerable> urlXrdsPairs) {
Requires.NotNull(urlXrdsPairs, "urlXrdsPairs");
foreach (var keyValuePair in urlXrdsPairs) {
test.Handle(new Uri(keyValuePair.Key)).By(keyValuePair.Value, ContentTypes.Xrds);
}
}
internal static void RegisterMockResponse(this TestBase test, Uri url, string contentType, string content) {
test.Handle(url).By(content, contentType);
}
internal static void RegisterMockResponse(this TestBase test, Uri requestUri, Uri responseUri, string contentType, string content) {
RegisterMockResponse(test, requestUri, responseUri, contentType, null, content);
}
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;
});
}
private static void CopyHeadersFrom(this HttpResponseMessage message, WebHeaderCollection headers) {
if (headers != null) {
foreach (string headerName in headers) {
string[] headerValues = headers.GetValues(headerName);
if (!message.Headers.TryAddWithoutValidation(headerName, headerValues)) {
message.Content.Headers.TryAddWithoutValidation(headerName, headerValues);
}
}
}
}
}
}