From 389e27e46055a95648efe48a512614fc4f8ff08e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 29 Oct 2014 16:32:50 -0700 Subject: [PATCH] #134 - Add HeadersSent api. --- src/Microsoft.AspNet.Http/HttpResponse.cs | 3 ++- .../IHttpResponseFeature.cs | 1 + .../OwinFeatureCollection.cs | 16 ++++++++++++++++ .../DefaultHttpResponse.cs | 5 +++++ .../DefaultHttpResponseFeature.cs | 5 +++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 010d159ab8..d0156b4ee9 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; -using System.Threading.Tasks; using Microsoft.AspNet.Http.Security; namespace Microsoft.AspNet.Http @@ -24,6 +23,8 @@ namespace Microsoft.AspNet.Http public abstract IResponseCookies Cookies { get; } + public abstract bool HeadersSent { get; } + public abstract void OnSendingHeaders(Action callback, object state); public virtual void Redirect(string location) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index cf322f6747..aa7603be03 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.HttpFeature string ReasonPhrase { get; set; } IDictionary Headers { get; set; } Stream Body { get; set; } + bool HeadersSent { get; } void OnSendingHeaders(Action callback, object state); } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 7478a81e68..23ca6df7bf 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -35,11 +35,22 @@ namespace Microsoft.AspNet.Owin IOwinEnvironmentFeature { public IDictionary Environment { get; set; } + private bool _headersSent; public OwinFeatureCollection(IDictionary environment) { Environment = environment; SupportsWebSockets = true; + + var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); + if (register != null) + { + register(state => + { + var collection = (OwinFeatureCollection)state; + collection._headersSent = true; + }, this); + } } T Prop(string key) @@ -129,6 +140,11 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseBody, value); } } + bool IHttpResponseFeature.HeadersSent + { + get { return _headersSent; } + } + void IHttpResponseFeature.OnSendingHeaders(Action callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 3b50493b58..03841751ec 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -105,6 +105,11 @@ namespace Microsoft.AspNet.PipelineCore get { return ResponseCookiesFeature.Cookies; } } + public override bool HeadersSent + { + get { return HttpResponseFeature.HeadersSent; } + } + public override void OnSendingHeaders(Action callback, object state) { HttpResponseFeature.OnSendingHeaders(callback, state); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs index 819ff17421..c3b933bb8a 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs @@ -25,6 +25,11 @@ namespace Microsoft.AspNet.PipelineCore public Stream Body { get; set; } + public bool HeadersSent + { + get { return false; } + } + public void OnSendingHeaders(Action callback, object state) { throw new NotSupportedException();