#360 Add Response.Clear() extension.

This commit is contained in:
Chris R 2015-09-10 11:30:42 -07:00
parent df33a3cff8
commit 00d5a056d9
2 changed files with 90 additions and 0 deletions

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNet.Http.Features;
namespace Microsoft.AspNet.Http.Extensions
{
public static class ResponseExtensions
{
public static void Clear(this HttpResponse response)
{
if (response.HasStarted)
{
throw new InvalidOperationException("The response cannot be cleared, it has already started sending.");
}
response.StatusCode = 200;
response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = null;
response.Headers.Clear();
if (response.Body.CanSeek)
{
response.Body.SetLength(0);
}
}
}
}

View File

@ -0,0 +1,64 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNet.Http.Features;
using Microsoft.AspNet.Http.Internal;
using Microsoft.Framework.Primitives;
using Xunit;
namespace Microsoft.AspNet.Http.Extensions
{
public class ResponseExtensionTests
{
[Fact]
public void Clear_ResetsResponse()
{
var context = new DefaultHttpContext();
context.Response.StatusCode = 201;
context.Response.Headers["custom"] = "value";
context.Response.Body.Write(new byte[100], 0, 100);
context.Response.Clear();
Assert.Equal(200, context.Response.StatusCode);
Assert.Equal(string.Empty, context.Response.Headers["custom"].ToString());
Assert.Equal(0, context.Response.Body.Length);
}
[Fact]
public void Clear_AlreadyStarted_Throws()
{
var context = new DefaultHttpContext();
context.Features.Set<IHttpResponseFeature>(new StartedResponseFeature());
Assert.Throws<InvalidOperationException>(() => context.Response.Clear());
}
private class StartedResponseFeature : IHttpResponseFeature
{
public Stream Body { get; set; }
public bool HasStarted { get { return true; } }
public IDictionary<string, StringValues> Headers { get; set; }
public string ReasonPhrase { get; set; }
public int StatusCode { get; set; }
public void OnCompleted(Func<object, Task> callback, object state)
{
throw new NotImplementedException();
}
public void OnStarting(Func<object, Task> callback, object state)
{
throw new NotImplementedException();
}
}
}
}