From 7484db54c605ad6eb98a3ba0900445953d0fd2ab Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 12 Jun 2014 20:11:12 -0700 Subject: [PATCH] Compile for CoreClr. Seperate Client project. Rename everything. --- CONTRIBUTING.md | 4 + README.md | 9 ++ WebSockets.sln | 63 +++++--- .../Constants.cs | 21 +++ .../Microsoft.AspNet.WebSockets.Client.kproj | 35 +++++ .../WebSocketClient.cs | 15 +- .../project.json | 9 ++ ...crosoft.AspNet.WebSockets.Middleware.kproj | 35 +++++ .../WebSocketMiddleware.cs | 115 ++++++++++++++ .../WebSocketMiddlewareExtensions.cs | 12 ++ .../project.json | 16 ++ .../CommonWebSocket.cs | 7 +- .../Constants.cs | 15 +- .../FrameHeader.cs | 7 +- .../HandshakeHelpers.cs | 142 ++++++++++++++++++ ...Microsoft.AspNet.WebSockets.Protocol.kproj | 37 +++++ .../Project.json | 20 +++ .../Properties/AssemblyInfo.cs | 0 .../Utilities.cs | 7 +- .../Microsoft.Net.WebSockets.kproj | 38 +++++ src/Microsoft.Net.WebSockets/project.json | 6 - ...rosoft.AspNet.WebSockets.Client.Test.kproj | 34 +++++ .../WebSocketClientTests.cs | 6 +- .../project.json | 21 +++ .../BufferStream.cs | 2 +- .../DuplexStream.cs | 2 +- .../DuplexTests.cs | 7 +- ...soft.AspNet.WebSockets.Protocol.Test.kproj | 36 +++++ .../Microsoft.Net.WebSockets.Test.csproj | 0 .../Project.json} | 2 +- .../Properties/AssemblyInfo.cs | 0 .../UtilitiesTests.cs | 7 +- test/TestClient/Program.cs | 33 ++-- test/TestClient/Project.json | 10 ++ test/TestClient/TestClient.csproj | 65 -------- test/TestClient/TestClient.kproj | 34 +++++ 36 files changed, 740 insertions(+), 132 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 README.md create mode 100644 src/Microsoft.AspNet.WebSockets.Client/Constants.cs create mode 100644 src/Microsoft.AspNet.WebSockets.Client/Microsoft.AspNet.WebSockets.Client.kproj rename src/{Microsoft.Net.WebSockets => Microsoft.AspNet.WebSockets.Client}/WebSocketClient.cs (86%) create mode 100644 src/Microsoft.AspNet.WebSockets.Client/project.json create mode 100644 src/Microsoft.AspNet.WebSockets.Middleware/Microsoft.AspNet.WebSockets.Middleware.kproj create mode 100644 src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddleware.cs create mode 100644 src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddlewareExtensions.cs create mode 100644 src/Microsoft.AspNet.WebSockets.Middleware/project.json rename src/{Microsoft.Net.WebSockets => Microsoft.AspNet.WebSockets.Protocol}/CommonWebSocket.cs (98%) rename src/{Microsoft.Net.WebSockets => Microsoft.AspNet.WebSockets.Protocol}/Constants.cs (52%) rename src/{Microsoft.Net.WebSockets => Microsoft.AspNet.WebSockets.Protocol}/FrameHeader.cs (96%) create mode 100644 src/Microsoft.AspNet.WebSockets.Protocol/HandshakeHelpers.cs create mode 100644 src/Microsoft.AspNet.WebSockets.Protocol/Microsoft.AspNet.WebSockets.Protocol.kproj create mode 100644 src/Microsoft.AspNet.WebSockets.Protocol/Project.json rename src/{Microsoft.Net.WebSockets => Microsoft.AspNet.WebSockets.Protocol}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Net.WebSockets => Microsoft.AspNet.WebSockets.Protocol}/Utilities.cs (90%) create mode 100644 src/Microsoft.Net.WebSockets/Microsoft.Net.WebSockets.kproj delete mode 100644 src/Microsoft.Net.WebSockets/project.json create mode 100644 test/Microsoft.AspNet.WebSockets.Client.Test/Microsoft.AspNet.WebSockets.Client.Test.kproj rename test/{Microsoft.Net.WebSockets.Test => Microsoft.AspNet.WebSockets.Client.Test}/WebSocketClientTests.cs (99%) create mode 100644 test/Microsoft.AspNet.WebSockets.Client.Test/project.json rename test/{Microsoft.Net.WebSockets.Test => Microsoft.AspNet.WebSockets.Protocol.Test}/BufferStream.cs (99%) rename test/{Microsoft.Net.WebSockets.Test => Microsoft.AspNet.WebSockets.Protocol.Test}/DuplexStream.cs (98%) rename test/{Microsoft.Net.WebSockets.Test => Microsoft.AspNet.WebSockets.Protocol.Test}/DuplexTests.cs (92%) create mode 100644 test/Microsoft.AspNet.WebSockets.Protocol.Test/Microsoft.AspNet.WebSockets.Protocol.Test.kproj rename test/{Microsoft.Net.WebSockets.Test => Microsoft.AspNet.WebSockets.Protocol.Test}/Microsoft.Net.WebSockets.Test.csproj (100%) rename test/{Microsoft.Net.WebSockets.Test/project.json => Microsoft.AspNet.WebSockets.Protocol.Test/Project.json} (89%) rename test/{Microsoft.Net.WebSockets.Test => Microsoft.AspNet.WebSockets.Protocol.Test}/Properties/AssemblyInfo.cs (100%) rename test/{Microsoft.Net.WebSockets.Test => Microsoft.AspNet.WebSockets.Protocol.Test}/UtilitiesTests.cs (65%) create mode 100644 test/TestClient/Project.json delete mode 100644 test/TestClient/TestClient.csproj create mode 100644 test/TestClient/TestClient.kproj diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..eac4268e4c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,4 @@ +Contributing +====== + +Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..2a9add8342 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +WebSockets +================ + +Contains a managed implementation of the WebSocket protocol, along with client and server integration components. + +This project is part of ASP.NET vNext. You can find samples, documentation and getting started instructions for ASP.NET vNext at the [Home](https://github.com/aspnet/home) repo. + + + diff --git a/WebSockets.sln b/WebSockets.sln index c2f3292dcd..fcae05ecd2 100644 --- a/WebSockets.sln +++ b/WebSockets.sln @@ -1,10 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30313.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.21730.1 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestClient", "test\TestClient\TestClient.csproj", "{22AB02E0-0346-4C4B-BBE7-C829A8D1C19E}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestServer", "test\TestServer\TestServer.csproj", "{4E5F5FCC-172C-44D9-BEA0-39098A79CD0B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{2C7947A5-9FBD-4267-97C1-2D726D7B3BAF}" @@ -13,9 +11,17 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{C45106D0-7 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Net.WebSockets.net45", "src\Microsoft.Net.WebSockets\Microsoft.Net.WebSockets.net45.csproj", "{B43D2069-9690-49B2-BA0C-9E8ACC32CB83}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebSockets.Protocol", "src\Microsoft.AspNet.WebSockets.Protocol\Microsoft.AspNet.WebSockets.Protocol.kproj", "{E0C10DEC-3339-4A47-85BC-3100C5D34AD4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Net.WebSockets.Test.net45", "test\Microsoft.Net.WebSockets.Test\Microsoft.Net.WebSockets.Test.net45.csproj", "{DA755E15-86B8-4E9C-A3B0-B2D95E3646B5}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebSockets.Protocol.Test", "test\Microsoft.AspNet.WebSockets.Protocol.Test\Microsoft.AspNet.WebSockets.Protocol.Test.kproj", "{62A07A24-4D06-4DDA-B6BF-02D0C9CB7D32}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "TestClient", "test\TestClient\TestClient.kproj", "{8C8EAC01-DC49-4C5E-B348-E4E46FE675F9}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebSockets.Client", "src\Microsoft.AspNet.WebSockets.Client\Microsoft.AspNet.WebSockets.Client.kproj", "{4A1C4875-AE21-4A78-979A-F0E4DF5EB518}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebSockets.Client.Test", "test\Microsoft.AspNet.WebSockets.Client.Test\Microsoft.AspNet.WebSockets.Client.Test.kproj", "{6604D154-817F-4BC5-BE95-FF7E851179D9}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebSockets.Middleware", "src\Microsoft.AspNet.WebSockets.Middleware\Microsoft.AspNet.WebSockets.Middleware.kproj", "{78A097D0-C0A4-4AED-93E2-84A65392FB52}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -23,30 +29,45 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {22AB02E0-0346-4C4B-BBE7-C829A8D1C19E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {22AB02E0-0346-4C4B-BBE7-C829A8D1C19E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {22AB02E0-0346-4C4B-BBE7-C829A8D1C19E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {22AB02E0-0346-4C4B-BBE7-C829A8D1C19E}.Release|Any CPU.Build.0 = Release|Any CPU {4E5F5FCC-172C-44D9-BEA0-39098A79CD0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4E5F5FCC-172C-44D9-BEA0-39098A79CD0B}.Debug|Any CPU.Build.0 = Debug|Any CPU {4E5F5FCC-172C-44D9-BEA0-39098A79CD0B}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E5F5FCC-172C-44D9-BEA0-39098A79CD0B}.Release|Any CPU.Build.0 = Release|Any CPU - {B43D2069-9690-49B2-BA0C-9E8ACC32CB83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B43D2069-9690-49B2-BA0C-9E8ACC32CB83}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B43D2069-9690-49B2-BA0C-9E8ACC32CB83}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B43D2069-9690-49B2-BA0C-9E8ACC32CB83}.Release|Any CPU.Build.0 = Release|Any CPU - {DA755E15-86B8-4E9C-A3B0-B2D95E3646B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA755E15-86B8-4E9C-A3B0-B2D95E3646B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA755E15-86B8-4E9C-A3B0-B2D95E3646B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA755E15-86B8-4E9C-A3B0-B2D95E3646B5}.Release|Any CPU.Build.0 = Release|Any CPU + {E0C10DEC-3339-4A47-85BC-3100C5D34AD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0C10DEC-3339-4A47-85BC-3100C5D34AD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0C10DEC-3339-4A47-85BC-3100C5D34AD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0C10DEC-3339-4A47-85BC-3100C5D34AD4}.Release|Any CPU.Build.0 = Release|Any CPU + {62A07A24-4D06-4DDA-B6BF-02D0C9CB7D32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {62A07A24-4D06-4DDA-B6BF-02D0C9CB7D32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62A07A24-4D06-4DDA-B6BF-02D0C9CB7D32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {62A07A24-4D06-4DDA-B6BF-02D0C9CB7D32}.Release|Any CPU.Build.0 = Release|Any CPU + {8C8EAC01-DC49-4C5E-B348-E4E46FE675F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C8EAC01-DC49-4C5E-B348-E4E46FE675F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C8EAC01-DC49-4C5E-B348-E4E46FE675F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C8EAC01-DC49-4C5E-B348-E4E46FE675F9}.Release|Any CPU.Build.0 = Release|Any CPU + {4A1C4875-AE21-4A78-979A-F0E4DF5EB518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A1C4875-AE21-4A78-979A-F0E4DF5EB518}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A1C4875-AE21-4A78-979A-F0E4DF5EB518}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A1C4875-AE21-4A78-979A-F0E4DF5EB518}.Release|Any CPU.Build.0 = Release|Any CPU + {6604D154-817F-4BC5-BE95-FF7E851179D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6604D154-817F-4BC5-BE95-FF7E851179D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6604D154-817F-4BC5-BE95-FF7E851179D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6604D154-817F-4BC5-BE95-FF7E851179D9}.Release|Any CPU.Build.0 = Release|Any CPU + {78A097D0-C0A4-4AED-93E2-84A65392FB52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78A097D0-C0A4-4AED-93E2-84A65392FB52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78A097D0-C0A4-4AED-93E2-84A65392FB52}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78A097D0-C0A4-4AED-93E2-84A65392FB52}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {22AB02E0-0346-4C4B-BBE7-C829A8D1C19E} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} {4E5F5FCC-172C-44D9-BEA0-39098A79CD0B} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} - {B43D2069-9690-49B2-BA0C-9E8ACC32CB83} = {2C7947A5-9FBD-4267-97C1-2D726D7B3BAF} - {DA755E15-86B8-4E9C-A3B0-B2D95E3646B5} = {C45106D0-76C8-4776-A140-F7DD83CA2958} + {E0C10DEC-3339-4A47-85BC-3100C5D34AD4} = {2C7947A5-9FBD-4267-97C1-2D726D7B3BAF} + {62A07A24-4D06-4DDA-B6BF-02D0C9CB7D32} = {C45106D0-76C8-4776-A140-F7DD83CA2958} + {8C8EAC01-DC49-4C5E-B348-E4E46FE675F9} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} + {4A1C4875-AE21-4A78-979A-F0E4DF5EB518} = {2C7947A5-9FBD-4267-97C1-2D726D7B3BAF} + {6604D154-817F-4BC5-BE95-FF7E851179D9} = {C45106D0-76C8-4776-A140-F7DD83CA2958} + {78A097D0-C0A4-4AED-93E2-84A65392FB52} = {2C7947A5-9FBD-4267-97C1-2D726D7B3BAF} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.WebSockets.Client/Constants.cs b/src/Microsoft.AspNet.WebSockets.Client/Constants.cs new file mode 100644 index 0000000000..0178e7d75f --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Client/Constants.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.WebSockets.Client +{ + public static class Constants + { + public static class Headers + { + public const string Upgrade = "Upgrade"; + public const string UpgradeWebSocket = "websocket"; + public const string Connection = "Connection"; + public const string ConnectionUpgrade = "Upgrade"; + public const string SecWebSocketKey = "Sec-WebSocket-Key"; + public const string SecWebSocketVersion = "Sec-WebSocket-Version"; + public const string SecWebSocketProtocol = "Sec-WebSocket-Protocol"; + public const string SecWebSocketAccept = "Sec-WebSocket-Accept"; + public const string SupportedVersion = "13"; + } + } +} diff --git a/src/Microsoft.AspNet.WebSockets.Client/Microsoft.AspNet.WebSockets.Client.kproj b/src/Microsoft.AspNet.WebSockets.Client/Microsoft.AspNet.WebSockets.Client.kproj new file mode 100644 index 0000000000..cbb9475cbe --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Client/Microsoft.AspNet.WebSockets.Client.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + 4a1c4875-ae21-4a78-979a-f0e4df5eb518 + Library + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.Net.WebSockets/WebSocketClient.cs b/src/Microsoft.AspNet.WebSockets.Client/WebSocketClient.cs similarity index 86% rename from src/Microsoft.Net.WebSockets/WebSocketClient.cs rename to src/Microsoft.AspNet.WebSockets.Client/WebSocketClient.cs index ca77944110..f886e53987 100644 --- a/src/Microsoft.Net.WebSockets/WebSocketClient.cs +++ b/src/Microsoft.AspNet.WebSockets.Client/WebSocketClient.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. 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.Linq; @@ -6,8 +9,9 @@ using System.Net; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.WebSockets.Protocol; -namespace Microsoft.Net.WebSockets.Client +namespace Microsoft.AspNet.WebSockets.Client { public class WebSocketClient { @@ -94,10 +98,11 @@ namespace Microsoft.Net.WebSockets.Client } // TODO: Validate handshake - if (response.StatusCode != HttpStatusCode.SwitchingProtocols) + HttpStatusCode statusCode = response.StatusCode; + if (statusCode != HttpStatusCode.SwitchingProtocols) { response.Dispose(); - throw new InvalidOperationException("Incomplete handshake, invalid status code: " + response.StatusCode); + throw new InvalidOperationException("Incomplete handshake, invalid status code: " + statusCode); } // TODO: Validate Sec-WebSocket-Key/Sec-WebSocket-Accept @@ -112,4 +117,4 @@ namespace Microsoft.Net.WebSockets.Client return CommonWebSocket.CreateClientWebSocket(stream, subProtocol, KeepAliveInterval, ReceiveBufferSize, useZeroMask: UseZeroMask); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebSockets.Client/project.json b/src/Microsoft.AspNet.WebSockets.Client/project.json new file mode 100644 index 0000000000..693ed10e9e --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Client/project.json @@ -0,0 +1,9 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.WebSockets.Protocol": "" + }, + "configurations": { + "net45": { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebSockets.Middleware/Microsoft.AspNet.WebSockets.Middleware.kproj b/src/Microsoft.AspNet.WebSockets.Middleware/Microsoft.AspNet.WebSockets.Middleware.kproj new file mode 100644 index 0000000000..45d5fac74c --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Middleware/Microsoft.AspNet.WebSockets.Middleware.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + 78a097d0-c0a4-4aed-93e2-84a65392fb52 + Library + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddleware.cs b/src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddleware.cs new file mode 100644 index 0000000000..4407194370 --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddleware.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.WebSockets; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.WebSockets.Protocol; + +namespace Microsoft.AspNet.WebSockets.Middleware +{ + public class WebSocketMiddleware + { + private RequestDelegate _next; + + public WebSocketMiddleware(RequestDelegate next) + { + _next = next; + } + + public Task Invoke(HttpContext context) + { + // Detect if an opaque upgrade is available, and if websocket upgrade headers are present. + // If so, add a websocket upgrade. + var upgradeFeature = context.GetFeature(); + if (upgradeFeature != null) + { + context.SetFeature(new UpgradeHandshake(context, upgradeFeature)); + } + + return _next(context); + } + + private class UpgradeHandshake : IHttpWebSocketFeature + { + private HttpContext _context; + private IHttpOpaqueUpgradeFeature _upgradeFeature; + + public UpgradeHandshake(HttpContext context, IHttpOpaqueUpgradeFeature upgradeFeature) + { + _context = context; + _upgradeFeature = upgradeFeature; + } + + public bool IsWebSocketRequest + { + get + { + if (!_upgradeFeature.IsUpgradableRequest) + { + return false; + } + var headers = new List>(); + foreach (string headerName in HandshakeHelpers.NeededHeaders) + { + foreach (var value in _context.Request.Headers.GetCommaSeparatedValues(headerName)) + { + headers.Add(new KeyValuePair(headerName, value)); + } + } + return HandshakeHelpers.CheckSupportedWebSocketRequest(_context.Request.Method, headers); + } + } + + public async Task AcceptAsync(IWebSocketAcceptContext acceptContext) + { + if (!IsWebSocketRequest) + { + throw new InvalidOperationException("Not a WebSocket request."); + } + + string subProtocol = null; + if (acceptContext != null) + { + subProtocol = acceptContext.SubProtocol; + } + + TimeSpan keepAliveInterval = TimeSpan.FromMinutes(2); // TODO: + int receiveBufferSize = 4 * 1024; // TODO: + var advancedAcceptContext = acceptContext as WebSocketAcceptContext; + if (advancedAcceptContext != null) + { + if (advancedAcceptContext.ReceiveBufferSize.HasValue) + { + receiveBufferSize = advancedAcceptContext.ReceiveBufferSize.Value; + } + if (advancedAcceptContext.KeepAliveInterval.HasValue) + { + keepAliveInterval = advancedAcceptContext.KeepAliveInterval.Value; + } + } + + string key = string.Join(", ", _context.Request.Headers[Constants.Headers.SecWebSocketKey]); + + var responseHeaders = HandshakeHelpers.GenerateResponseHeaders(key, subProtocol); + foreach (var headerPair in responseHeaders) + { + _context.Response.Headers[headerPair.Key] = headerPair.Value; + } + Stream opaqueTransport = await _upgradeFeature.UpgradeAsync(); // Sets status code to 101 + + return CommonWebSocket.CreateServerWebSocket(opaqueTransport, subProtocol, keepAliveInterval, receiveBufferSize); + } + } + + public class WebSocketAcceptContext : IWebSocketAcceptContext + { + public string SubProtocol { get; set; } + public int? ReceiveBufferSize { get; set; } + public TimeSpan? KeepAliveInterval { get; set; } + // public ArraySegment? Buffer { get; set; } // TODO + } + } +} diff --git a/src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddlewareExtensions.cs b/src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddlewareExtensions.cs new file mode 100644 index 0000000000..ee0e3eb764 --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Middleware/WebSocketMiddlewareExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNet.WebSockets.Middleware; + +namespace Microsoft.AspNet.Builder +{ + public static class WebSocketMiddlewareExtensions + { + public static IBuilder UseWebSockets(this IBuilder builder) + { + return builder.Use(next => new WebSocketMiddleware(next).Invoke); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebSockets.Middleware/project.json b/src/Microsoft.AspNet.WebSockets.Middleware/project.json new file mode 100644 index 0000000000..4d125efcb2 --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Middleware/project.json @@ -0,0 +1,16 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Http": "0.1-alpha-*", + "Microsoft.AspNet.HttpFeature": "0.1-alpha-*", + "Microsoft.AspNet.WebSockets.Protocol": "" + }, + "configurations" : { + "net45" : { }, + "k10" : { + "dependencies": { + "System.Runtime": "4.0.20.0" + } + } + } +} diff --git a/src/Microsoft.Net.WebSockets/CommonWebSocket.cs b/src/Microsoft.AspNet.WebSockets.Protocol/CommonWebSocket.cs similarity index 98% rename from src/Microsoft.Net.WebSockets/CommonWebSocket.cs rename to src/Microsoft.AspNet.WebSockets.Protocol/CommonWebSocket.cs index cbad809539..a5149a128f 100644 --- a/src/Microsoft.Net.WebSockets/CommonWebSocket.cs +++ b/src/Microsoft.AspNet.WebSockets.Protocol/CommonWebSocket.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. 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.Diagnostics.Contracts; using System.IO; using System.Net.WebSockets; @@ -6,7 +9,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.Net.WebSockets +namespace Microsoft.AspNet.WebSockets.Protocol { // https://tools.ietf.org/html/rfc6455 public class CommonWebSocket : WebSocket diff --git a/src/Microsoft.Net.WebSockets/Constants.cs b/src/Microsoft.AspNet.WebSockets.Protocol/Constants.cs similarity index 52% rename from src/Microsoft.Net.WebSockets/Constants.cs rename to src/Microsoft.AspNet.WebSockets.Protocol/Constants.cs index 6877c70d0b..07756e49e3 100644 --- a/src/Microsoft.Net.WebSockets/Constants.cs +++ b/src/Microsoft.AspNet.WebSockets.Protocol/Constants.cs @@ -1,17 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.Net.WebSockets +namespace Microsoft.AspNet.WebSockets.Protocol { public static class Constants { public static class Headers { + public const string Upgrade = "Upgrade"; + public const string UpgradeWebSocket = "websocket"; + public const string Connection = "Connection"; + public const string ConnectionUpgrade = "Upgrade"; + public const string SecWebSocketKey = "Sec-WebSocket-Key"; public const string SecWebSocketVersion = "Sec-WebSocket-Version"; public const string SecWebSocketProtocol = "Sec-WebSocket-Protocol"; + public const string SecWebSocketAccept = "Sec-WebSocket-Accept"; public const string SupportedVersion = "13"; } diff --git a/src/Microsoft.Net.WebSockets/FrameHeader.cs b/src/Microsoft.AspNet.WebSockets.Protocol/FrameHeader.cs similarity index 96% rename from src/Microsoft.Net.WebSockets/FrameHeader.cs rename to src/Microsoft.AspNet.WebSockets.Protocol/FrameHeader.cs index 35e54c7233..1307c69fd7 100644 --- a/src/Microsoft.Net.WebSockets/FrameHeader.cs +++ b/src/Microsoft.AspNet.WebSockets.Protocol/FrameHeader.cs @@ -1,11 +1,14 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. 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.Linq; using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; -namespace Microsoft.Net.WebSockets +namespace Microsoft.AspNet.WebSockets.Protocol { public class FrameHeader { diff --git a/src/Microsoft.AspNet.WebSockets.Protocol/HandshakeHelpers.cs b/src/Microsoft.AspNet.WebSockets.Protocol/HandshakeHelpers.cs new file mode 100644 index 0000000000..f8e3c22712 --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Protocol/HandshakeHelpers.cs @@ -0,0 +1,142 @@ +// Copyright (c) Microsoft Open Technologies, Inc. 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.Security.Cryptography; +using System.Text; + +namespace Microsoft.AspNet.WebSockets.Protocol +{ + public static class HandshakeHelpers + { + /// + /// Gets request headers needed process the handshake on the server. + /// + public static IEnumerable NeededHeaders + { + get + { + return new[] + { + Constants.Headers.Upgrade, + Constants.Headers.Connection, + Constants.Headers.SecWebSocketKey, + Constants.Headers.SecWebSocketVersion + }; + } + } + + // Verify Method, Upgrade, Connection, version, key, etc.. + public static bool CheckSupportedWebSocketRequest(string method, IEnumerable> headers) + { + bool validUpgrade = false, validConnection = false, validKey = false, validVersion = false; + + if (!string.Equals("GET", method, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + foreach (var pair in headers) + { + if (string.Equals(Constants.Headers.Connection, pair.Key, StringComparison.OrdinalIgnoreCase)) + { + if (string.Equals(Constants.Headers.ConnectionUpgrade, pair.Value, StringComparison.OrdinalIgnoreCase)) + { + validConnection = true; + } + } + else if (string.Equals(Constants.Headers.Upgrade, pair.Key, StringComparison.OrdinalIgnoreCase)) + { + if (string.Equals(Constants.Headers.UpgradeWebSocket, pair.Value, StringComparison.OrdinalIgnoreCase)) + { + validUpgrade = true; + } + } + else if (string.Equals(Constants.Headers.SecWebSocketVersion, pair.Key, StringComparison.OrdinalIgnoreCase)) + { + if (string.Equals(Constants.Headers.SupportedVersion, pair.Value, StringComparison.OrdinalIgnoreCase)) + { + validVersion = true; + } + } + else if (string.Equals(Constants.Headers.SecWebSocketKey, pair.Key, StringComparison.OrdinalIgnoreCase)) + { + validKey = IsRequestKeyValid(pair.Value); + } + } + + return validConnection && validUpgrade && validVersion && validKey; + } + + public static IEnumerable> GenerateResponseHeaders(string key, string subProtocol) + { + yield return new KeyValuePair(Constants.Headers.Connection, Constants.Headers.ConnectionUpgrade); + yield return new KeyValuePair(Constants.Headers.Upgrade, Constants.Headers.UpgradeWebSocket); + yield return new KeyValuePair(Constants.Headers.SecWebSocketAccept, CreateResponseKey(key)); + if (!string.IsNullOrWhiteSpace(subProtocol)) + { + yield return new KeyValuePair(Constants.Headers.SecWebSocketProtocol, subProtocol); + } + } + + /// + /// Validates the Sec-WebSocket-Key request header + /// "The value of this header field MUST be a nonce consisting of a randomly selected 16-byte value that has been base64-encoded." + /// + /// + /// + public static bool IsRequestKeyValid(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return false; + } + try + { + byte[] data = Convert.FromBase64String(value); + return data.Length == 16; + } + catch (Exception) + { + return false; + } + } + + public static bool IsResponseKeyValid(string value) + { + throw new NotImplementedException(); + } + + /// + /// "The value of this header field MUST be a nonce consisting of a randomly selected 16-byte value that has been base64-encoded." + /// + /// + public static string CreateRequestKey() + { + throw new NotImplementedException(); + } + + /// + /// "...the base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-Key| (as a string, not base64-decoded) with the string + /// '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'" + /// + /// + /// + public static string CreateResponseKey(string requestKey) + { + if (string.IsNullOrWhiteSpace(requestKey)) + { + throw new ArgumentNullException("requestKey"); + } + + using (var algorithm = SHA1.Create()) + { + string merged = requestKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + byte[] mergedBytes = Encoding.UTF8.GetBytes(merged); + byte[] hashedBytes = algorithm.ComputeHash(mergedBytes); + return Convert.ToBase64String(hashedBytes); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebSockets.Protocol/Microsoft.AspNet.WebSockets.Protocol.kproj b/src/Microsoft.AspNet.WebSockets.Protocol/Microsoft.AspNet.WebSockets.Protocol.kproj new file mode 100644 index 0000000000..6293d3e4f1 --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Protocol/Microsoft.AspNet.WebSockets.Protocol.kproj @@ -0,0 +1,37 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + e0c10dec-3339-4a47-85bc-3100c5d34ad4 + Library + + + ConsoleDebugger + + + WebDebugger + + + + + + + 2.0 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebSockets.Protocol/Project.json b/src/Microsoft.AspNet.WebSockets.Protocol/Project.json new file mode 100644 index 0000000000..8bace8ef52 --- /dev/null +++ b/src/Microsoft.AspNet.WebSockets.Protocol/Project.json @@ -0,0 +1,20 @@ +{ + "version": "0.1-alpha-*", + "configurations": { + "net45": { }, + "k10": { + "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", + "System.Diagnostics.Contracts": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.InteropServices": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Security.Cryptography.HashAlgorithms.SHA1": "4.0.0.0", + "System.Threading": "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0", + "System.Threading.Timer": "4.0.0.0" + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.WebSockets/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.WebSockets.Protocol/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Net.WebSockets/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.WebSockets.Protocol/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Net.WebSockets/Utilities.cs b/src/Microsoft.AspNet.WebSockets.Protocol/Utilities.cs similarity index 90% rename from src/Microsoft.Net.WebSockets/Utilities.cs rename to src/Microsoft.AspNet.WebSockets.Protocol/Utilities.cs index c478b4140e..a48a5a184b 100644 --- a/src/Microsoft.Net.WebSockets/Utilities.cs +++ b/src/Microsoft.AspNet.WebSockets.Protocol/Utilities.cs @@ -1,7 +1,10 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. 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.Net.WebSockets; -namespace Microsoft.Net.WebSockets +namespace Microsoft.AspNet.WebSockets.Protocol { public static class Utilities { diff --git a/src/Microsoft.Net.WebSockets/Microsoft.Net.WebSockets.kproj b/src/Microsoft.Net.WebSockets/Microsoft.Net.WebSockets.kproj new file mode 100644 index 0000000000..01bea96825 --- /dev/null +++ b/src/Microsoft.Net.WebSockets/Microsoft.Net.WebSockets.kproj @@ -0,0 +1,38 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + e0c10dec-3339-4a47-85bc-3100c5d34ad4 + Library + + + ConsoleDebugger + + + WebDebugger + + + + + + + 2.0 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.Net.WebSockets/project.json b/src/Microsoft.Net.WebSockets/project.json deleted file mode 100644 index 80f3c5a063..0000000000 --- a/src/Microsoft.Net.WebSockets/project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "0.1-alpha-*", - "configurations": { - "net45": { } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebSockets.Client.Test/Microsoft.AspNet.WebSockets.Client.Test.kproj b/test/Microsoft.AspNet.WebSockets.Client.Test/Microsoft.AspNet.WebSockets.Client.Test.kproj new file mode 100644 index 0000000000..93d5ef5be4 --- /dev/null +++ b/test/Microsoft.AspNet.WebSockets.Client.Test/Microsoft.AspNet.WebSockets.Client.Test.kproj @@ -0,0 +1,34 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + 6604d154-817f-4bc5-be95-ff7e851179d9 + Library + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.Net.WebSockets.Test/WebSocketClientTests.cs b/test/Microsoft.AspNet.WebSockets.Client.Test/WebSocketClientTests.cs similarity index 99% rename from test/Microsoft.Net.WebSockets.Test/WebSocketClientTests.cs rename to test/Microsoft.AspNet.WebSockets.Client.Test/WebSocketClientTests.cs index b0a9779c82..23cf33bee0 100644 --- a/test/Microsoft.Net.WebSockets.Test/WebSocketClientTests.cs +++ b/test/Microsoft.AspNet.WebSockets.Client.Test/WebSocketClientTests.cs @@ -1,4 +1,6 @@ -using Microsoft.Net.WebSockets.Client; +// Copyright (c) Microsoft Open Technologies, Inc. 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.Net; using System.Net.WebSockets; @@ -7,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Xunit; -namespace Microsoft.Net.WebSockets.Test +namespace Microsoft.AspNet.WebSockets.Client.Test { public class WebSocketClientTests { diff --git a/test/Microsoft.AspNet.WebSockets.Client.Test/project.json b/test/Microsoft.AspNet.WebSockets.Client.Test/project.json new file mode 100644 index 0000000000..78a038c2f1 --- /dev/null +++ b/test/Microsoft.AspNet.WebSockets.Client.Test/project.json @@ -0,0 +1,21 @@ +{ + "dependencies": { + "Microsoft.AspNet.WebSockets.Protocol": "", + "Microsoft.AspNet.WebSockets.Client": "", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" + }, + "configurations": { + "net45": { + "dependencies": { + "System.Runtime" : "" + } + } + }, + "commands": { + "test": "Xunit.KRunner" + } +} \ No newline at end of file diff --git a/test/Microsoft.Net.WebSockets.Test/BufferStream.cs b/test/Microsoft.AspNet.WebSockets.Protocol.Test/BufferStream.cs similarity index 99% rename from test/Microsoft.Net.WebSockets.Test/BufferStream.cs rename to test/Microsoft.AspNet.WebSockets.Protocol.Test/BufferStream.cs index de2c308f14..604aea7671 100644 --- a/test/Microsoft.Net.WebSockets.Test/BufferStream.cs +++ b/test/Microsoft.AspNet.WebSockets.Protocol.Test/BufferStream.cs @@ -8,7 +8,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.Net.WebSockets.Test +namespace Microsoft.AspNet.WebSockets.Protocol.Test { // This steam accepts writes from one side, buffers them internally, and returns the data via Reads // when requested on the other side. diff --git a/test/Microsoft.Net.WebSockets.Test/DuplexStream.cs b/test/Microsoft.AspNet.WebSockets.Protocol.Test/DuplexStream.cs similarity index 98% rename from test/Microsoft.Net.WebSockets.Test/DuplexStream.cs rename to test/Microsoft.AspNet.WebSockets.Protocol.Test/DuplexStream.cs index 7cd19c17f8..bfada4b0ab 100644 --- a/test/Microsoft.Net.WebSockets.Test/DuplexStream.cs +++ b/test/Microsoft.AspNet.WebSockets.Protocol.Test/DuplexStream.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.Net.WebSockets.Test +namespace Microsoft.AspNet.WebSockets.Protocol.Test { // A duplex wrapper around a read and write stream. public class DuplexStream : Stream diff --git a/test/Microsoft.Net.WebSockets.Test/DuplexTests.cs b/test/Microsoft.AspNet.WebSockets.Protocol.Test/DuplexTests.cs similarity index 92% rename from test/Microsoft.Net.WebSockets.Test/DuplexTests.cs rename to test/Microsoft.AspNet.WebSockets.Protocol.Test/DuplexTests.cs index 117c233e88..5e0c4473dd 100644 --- a/test/Microsoft.Net.WebSockets.Test/DuplexTests.cs +++ b/test/Microsoft.AspNet.WebSockets.Protocol.Test/DuplexTests.cs @@ -1,11 +1,14 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. 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.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; using Xunit; -namespace Microsoft.Net.WebSockets.Test +namespace Microsoft.AspNet.WebSockets.Protocol.Test { public class DuplexTests { diff --git a/test/Microsoft.AspNet.WebSockets.Protocol.Test/Microsoft.AspNet.WebSockets.Protocol.Test.kproj b/test/Microsoft.AspNet.WebSockets.Protocol.Test/Microsoft.AspNet.WebSockets.Protocol.Test.kproj new file mode 100644 index 0000000000..651c44174e --- /dev/null +++ b/test/Microsoft.AspNet.WebSockets.Protocol.Test/Microsoft.AspNet.WebSockets.Protocol.Test.kproj @@ -0,0 +1,36 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 62a07a24-4d06-4dda-b6bf-02d0c9cb7d32 + Library + + + ConsoleDebugger + + + WebDebugger + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.Net.WebSockets.Test/Microsoft.Net.WebSockets.Test.csproj b/test/Microsoft.AspNet.WebSockets.Protocol.Test/Microsoft.Net.WebSockets.Test.csproj similarity index 100% rename from test/Microsoft.Net.WebSockets.Test/Microsoft.Net.WebSockets.Test.csproj rename to test/Microsoft.AspNet.WebSockets.Protocol.Test/Microsoft.Net.WebSockets.Test.csproj diff --git a/test/Microsoft.Net.WebSockets.Test/project.json b/test/Microsoft.AspNet.WebSockets.Protocol.Test/Project.json similarity index 89% rename from test/Microsoft.Net.WebSockets.Test/project.json rename to test/Microsoft.AspNet.WebSockets.Protocol.Test/Project.json index 29babc3ba7..bd91f51336 100644 --- a/test/Microsoft.Net.WebSockets.Test/project.json +++ b/test/Microsoft.AspNet.WebSockets.Protocol.Test/Project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.Net.WebSockets": "", + "Microsoft.AspNet.WebSockets.Protocol": "", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", diff --git a/test/Microsoft.Net.WebSockets.Test/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.WebSockets.Protocol.Test/Properties/AssemblyInfo.cs similarity index 100% rename from test/Microsoft.Net.WebSockets.Test/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNet.WebSockets.Protocol.Test/Properties/AssemblyInfo.cs diff --git a/test/Microsoft.Net.WebSockets.Test/UtilitiesTests.cs b/test/Microsoft.AspNet.WebSockets.Protocol.Test/UtilitiesTests.cs similarity index 65% rename from test/Microsoft.Net.WebSockets.Test/UtilitiesTests.cs rename to test/Microsoft.AspNet.WebSockets.Protocol.Test/UtilitiesTests.cs index 0a218308c8..ca07522b04 100644 --- a/test/Microsoft.Net.WebSockets.Test/UtilitiesTests.cs +++ b/test/Microsoft.AspNet.WebSockets.Protocol.Test/UtilitiesTests.cs @@ -1,8 +1,11 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. 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.Text; using Xunit; -namespace Microsoft.Net.WebSockets.Test +namespace Microsoft.AspNet.WebSockets.Protocol.Test { public class UtilitiesTests { diff --git a/test/TestClient/Program.cs b/test/TestClient/Program.cs index ac36c45d96..a268f1000e 100644 --- a/test/TestClient/Program.cs +++ b/test/TestClient/Program.cs @@ -1,11 +1,9 @@ -using Microsoft.Net.WebSockets.Client; -using System; -using System.Collections.Generic; -using System.Linq; +using System; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.WebSockets.Client; namespace TestClient { @@ -13,32 +11,39 @@ namespace TestClient { static void Main(string[] args) { - Console.WriteLine("Waiting to start"); - Console.ReadKey(); - RunTestAsync().Wait(); + try + { + Console.WriteLine("Waiting to start"); + Console.ReadKey(); + RunTestAsync().Wait(); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } } private static async Task RunTestAsync() { WebSocketClient client = new WebSocketClient(); - WebSocket socket = await client.ConnectAsync(new Uri("ws://chrross-togo:12345/"), CancellationToken.None); - byte[] data = Encoding.UTF8.GetBytes( + WebSocket socket = await client.ConnectAsync(new Uri("ws://localhost:8080/"), CancellationToken.None); + byte[] data = new byte[100]; // Encoding.UTF8.GetBytes( // TODO: Hangs after 10 seconds // "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World" // "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, " // "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, " - "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, " - ); + // "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, " + // ); while (true) { - await socket.SendAsync(new ArraySegment(data), WebSocketMessageType.Text, true, CancellationToken.None); + // await socket.SendAsync(new ArraySegment(data), WebSocketMessageType.Text, true, CancellationToken.None); WebSocketReceiveResult result; do { result = await socket.ReceiveAsync(new ArraySegment(data), CancellationToken.None); - // Console.WriteLine("Received: " + result.MessageType + ", " + result.Count + ", " + result.EndOfMessage); + Console.WriteLine("Received: " + result.MessageType + ", " + result.Count + ", " + result.EndOfMessage); } while (!result.EndOfMessage); - // Console.WriteLine(Encoding.UTF8.GetString(data, 0, result.Count)); + Console.WriteLine(Encoding.UTF8.GetString(data, 0, result.Count)); } await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); } diff --git a/test/TestClient/Project.json b/test/TestClient/Project.json new file mode 100644 index 0000000000..f0b9935396 --- /dev/null +++ b/test/TestClient/Project.json @@ -0,0 +1,10 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.WebSockets.Protocol": "", + "Microsoft.AspNet.WebSockets.Client": "" + }, + "configurations": { + "net45": { } + } +} \ No newline at end of file diff --git a/test/TestClient/TestClient.csproj b/test/TestClient/TestClient.csproj deleted file mode 100644 index fdd95f9be8..0000000000 --- a/test/TestClient/TestClient.csproj +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Debug - AnyCPU - {22AB02E0-0346-4C4B-BBE7-C829A8D1C19E} - Exe - Properties - TestClient - TestClient - v4.5.1 - 512 - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - {b43d2069-9690-49b2-ba0c-9e8acc32cb83} - Microsoft.Net.WebSockets.net45 - - - - - \ No newline at end of file diff --git a/test/TestClient/TestClient.kproj b/test/TestClient/TestClient.kproj new file mode 100644 index 0000000000..e5d4236d57 --- /dev/null +++ b/test/TestClient/TestClient.kproj @@ -0,0 +1,34 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 8c8eac01-dc49-4c5e-b348-e4e46fe675f9 + Library + + + ConsoleDebugger + + + WebDebugger + + + + + + + 2.0 + + + + + + + + + + + \ No newline at end of file