diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.FeatureCollection.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.FeatureCollection.cs index 293c3facc..16c472aac 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.FeatureCollection.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.FeatureCollection.cs @@ -266,15 +266,14 @@ Task IHttpUpgradeFeature.UpgradeAsync() { StatusCode = 101; ReasonPhrase = "Switching Protocols"; - ResponseHeaders["Connection"] = "Upgrade"; - if (!ResponseHeaders.ContainsKey("Upgrade")) + _responseHeaders.HeaderConnection = "Upgrade"; + + if (StringValues.IsNullOrEmpty(_responseHeaders.HeaderUpgrade) && + !StringValues.IsNullOrEmpty(_requestHeaders.HeaderUpgrade)) { - StringValues values; - if (RequestHeaders.TryGetValue("Upgrade", out values)) - { - ResponseHeaders["Upgrade"] = values; - } + _responseHeaders.HeaderUpgrade = _requestHeaders.HeaderUpgrade; } + ProduceStart(); return Task.FromResult(DuplexStream); } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index f772b32da..ede5171ea 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -402,12 +402,16 @@ public void ProduceContinue() { if (_responseStarted) return; - StringValues expect; - if (HttpVersion.Equals("HTTP/1.1") && - RequestHeaders.TryGetValue("Expect", out expect) && - (expect.FirstOrDefault() ?? "").Equals("100-continue", StringComparison.OrdinalIgnoreCase)) + if (HttpVersion.Equals("HTTP/1.1")) { - SocketOutput.Write(_continueBytes); + foreach(var expect in _requestHeaders.HeaderExpect) + { + if (expect.Equals("100-continue", StringComparison.OrdinalIgnoreCase)) + { + SocketOutput.Write(_continueBytes); + return; + } + } } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs index 631c10604..1d7c7693c 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs @@ -23,13 +23,7 @@ public FrameResponseStream(FrameContext context) public override bool CanWrite => true; - public override long Length - { - get - { - throw new NotImplementedException(); - } - } + public override long Length => Position; public override long Position { get; set; } @@ -60,11 +54,13 @@ public override int Read(byte[] buffer, int offset, int count) public override void Write(byte[] buffer, int offset, int count) { + Position += count; _context.FrameControl.Write(new ArraySegment(buffer, offset, count)); } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { + Position += count; return _context.FrameControl.WriteAsync(new ArraySegment(buffer, offset, count), cancellationToken); } } diff --git a/tools/Microsoft.AspNet.Server.Kestrel.GeneratedCode/FrameFeatureCollection.cs b/tools/Microsoft.AspNet.Server.Kestrel.GeneratedCode/FrameFeatureCollection.cs index f8dcf8d92..6eeeca2c9 100644 --- a/tools/Microsoft.AspNet.Server.Kestrel.GeneratedCode/FrameFeatureCollection.cs +++ b/tools/Microsoft.AspNet.Server.Kestrel.GeneratedCode/FrameFeatureCollection.cs @@ -3,7 +3,6 @@ using System.Linq; using Microsoft.AspNet.Http.Features; using Microsoft.Dnx.Compilation.CSharp; -using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Http.Features.Authentication; namespace Microsoft.AspNet.Server.Kestrel.GeneratedCode