#78 - Enable TestServer to populate the PathBase.
This commit is contained in:
parent
d25ffec655
commit
bf5d14f477
|
|
@ -24,12 +24,13 @@ namespace Microsoft.AspNet.TestHost
|
||||||
public class ClientHandler : HttpMessageHandler
|
public class ClientHandler : HttpMessageHandler
|
||||||
{
|
{
|
||||||
private readonly Func<object, Task> _next;
|
private readonly Func<object, Task> _next;
|
||||||
|
private readonly PathString _pathBase;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a new handler.
|
/// Create a new handler.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="next">The pipeline entry point.</param>
|
/// <param name="next">The pipeline entry point.</param>
|
||||||
public ClientHandler(Func<object, Task> next)
|
public ClientHandler(Func<object, Task> next, PathString pathBase)
|
||||||
{
|
{
|
||||||
if (next == null)
|
if (next == null)
|
||||||
{
|
{
|
||||||
|
|
@ -37,6 +38,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
}
|
}
|
||||||
|
|
||||||
_next = next;
|
_next = next;
|
||||||
|
_pathBase = pathBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -55,7 +57,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
throw new ArgumentNullException("request");
|
throw new ArgumentNullException("request");
|
||||||
}
|
}
|
||||||
|
|
||||||
var state = new RequestState(request, cancellationToken);
|
var state = new RequestState(request, _pathBase, cancellationToken);
|
||||||
var requestContent = request.Content ?? new StreamContent(Stream.Null);
|
var requestContent = request.Content ?? new StreamContent(Stream.Null);
|
||||||
var body = await requestContent.ReadAsStreamAsync();
|
var body = await requestContent.ReadAsStreamAsync();
|
||||||
if (body.CanSeek)
|
if (body.CanSeek)
|
||||||
|
|
@ -95,7 +97,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
private ResponseStream _responseStream;
|
private ResponseStream _responseStream;
|
||||||
private ResponseFeature _responseFeature;
|
private ResponseFeature _responseFeature;
|
||||||
|
|
||||||
internal RequestState(HttpRequestMessage request, CancellationToken cancellationToken)
|
internal RequestState(HttpRequestMessage request, PathString pathBase, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
_request = request;
|
_request = request;
|
||||||
_responseTcs = new TaskCompletionSource<HttpResponseMessage>();
|
_responseTcs = new TaskCompletionSource<HttpResponseMessage>();
|
||||||
|
|
@ -118,8 +120,20 @@ namespace Microsoft.AspNet.TestHost
|
||||||
serverRequest.Protocol = "HTTP/" + request.Version.ToString(2);
|
serverRequest.Protocol = "HTTP/" + request.Version.ToString(2);
|
||||||
serverRequest.Scheme = request.RequestUri.Scheme;
|
serverRequest.Scheme = request.RequestUri.Scheme;
|
||||||
serverRequest.Method = request.Method.ToString();
|
serverRequest.Method = request.Method.ToString();
|
||||||
serverRequest.Path = PathString.FromUriComponent(request.RequestUri);
|
|
||||||
serverRequest.PathBase = PathString.Empty;
|
var fullPath = PathString.FromUriComponent(request.RequestUri);
|
||||||
|
PathString remainder;
|
||||||
|
if (fullPath.StartsWithSegments(pathBase, out remainder))
|
||||||
|
{
|
||||||
|
serverRequest.PathBase = pathBase;
|
||||||
|
serverRequest.Path = remainder;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
serverRequest.PathBase = PathString.Empty;
|
||||||
|
serverRequest.Path = fullPath;
|
||||||
|
}
|
||||||
|
|
||||||
serverRequest.QueryString = QueryString.FromUriComponent(request.RequestUri);
|
serverRequest.QueryString = QueryString.FromUriComponent(request.RequestUri);
|
||||||
// TODO: serverRequest.CallCancelled = cancellationToken;
|
// TODO: serverRequest.CallCancelled = cancellationToken;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.AspNet.Builder;
|
using Microsoft.AspNet.Builder;
|
||||||
using Microsoft.AspNet.Hosting;
|
using Microsoft.AspNet.Hosting;
|
||||||
using Microsoft.AspNet.Hosting.Server;
|
using Microsoft.AspNet.Hosting.Server;
|
||||||
|
using Microsoft.AspNet.Http;
|
||||||
using Microsoft.Framework.ConfigurationModel;
|
using Microsoft.Framework.ConfigurationModel;
|
||||||
using Microsoft.Framework.DependencyInjection;
|
using Microsoft.Framework.DependencyInjection;
|
||||||
using Microsoft.Framework.DependencyInjection.Fallback;
|
using Microsoft.Framework.DependencyInjection.Fallback;
|
||||||
|
|
@ -41,6 +42,8 @@ namespace Microsoft.AspNet.TestHost
|
||||||
_appInstance = engine.Start(hostContext);
|
_appInstance = engine.Start(hostContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Uri BaseAddress { get; set; } = new Uri("http://localhost/");
|
||||||
|
|
||||||
public static TestServer Create(Action<IApplicationBuilder> app)
|
public static TestServer Create(Action<IApplicationBuilder> app)
|
||||||
{
|
{
|
||||||
return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app);
|
return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app);
|
||||||
|
|
@ -68,12 +71,13 @@ namespace Microsoft.AspNet.TestHost
|
||||||
|
|
||||||
public HttpMessageHandler CreateHandler()
|
public HttpMessageHandler CreateHandler()
|
||||||
{
|
{
|
||||||
return new ClientHandler(Invoke);
|
var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress);
|
||||||
|
return new ClientHandler(Invoke, pathBase);
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpClient CreateClient()
|
public HttpClient CreateClient()
|
||||||
{
|
{
|
||||||
return new HttpClient(CreateHandler()) { BaseAddress = new Uri("http://localhost/") };
|
return new HttpClient(CreateHandler()) { BaseAddress = BaseAddress };
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,8 @@ namespace Microsoft.AspNet.TestHost
|
||||||
Assert.Equal("HTTP/1.1", context.Request.Protocol);
|
Assert.Equal("HTTP/1.1", context.Request.Protocol);
|
||||||
Assert.Equal("GET", context.Request.Method);
|
Assert.Equal("GET", context.Request.Method);
|
||||||
Assert.Equal("https", context.Request.Scheme);
|
Assert.Equal("https", context.Request.Scheme);
|
||||||
Assert.Equal(string.Empty, context.Request.PathBase.Value);
|
Assert.Equal("/A/Path", context.Request.PathBase.Value);
|
||||||
Assert.Equal("/A/Path/and/file.txt", context.Request.Path.Value);
|
Assert.Equal("/and/file.txt", context.Request.Path.Value);
|
||||||
Assert.Equal("?and=query", context.Request.QueryString.Value);
|
Assert.Equal("?and=query", context.Request.QueryString.Value);
|
||||||
Assert.NotNull(context.Request.Body);
|
Assert.NotNull(context.Request.Body);
|
||||||
Assert.NotNull(context.Request.Headers);
|
Assert.NotNull(context.Request.Headers);
|
||||||
|
|
@ -40,7 +40,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
Assert.Equal("example.com", context.Request.Host.Value);
|
Assert.Equal("example.com", context.Request.Host.Value);
|
||||||
|
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
});
|
}, new PathString("/A/Path"));
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query");
|
return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query");
|
||||||
}
|
}
|
||||||
|
|
@ -57,7 +57,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
|
|
||||||
context.Response.Headers["TestHeader"] = "TestValue:" + requestCount++;
|
context.Response.Headers["TestHeader"] = "TestValue:" + requestCount++;
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
});
|
}, PathString.Empty);
|
||||||
|
|
||||||
HttpMessageInvoker invoker = new HttpMessageInvoker(handler);
|
HttpMessageInvoker invoker = new HttpMessageInvoker(handler);
|
||||||
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/");
|
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/");
|
||||||
|
|
@ -79,7 +79,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
|
|
||||||
context.Response.Headers["TestHeader"] = "TestValue";
|
context.Response.Headers["TestHeader"] = "TestValue";
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/");
|
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/");
|
||||||
Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First());
|
Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First());
|
||||||
|
|
@ -93,7 +93,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
{
|
{
|
||||||
block.WaitOne();
|
block.WaitOne();
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
Task<HttpResponseMessage> task = httpClient.GetAsync("https://example.com/");
|
Task<HttpResponseMessage> task = httpClient.GetAsync("https://example.com/");
|
||||||
Assert.False(task.IsCompleted);
|
Assert.False(task.IsCompleted);
|
||||||
|
|
@ -113,7 +113,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
await context.Response.WriteAsync("BodyStarted,");
|
await context.Response.WriteAsync("BodyStarted,");
|
||||||
block.WaitOne();
|
block.WaitOne();
|
||||||
await context.Response.WriteAsync("BodyFinished");
|
await context.Response.WriteAsync("BodyFinished");
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
||||||
HttpCompletionOption.ResponseHeadersRead);
|
HttpCompletionOption.ResponseHeadersRead);
|
||||||
|
|
@ -133,7 +133,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
context.Response.Body.Flush();
|
context.Response.Body.Flush();
|
||||||
block.WaitOne();
|
block.WaitOne();
|
||||||
await context.Response.WriteAsync("BodyFinished");
|
await context.Response.WriteAsync("BodyFinished");
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
||||||
HttpCompletionOption.ResponseHeadersRead);
|
HttpCompletionOption.ResponseHeadersRead);
|
||||||
|
|
@ -153,7 +153,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
context.Response.Body.Flush();
|
context.Response.Body.Flush();
|
||||||
block.WaitOne();
|
block.WaitOne();
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
||||||
HttpCompletionOption.ResponseHeadersRead);
|
HttpCompletionOption.ResponseHeadersRead);
|
||||||
|
|
@ -179,7 +179,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
context.Response.Body.Flush();
|
context.Response.Body.Flush();
|
||||||
block.WaitOne();
|
block.WaitOne();
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
||||||
HttpCompletionOption.ResponseHeadersRead);
|
HttpCompletionOption.ResponseHeadersRead);
|
||||||
|
|
@ -201,7 +201,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
var handler = new ClientHandler(env =>
|
var handler = new ClientHandler(env =>
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Test Exception");
|
throw new InvalidOperationException("Test Exception");
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
return Assert.ThrowsAsync<InvalidOperationException>(() => httpClient.GetAsync("https://example.com/",
|
return Assert.ThrowsAsync<InvalidOperationException>(() => httpClient.GetAsync("https://example.com/",
|
||||||
HttpCompletionOption.ResponseHeadersRead));
|
HttpCompletionOption.ResponseHeadersRead));
|
||||||
|
|
@ -218,7 +218,7 @@ namespace Microsoft.AspNet.TestHost
|
||||||
await context.Response.WriteAsync("BodyStarted");
|
await context.Response.WriteAsync("BodyStarted");
|
||||||
block.WaitOne();
|
block.WaitOne();
|
||||||
throw new InvalidOperationException("Test Exception");
|
throw new InvalidOperationException("Test Exception");
|
||||||
});
|
}, PathString.Empty);
|
||||||
var httpClient = new HttpClient(handler);
|
var httpClient = new HttpClient(handler);
|
||||||
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
HttpResponseMessage response = await httpClient.GetAsync("https://example.com/",
|
||||||
HttpCompletionOption.ResponseHeadersRead);
|
HttpCompletionOption.ResponseHeadersRead);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue