public AutoRedirectTests()
{
Func<IOwinRequest, Task<string>> readToEnd = async request =>
{
using(var reader = new StreamReader(request.Body))
{
return await reader.ReadToEndAsync();
}
};
var responders = new Dictionary<string, Action<IOwinContext>>
{
{ "/redirect-301-absolute", async context =>
{
context.Response.StatusCode = 301;
context.Response.ReasonPhrase = "Moved Permanently";
context.Response.Headers.Add("Location", new [] { "http://localhost/redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-301-relative", async context =>
{
context.Response.StatusCode = 301;
context.Response.ReasonPhrase = "Moved Permanently";
context.Response.Headers.Add("Location", new [] { "redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-301-absolute-setcookie", async context =>
{
context.Response.StatusCode = 302;
context.Response.ReasonPhrase = "Moved Permanently";
context.Response.Headers.Add("Location", new [] { "http://localhost/redirect" });
context.Response.Headers.Add("Set-Cookie", new []{ "foo=bar"});
await readToEnd(context.Request);
}
},
{ "/redirect-302-absolute", async context =>
{
context.Response.StatusCode = 302;
context.Response.ReasonPhrase = "Found";
context.Response.Headers.Add("Location", new [] { "http://localhost/redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-302-relative", async context =>
{
context.Response.StatusCode = 302;
context.Response.ReasonPhrase = "Found";
context.Response.Headers.Add("Location", new [] { "redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-302-relative-setcookie", async context =>
{
context.Response.StatusCode = 302;
context.Response.ReasonPhrase = "Found";
context.Response.Headers.Add("Location", new [] { "redirect" });
context.Response.Headers.Add("Set-Cookie", new []{ "foo=bar"});
await readToEnd(context.Request);
}
},
{ "/redirect-303-absolute", async context =>
{
context.Response.StatusCode = 303;
context.Response.ReasonPhrase = "See Other";
context.Response.Headers.Add("Location", new [] { "http://localhost/redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-303-relative", async context =>
{
context.Response.StatusCode = 303;
context.Response.ReasonPhrase = "See Other";
context.Response.Headers.Add("Location", new [] { "redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-307-absolute", async context =>
{
context.Response.StatusCode = 307;
context.Response.ReasonPhrase = "Temporary Redirect";
context.Response.Headers.Add("Location", new [] { "http://localhost/redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-307-relative", async context =>
{
context.Response.StatusCode = 307;
context.Response.ReasonPhrase = "Temporary Redirect";
context.Response.Headers.Add("Location", new [] { "redirect" });
await readToEnd(context.Request);
}
},
{ "/redirect-loop", async context =>
{
context.Response.StatusCode = 302;
context.Response.ReasonPhrase = "Found";
context.Response.Headers.Add("Location", new[] { "http://localhost/redirect-loop" });
await readToEnd(context.Request);
}
},
{
"/redirect", async context =>
{
context.Response.StatusCode = 200;
var requestBody = await readToEnd(context.Request);
await context.Response.WriteAsync(requestBody);
}
}
};
AppFunc appFunc = env =>
{
var context = new OwinContext(env);
responders[context.Request.Path.Value](context);
return Task.FromResult((object)null);
};
_handler = new OwinHttpMessageHandler(appFunc)
{
AllowAutoRedirect = true
};
}