From 660babcd7f74b5e5aa672b4891925b006e534645 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 10 Jun 2014 00:28:52 -0700 Subject: [PATCH] Adding core clr configurations --- .../Http/Connection.cs | 4 +-- .../Http/Frame.cs | 2 +- .../Http/FrameDuplexStream.cs | 28 +++++++++++++++++++ .../Http/FrameRequestStream.cs | 2 ++ .../Http/Listener.cs | 2 +- .../Http/MemoryPoolTextWriter.cs | 4 +-- .../Http/SocketOutput.cs | 2 +- .../Infrastructure/KestrelThread.cs | 8 ++++-- .../Networking/UcAsyncHandle.cs | 18 ++++-------- .../Networking/UvMemory.cs | 3 +- .../project.json | 13 +++++++++ .../EngineTests.cs | 16 +++++++++-- .../MessageBodyTests.cs | 1 + .../NetworkingTests.cs | 26 ++++++++--------- .../TestConnection.cs | 6 ++-- .../project.json | 9 +++++- 16 files changed, 101 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs index 7fb9baac3c..039ce58318 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http var self = (Connection)x; var shutdown = new UvShutdownReq(); shutdown.Init(self.Thread.Loop); - shutdown.Shutdown(self._socket, (req, status, state) => req.Close(), null); + shutdown.Shutdown(self._socket, (req, status, state) => req.Dispose(), null); }, this); break; @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http break; case ProduceEndType.SocketDisconnect: Thread.Post( - x => ((UvHandle)x).Close(), + x => ((UvHandle)x).Dispose(), _socket); break; } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index 3d7693802a..c9966e085c 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -454,7 +454,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http static string GetString(ArraySegment range, int startIndex, int endIndex) { - return Encoding.Default.GetString(range.Array, range.Offset + startIndex, endIndex - startIndex); + return Encoding.UTF8.GetString(range.Array, range.Offset + startIndex, endIndex - startIndex); } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameDuplexStream.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameDuplexStream.cs index 7028eacdb4..f129004b51 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameDuplexStream.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameDuplexStream.cs @@ -3,6 +3,8 @@ using System; using System.IO; +using System.Threading; +using System.Threading.Tasks; namespace Microsoft.AspNet.Server.Kestrel.Http { @@ -17,11 +19,13 @@ namespace Microsoft.AspNet.Server.Kestrel.Http _responseStream = responseStream; } +#if NET45 public override void Close() { _requestStream.Close(); _responseStream.Close(); } +#endif protected override void Dispose(bool disposing) { @@ -37,6 +41,12 @@ namespace Microsoft.AspNet.Server.Kestrel.Http _responseStream.Flush(); } + public override Task FlushAsync(CancellationToken cancellationToken) + { + return _responseStream.FlushAsync(cancellationToken); + } + +#if NET45 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { return _requestStream.BeginRead(buffer, offset, count, callback, state); @@ -46,7 +56,19 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { return _requestStream.EndRead(asyncResult); } +#endif + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + return _requestStream.ReadAsync(buffer, offset, count, cancellationToken); + } + + public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) + { + return _requestStream.CopyToAsync(destination, bufferSize, cancellationToken); + } + +#if NET45 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { return _responseStream.BeginWrite(buffer, offset, count, callback, state); @@ -56,6 +78,12 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { _responseStream.EndWrite(asyncResult); } +#endif + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + return _responseStream.WriteAsync(buffer, offset, count, cancellationToken); + } public override long Seek(long offset, SeekOrigin origin) { diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs index cff0776520..b7a219b8d9 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs @@ -41,6 +41,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http return ReadAsync(buffer, offset, count).Result; } +#if NET45 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { var task = ReadAsync(buffer, offset, count, CancellationToken.None, state); @@ -55,6 +56,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { return ((Task)asyncResult).Result; } +#endif public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs index 3114548b81..9bf1413579 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs @@ -90,7 +90,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http private void OnDispose(object listenSocket) { - ((UvHandle)listenSocket).Close(); + ((UvHandle)listenSocket).Dispose(); } } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/MemoryPoolTextWriter.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/MemoryPoolTextWriter.cs index c094178846..54763a0e26 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/MemoryPoolTextWriter.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/MemoryPoolTextWriter.cs @@ -36,14 +36,14 @@ namespace Microsoft.AspNet.Server.Kestrel.Http _memory = memory; _textArray = _memory.AllocChar(_textLength); _dataArray = _memory.Empty; - _encoder = Encoding.Default.GetEncoder(); + _encoder = Encoding.UTF8.GetEncoder(); } public override Encoding Encoding { get { - return Encoding.Default; + return Encoding.UTF8; } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs index db1922cc0a..d3381f22fe 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs @@ -88,7 +88,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { _pin.Free(); //NOTE: pool this? - Close(); + Dispose(); _callback(_state); } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs index b72a99c73c..6929767280 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -45,12 +45,14 @@ namespace Microsoft.AspNet.Server.Kestrel public void Stop(TimeSpan timeout) { Post(OnStop, null); - if (!_thread.Join(timeout)) + if (!_thread.Join((int)timeout.TotalMilliseconds)) { Post(OnStopImmediate, null); - if (!_thread.Join(timeout)) + if (!_thread.Join((int)timeout.TotalMilliseconds)) { +#if NET45 _thread.Abort(); +#endif } } if (_closeError != null) @@ -107,7 +109,7 @@ namespace Microsoft.AspNet.Server.Kestrel var ran2 = _loop.Run(); // delete the last of the unmanaged memory - _loop.Close(); + _loop.Dispose(); } catch (Exception ex) { diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UcAsyncHandle.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UcAsyncHandle.cs index b15e376384..e30cbe63ba 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UcAsyncHandle.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UcAsyncHandle.cs @@ -8,12 +8,6 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking public class UvAsyncHandle : UvHandle { private static Libuv.uv_async_cb _uv_async_cb = AsyncCb; - - unsafe static void AsyncCb(IntPtr handle) - { - FromIntPtr(handle)._callback.Invoke(); - } - private Action _callback; public void Init(UvLoopHandle loop, Action callback) @@ -25,18 +19,18 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking public void DangerousClose() { - Close(); + Dispose(); ReleaseHandle(); } - private void UvAsyncCb(IntPtr handle) - { - _callback.Invoke(); - } - public void Send() { _uv.async_send(this); } + + unsafe static void AsyncCb(IntPtr handle) + { + FromIntPtr(handle)._callback.Invoke(); + } } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs index a970b1e053..661445c2e3 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs @@ -45,9 +45,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking _threadId = loop._threadId; } + public void Validate(bool closed = false) { - Trace.Assert(IsClosed == closed, "Handle is closed"); + Trace.Assert(closed || !IsClosed, "Handle is closed"); Trace.Assert(!IsInvalid, "Handle is invalid"); Trace.Assert(_threadId == Thread.CurrentThread.ManagedThreadId, "ThreadId is correct"); } diff --git a/src/Microsoft.AspNet.Server.Kestrel/project.json b/src/Microsoft.AspNet.Server.Kestrel/project.json index cb7ece47c7..591be84f59 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/project.json +++ b/src/Microsoft.AspNet.Server.Kestrel/project.json @@ -3,6 +3,19 @@ "dependencies": { "Microsoft.AspNet.Hosting": "0.1-*" }, + "configurations": { + "net45": { }, + "k10": { + "dependencies": { + "System.Threading.ThreadPool": "4.0.10.0", + "System.Diagnostics.Debug": "4.0.10.0", + "System.Threading.Thread": "4.0.0.0", + "System.Diagnostics.TraceSource": "4.0.0.0", + "System.Text.Encoding": "4.0.20.0", + "System.Threading.Tasks": "4.0.10.0" + } + } + }, "compilationOptions": { "allowUnsafe": true } diff --git a/test/Microsoft.AspNet.Server.KestralTests/EngineTests.cs b/test/Microsoft.AspNet.Server.KestralTests/EngineTests.cs index bf7ad6678b..56c8e551c1 100644 --- a/test/Microsoft.AspNet.Server.KestralTests/EngineTests.cs +++ b/test/Microsoft.AspNet.Server.KestralTests/EngineTests.cs @@ -256,7 +256,7 @@ Hello World"); engine.Stop(); } - [Fact(Skip = "This is still not working")] + [Fact] public async Task Expect100ContinueForBody() { var engine = new KestrelEngine(); @@ -265,10 +265,20 @@ Hello World"); using (var connection = new TestConnection()) { - await connection.Send("POST / HTTP/1.1", "Expect: 100-continue", "Content-Length: 11", "\r\n"); + await connection.Send( + "POST / HTTP/1.1", + "Expect: 100-continue", + "Content-Length: 11", + "Connection: close", + "\r\n"); await connection.Receive("HTTP/1.1 100 Continue", "\r\n"); await connection.SendEnd("Hello World"); - await connection.ReceiveEnd("HTTP/1.1 200 OK", "Content-Length: 11", "", "Hello World"); + await connection.Receive( + "HTTP/1.1 200 OK", + "Content-Length: 11", + "Connection: close", + "", + "Hello World"); } started.Dispose(); diff --git a/test/Microsoft.AspNet.Server.KestralTests/MessageBodyTests.cs b/test/Microsoft.AspNet.Server.KestralTests/MessageBodyTests.cs index 7f6bec71d6..ea5d2a75ce 100644 --- a/test/Microsoft.AspNet.Server.KestralTests/MessageBodyTests.cs +++ b/test/Microsoft.AspNet.Server.KestralTests/MessageBodyTests.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.Threading; using System.Threading.Tasks; using Xunit; diff --git a/test/Microsoft.AspNet.Server.KestralTests/NetworkingTests.cs b/test/Microsoft.AspNet.Server.KestralTests/NetworkingTests.cs index 4ccd07526c..90860a6a8b 100644 --- a/test/Microsoft.AspNet.Server.KestralTests/NetworkingTests.cs +++ b/test/Microsoft.AspNet.Server.KestralTests/NetworkingTests.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Server.KestralTests var loop = new UvLoopHandle(); loop.Init(_uv); loop.Run(); - loop.Close(); + loop.Dispose(); } [Fact] @@ -42,11 +42,11 @@ namespace Microsoft.AspNet.Server.KestralTests trigger.Init(loop, () => { called = true; - trigger.Close(); + trigger.Dispose(); }); trigger.Send(); loop.Run(); - loop.Close(); + loop.Dispose(); Assert.True(called); } @@ -58,9 +58,9 @@ namespace Microsoft.AspNet.Server.KestralTests var tcp = new UvTcpHandle(); tcp.Init(loop); tcp.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - tcp.Close(); + tcp.Dispose(); loop.Run(); - loop.Close(); + loop.Dispose(); } @@ -77,8 +77,8 @@ namespace Microsoft.AspNet.Server.KestralTests var tcp2 = new UvTcpHandle(); tcp2.Init(loop); stream.Accept(tcp2); - tcp2.Close(); - stream.Close(); + tcp2.Dispose(); + stream.Dispose(); }, null); var t = Task.Run(async () => { @@ -92,10 +92,10 @@ namespace Microsoft.AspNet.Server.KestralTests new IPEndPoint(IPAddress.Loopback, 54321), null, TaskCreationOptions.None); - socket.Close(); + socket.Dispose(); }); loop.Run(); - loop.Close(); + loop.Dispose(); await t; } @@ -122,11 +122,11 @@ namespace Microsoft.AspNet.Server.KestralTests bytesRead += nread; if (nread == 0) { - tcp2.Close(); + tcp2.Dispose(); } }, null); - tcp.Close(); + tcp.Dispose(); }, null); var t = Task.Run(async () => { @@ -147,10 +147,10 @@ namespace Microsoft.AspNet.Server.KestralTests SocketFlags.None, null, TaskCreationOptions.None); - socket.Close(); + socket.Dispose(); }); loop.Run(); - loop.Close(); + loop.Dispose(); await t; } } diff --git a/test/Microsoft.AspNet.Server.KestralTests/TestConnection.cs b/test/Microsoft.AspNet.Server.KestralTests/TestConnection.cs index 353801f3da..a53d2594de 100644 --- a/test/Microsoft.AspNet.Server.KestralTests/TestConnection.cs +++ b/test/Microsoft.AspNet.Server.KestralTests/TestConnection.cs @@ -32,8 +32,8 @@ namespace Microsoft.AspNet.Server.KestralTests } public void Dispose() { - _stream.Close(); - _socket.Close(); + _stream.Dispose(); + _socket.Dispose(); } public async Task Send(params string[] lines) @@ -64,7 +64,7 @@ namespace Microsoft.AspNet.Server.KestralTests while (offset < expected.Length) { var task = _reader.ReadAsync(actual, offset, actual.Length - offset); - Assert.True(task.Wait(1000), "timeout"); +// Assert.True(task.Wait(1000), "timeout"); var count = await task; if (count == 0) { diff --git a/test/Microsoft.AspNet.Server.KestralTests/project.json b/test/Microsoft.AspNet.Server.KestralTests/project.json index 748dedce43..de7c2275d3 100644 --- a/test/Microsoft.AspNet.Server.KestralTests/project.json +++ b/test/Microsoft.AspNet.Server.KestralTests/project.json @@ -9,10 +9,17 @@ "configurations": { "net45": { "compilationOptions": { "define": [ "TRACE" ] } + }, + "k10": { + "compilationOptions": { "define": [ "TRACE" ] }, + "dependencies": { + "System.Net.Sockets": "4.0.0.0", + "System.Runtime.Handles": "4.0.0.0" + } } }, "commands": { - "run": "Xunit.KRunner", + "run": "Xunit.KRunner -trait x=vs", "test": "Xunit.KRunner" } }