From 33e3e5b1860a1cbae679e80b880a8418b680d558 Mon Sep 17 00:00:00 2001 From: Andrew Stanton-Nurse Date: Wed, 3 Aug 2016 13:48:52 -0700 Subject: [PATCH] remove our WebSocket client we'll use the one from dotnet/corefx now instead fixes #108 --- WebSockets.sln | 73 +-- samples/TestServer/Program.cs | 2 +- scripts/UpdateCoreFxCode.ps1 | 10 +- ...crosoft.AspNetCore.WebSockets.Client.xproj | 17 - .../WebSocketClient.cs | 114 ---- .../project.json | 24 - .../Constants.cs | 41 -- ...osoft.AspNetCore.WebSockets.Protocol.xproj | 17 - .../Properties/AssemblyInfo.cs | 17 - .../ext/README.md | 5 - .../project.json | 42 -- ...crosoft.AspNetCore.WebSockets.Server.xproj | 17 - .../Properties/AssemblyInfo.cs | 11 - .../ExtendedWebSocketAcceptContext.cs | 4 +- .../Internal}/Constants.cs | 2 +- .../Internal}/HandshakeHelpers.cs | 34 +- .../Internal/WebSocketFactory.cs} | 4 +- .../Internal/fx}/CompatHelpers.cs | 0 .../Internal/fx/README.md | 5 + .../Internal/fx}/SR.cs | 0 .../Net/WebSockets/WebSocketValidate.cs | 2 + .../System/Net/WebSockets/ManagedWebSocket.cs | 2 + .../Microsoft.AspNetCore.WebSockets.xproj | 13 +- .../Properties/AssemblyInfo.cs | 0 .../WebSocketMiddleware.cs | 6 +- .../WebSocketMiddlewareExtensions.cs | 2 +- .../WebSocketOptions.cs | 0 .../project.json | 9 +- test/AutobahnTestApp/project.json | 2 +- .../WebSocketClientTests.cs | 536 ----------------- .../project.json | 14 - .../Autobahn/AutobahnCaseResult.cs | 2 +- .../Autobahn/AutobahnExpectations.cs | 2 +- .../Autobahn/AutobahnResult.cs | 2 +- .../Autobahn/AutobahnServerResult.cs | 2 +- .../Autobahn/AutobahnSpec.cs | 2 +- .../Autobahn/AutobahnTester.cs | 2 +- .../Autobahn/Executable.cs | 2 +- .../Autobahn/Expectation.cs | 2 +- .../Autobahn/ServerSpec.cs | 2 +- .../Autobahn/Wstest.cs | 2 +- .../AutobahnTests.cs | 4 +- .../Helpers.cs | 2 +- ...pNetCore.WebSockets.ConformanceTest.xproj} | 4 +- .../Properties/AssemblyInfo.cs | 0 .../SkipIfWsTestNotPresentAttribute.cs | 4 +- .../project.json | 0 .../BufferStream.cs | 2 +- .../DuplexStream.cs | 2 +- .../KestrelWebSocketHelpers.cs | 2 +- ...icrosoft.AspNetCore.WebSockets.Test.xproj} | 15 +- .../Properties/AssemblyInfo.cs | 0 .../SendReceiveTests.cs | 2 +- .../WebSocketMiddlewareTests.cs | 541 ++++++++++++++++++ .../WebSocketPair.cs | 7 +- .../project.json | 8 +- 56 files changed, 651 insertions(+), 987 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Client/Microsoft.AspNetCore.WebSockets.Client.xproj delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Client/WebSocketClient.cs delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Client/project.json delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Protocol/Constants.cs delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Protocol/Microsoft.AspNetCore.WebSockets.Protocol.xproj delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Protocol/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Protocol/ext/README.md delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Protocol/project.json delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Server/Microsoft.AspNetCore.WebSockets.Server.xproj delete mode 100644 src/Microsoft.AspNetCore.WebSockets.Server/Properties/AssemblyInfo.cs rename src/{Microsoft.AspNetCore.WebSockets.Server => Microsoft.AspNetCore.WebSockets}/ExtendedWebSocketAcceptContext.cs (79%) rename src/{Microsoft.AspNetCore.WebSockets.Client => Microsoft.AspNetCore.WebSockets/Internal}/Constants.cs (94%) rename src/{Microsoft.AspNetCore.WebSockets.Protocol => Microsoft.AspNetCore.WebSockets/Internal}/HandshakeHelpers.cs (84%) rename src/{Microsoft.AspNetCore.WebSockets.Protocol/CommonWebSocket.cs => Microsoft.AspNetCore.WebSockets/Internal/WebSocketFactory.cs} (92%) rename src/{Microsoft.AspNetCore.WebSockets.Protocol => Microsoft.AspNetCore.WebSockets/Internal/fx}/CompatHelpers.cs (100%) create mode 100644 src/Microsoft.AspNetCore.WebSockets/Internal/fx/README.md rename src/{Microsoft.AspNetCore.WebSockets.Protocol => Microsoft.AspNetCore.WebSockets/Internal/fx}/SR.cs (100%) rename src/{Microsoft.AspNetCore.WebSockets.Protocol/ext => Microsoft.AspNetCore.WebSockets/Internal/fx}/src/Common/src/System/Net/WebSockets/WebSocketValidate.cs (98%) rename src/{Microsoft.AspNetCore.WebSockets.Protocol/ext => Microsoft.AspNetCore.WebSockets/Internal/fx}/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ManagedWebSocket.cs (99%) rename test/Microsoft.AspNetCore.WebSockets.Protocol.Test/Microsoft.AspNetCore.WebSockets.Protocol.Test.xproj => src/Microsoft.AspNetCore.WebSockets/Microsoft.AspNetCore.WebSockets.xproj (64%) rename src/{Microsoft.AspNetCore.WebSockets.Client => Microsoft.AspNetCore.WebSockets}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNetCore.WebSockets.Server => Microsoft.AspNetCore.WebSockets}/WebSocketMiddleware.cs (95%) rename src/{Microsoft.AspNetCore.WebSockets.Server => Microsoft.AspNetCore.WebSockets}/WebSocketMiddlewareExtensions.cs (95%) rename src/{Microsoft.AspNetCore.WebSockets.Server => Microsoft.AspNetCore.WebSockets}/WebSocketOptions.cs (100%) rename src/{Microsoft.AspNetCore.WebSockets.Server => Microsoft.AspNetCore.WebSockets}/project.json (76%) delete mode 100644 test/Microsoft.AspNetCore.WebSockets.Client.Test/WebSocketClientTests.cs delete mode 100644 test/Microsoft.AspNetCore.WebSockets.Client.Test/project.json rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/AutobahnCaseResult.cs (92%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/AutobahnExpectations.cs (98%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/AutobahnResult.cs (89%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/AutobahnServerResult.cs (94%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/AutobahnSpec.cs (96%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/AutobahnTester.cs (98%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/Executable.cs (95%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/Expectation.cs (64%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/ServerSpec.cs (88%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Autobahn/Wstest.cs (88%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/AutobahnTests.cs (97%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Helpers.cs (94%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest.xproj => Microsoft.AspNetCore.WebSockets.ConformanceTest/Microsoft.AspNetCore.WebSockets.ConformanceTest.xproj} (86%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/Properties/AssemblyInfo.cs (100%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/SkipIfWsTestNotPresentAttribute.cs (75%) rename test/{Microsoft.AspNetCore.WebSockets.Server.ConformanceTest => Microsoft.AspNetCore.WebSockets.ConformanceTest}/project.json (100%) rename test/{Microsoft.AspNetCore.WebSockets.Protocol.Test => Microsoft.AspNetCore.WebSockets.Test}/BufferStream.cs (99%) rename test/{Microsoft.AspNetCore.WebSockets.Protocol.Test => Microsoft.AspNetCore.WebSockets.Test}/DuplexStream.cs (98%) rename test/{Microsoft.AspNetCore.WebSockets.Client.Test => Microsoft.AspNetCore.WebSockets.Test}/KestrelWebSocketHelpers.cs (97%) rename test/{Microsoft.AspNetCore.WebSockets.Client.Test/Microsoft.AspNetCore.WebSockets.Client.Test.xproj => Microsoft.AspNetCore.WebSockets.Test/Microsoft.AspNetCore.WebSockets.Test.xproj} (54%) rename test/{Microsoft.AspNetCore.WebSockets.Protocol.Test => Microsoft.AspNetCore.WebSockets.Test}/Properties/AssemblyInfo.cs (100%) rename test/{Microsoft.AspNetCore.WebSockets.Protocol.Test => Microsoft.AspNetCore.WebSockets.Test}/SendReceiveTests.cs (98%) create mode 100644 test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs rename test/{Microsoft.AspNetCore.WebSockets.Protocol.Test => Microsoft.AspNetCore.WebSockets.Test}/WebSocketPair.cs (64%) rename test/{Microsoft.AspNetCore.WebSockets.Protocol.Test => Microsoft.AspNetCore.WebSockets.Test}/project.json (57%) diff --git a/WebSockets.sln b/WebSockets.sln index 8c2c5904a1..b755faab40 100644 --- a/WebSockets.sln +++ b/WebSockets.sln @@ -8,21 +8,11 @@ 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("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.Protocol", "src\Microsoft.AspNetCore.WebSockets.Protocol\Microsoft.AspNetCore.WebSockets.Protocol.xproj", "{E0C10DEC-3339-4A47-85BC-3100C5D34AD4}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.Client", "src\Microsoft.AspNetCore.WebSockets.Client\Microsoft.AspNetCore.WebSockets.Client.xproj", "{4A1C4875-AE21-4A78-979A-F0E4DF5EB518}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.Client.Test", "test\Microsoft.AspNetCore.WebSockets.Client.Test\Microsoft.AspNetCore.WebSockets.Client.Test.xproj", "{6604D154-817F-4BC5-BE95-FF7E851179D9}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.Server", "src\Microsoft.AspNetCore.WebSockets.Server\Microsoft.AspNetCore.WebSockets.Server.xproj", "{78A097D0-C0A4-4AED-93E2-84A65392FB52}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{86E1ADA2-631C-484F-906C-2D0BCF628E65}" ProjectSection(SolutionItems) = preProject global.json = global.json EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "TestClient", "samples\TestClient\TestClient.xproj", "{8C8EAC01-DC49-4C5E-B348-E4E46FE675F9}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestServer", "samples\TestServer\TestServer.csproj", "{4E5F5FCC-172C-44D9-BEA0-39098A79CD0B}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "AutobahnTestApp", "test\AutobahnTestApp\AutobahnTestApp.xproj", "{9755F612-A155-4BDD-9E20-37ADE0B4B3BA}" @@ -36,9 +26,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{1959 scripts\UpdateCoreFxCode.ps1 = scripts\UpdateCoreFxCode.ps1 EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.Server.ConformanceTest", "test\Microsoft.AspNetCore.WebSockets.Server.ConformanceTest\Microsoft.AspNetCore.WebSockets.Server.ConformanceTest.xproj", "{A722BB6C-9114-4F25-9BB0-2191D4405F3A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets", "src\Microsoft.AspNetCore.WebSockets\Microsoft.AspNetCore.WebSockets.xproj", "{CDE16880-0374-46FA-8896-99F1B90B4B6F}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.Protocol.Test", "test\Microsoft.AspNetCore.WebSockets.Protocol.Test\Microsoft.AspNetCore.WebSockets.Protocol.Test.xproj", "{AAF2DFCF-845E-4410-BBF0-0683AD60DD6A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.Test", "test\Microsoft.AspNetCore.WebSockets.Test\Microsoft.AspNetCore.WebSockets.Test.xproj", "{5AFA74F5-9B1D-4FC5-815F-EF471F5AC1EF}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebSockets.ConformanceTest", "test\Microsoft.AspNetCore.WebSockets.ConformanceTest\Microsoft.AspNetCore.WebSockets.ConformanceTest.xproj", "{74F45408-1959-4FEE-9511-25D40F4913FD}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "TestClient", "samples\TestClient\TestClient.xproj", "{8C8EAC01-DC49-4C5E-B348-E4E46FE675F9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -46,26 +40,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {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 - {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 - {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 {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 @@ -82,29 +56,34 @@ Global {B7246F23-6A4B-492F-AB61-292AA1A9E9D5}.Debug|Any CPU.Build.0 = Debug|Any CPU {B7246F23-6A4B-492F-AB61-292AA1A9E9D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {B7246F23-6A4B-492F-AB61-292AA1A9E9D5}.Release|Any CPU.Build.0 = Release|Any CPU - {A722BB6C-9114-4F25-9BB0-2191D4405F3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A722BB6C-9114-4F25-9BB0-2191D4405F3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A722BB6C-9114-4F25-9BB0-2191D4405F3A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A722BB6C-9114-4F25-9BB0-2191D4405F3A}.Release|Any CPU.Build.0 = Release|Any CPU - {AAF2DFCF-845E-4410-BBF0-0683AD60DD6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AAF2DFCF-845E-4410-BBF0-0683AD60DD6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AAF2DFCF-845E-4410-BBF0-0683AD60DD6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AAF2DFCF-845E-4410-BBF0-0683AD60DD6A}.Release|Any CPU.Build.0 = Release|Any CPU + {CDE16880-0374-46FA-8896-99F1B90B4B6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CDE16880-0374-46FA-8896-99F1B90B4B6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CDE16880-0374-46FA-8896-99F1B90B4B6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CDE16880-0374-46FA-8896-99F1B90B4B6F}.Release|Any CPU.Build.0 = Release|Any CPU + {5AFA74F5-9B1D-4FC5-815F-EF471F5AC1EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AFA74F5-9B1D-4FC5-815F-EF471F5AC1EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AFA74F5-9B1D-4FC5-815F-EF471F5AC1EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AFA74F5-9B1D-4FC5-815F-EF471F5AC1EF}.Release|Any CPU.Build.0 = Release|Any CPU + {74F45408-1959-4FEE-9511-25D40F4913FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74F45408-1959-4FEE-9511-25D40F4913FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74F45408-1959-4FEE-9511-25D40F4913FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74F45408-1959-4FEE-9511-25D40F4913FD}.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 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {E0C10DEC-3339-4A47-85BC-3100C5D34AD4} = {2C7947A5-9FBD-4267-97C1-2D726D7B3BAF} - {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} - {8C8EAC01-DC49-4C5E-B348-E4E46FE675F9} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} {4E5F5FCC-172C-44D9-BEA0-39098A79CD0B} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} {9755F612-A155-4BDD-9E20-37ADE0B4B3BA} = {C45106D0-76C8-4776-A140-F7DD83CA2958} {72E3AB32-682F-42AF-B7C7-0B777244FF11} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} {B7246F23-6A4B-492F-AB61-292AA1A9E9D5} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} - {A722BB6C-9114-4F25-9BB0-2191D4405F3A} = {C45106D0-76C8-4776-A140-F7DD83CA2958} - {AAF2DFCF-845E-4410-BBF0-0683AD60DD6A} = {C45106D0-76C8-4776-A140-F7DD83CA2958} + {CDE16880-0374-46FA-8896-99F1B90B4B6F} = {2C7947A5-9FBD-4267-97C1-2D726D7B3BAF} + {5AFA74F5-9B1D-4FC5-815F-EF471F5AC1EF} = {C45106D0-76C8-4776-A140-F7DD83CA2958} + {74F45408-1959-4FEE-9511-25D40F4913FD} = {C45106D0-76C8-4776-A140-F7DD83CA2958} + {8C8EAC01-DC49-4C5E-B348-E4E46FE675F9} = {9E55FC5B-FD9C-4266-AB24-F3AA649D7C8B} EndGlobalSection EndGlobal diff --git a/samples/TestServer/Program.cs b/samples/TestServer/Program.cs index b365247e40..68e62bfdf6 100644 --- a/samples/TestServer/Program.cs +++ b/samples/TestServer/Program.cs @@ -41,7 +41,7 @@ namespace TestServer while (received.MessageType != WebSocketMessageType.Close) { - // Console.WriteLine("Echo, " + received.Count + ", " + received.MessageType + ", " + received.EndOfMessage); + Console.WriteLine($"Echoing {received.Count} bytes received in a {received.MessageType} message; Fin={received.EndOfMessage}"); // Echo anything we receive await webSocket.SendAsync(new ArraySegment(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None); diff --git a/scripts/UpdateCoreFxCode.ps1 b/scripts/UpdateCoreFxCode.ps1 index bc1d772500..c6e2be846a 100644 --- a/scripts/UpdateCoreFxCode.ps1 +++ b/scripts/UpdateCoreFxCode.ps1 @@ -16,7 +16,7 @@ if(!(Test-Path $CoreFxRepoRoot)) { } $CoreFxRepoRoot = Convert-Path $CoreFxRepoRoot -$DestinationRoot = "$RepoRoot\src\Microsoft.AspNetCore.WebSockets.Protocol\ext" +$DestinationRoot = "$RepoRoot\src\Microsoft.AspNetCore.WebSockets\Internal\fx" $FilesToCopy | foreach { $Source = Join-Path $CoreFxRepoRoot $_ @@ -34,7 +34,15 @@ $FilesToCopy | foreach { } Write-Host "Copying $_" + # The trailing blank line is important! + $Pragmas = @" +#pragma warning disable 1572 +#pragma warning disable 1573 + +"@; + $SourceCode = [IO.File]::ReadAllText($Source) + $SourceCode = $Pragmas + $SourceCode $SourceCode = $SourceCode.Replace("Task.FromException", "CompatHelpers.FromException") $SourceCode = $SourceCode.Replace("Task.CompletedTask", "CompatHelpers.CompletedTask") $SourceCode = $SourceCode.Replace("Array.Empty", "CompatHelpers.Empty") diff --git a/src/Microsoft.AspNetCore.WebSockets.Client/Microsoft.AspNetCore.WebSockets.Client.xproj b/src/Microsoft.AspNetCore.WebSockets.Client/Microsoft.AspNetCore.WebSockets.Client.xproj deleted file mode 100644 index ad1997b9e5..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Client/Microsoft.AspNetCore.WebSockets.Client.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 4a1c4875-ae21-4a78-979a-f0e4df5eb518 - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Client/WebSocketClient.cs b/src/Microsoft.AspNetCore.WebSockets.Client/WebSocketClient.cs deleted file mode 100644 index 7445a80873..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Client/WebSocketClient.cs +++ /dev/null @@ -1,114 +0,0 @@ -// 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.Linq; -using System.Net; -using System.Net.WebSockets; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.WebSockets.Protocol; - -namespace Microsoft.AspNetCore.WebSockets.Client -{ - public class WebSocketClient - { - static WebSocketClient() - { - try - { - // Only call once - WebSocket.RegisterPrefixes(); - } - catch (Exception) - { - // Already registered - } - } - - public WebSocketClient() - { - ReceiveBufferSize = 1024 * 16; - KeepAliveInterval = TimeSpan.FromMinutes(2); - SubProtocols = new List(); - } - - public IList SubProtocols - { - get; - private set; - } - - public TimeSpan KeepAliveInterval - { - get; - set; - } - - public int ReceiveBufferSize - { - get; - set; - } - - public Action ConfigureRequest - { - get; - set; - } - - public Action InspectResponse - { - get; - set; - } - - public async Task ConnectAsync(Uri uri, CancellationToken cancellationToken) - { - HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); - - CancellationTokenRegistration cancellation = cancellationToken.Register(() => request.Abort()); - - request.Headers[Constants.Headers.SecWebSocketVersion] = Constants.Headers.SupportedVersion; - if (SubProtocols.Count > 0) - { - request.Headers[Constants.Headers.SecWebSocketProtocol] = string.Join(", ", SubProtocols); - } - - if (ConfigureRequest != null) - { - ConfigureRequest(request); - } - - HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); - - cancellation.Dispose(); - - if (InspectResponse != null) - { - InspectResponse(response); - } - - // TODO: Validate handshake - HttpStatusCode statusCode = response.StatusCode; - if (statusCode != HttpStatusCode.SwitchingProtocols) - { - response.Dispose(); - throw new InvalidOperationException("Incomplete handshake, invalid status code: " + statusCode); - } - // TODO: Validate Sec-WebSocket-Key/Sec-WebSocket-Accept - - string subProtocol = response.Headers[Constants.Headers.SecWebSocketProtocol]; - if (!string.IsNullOrEmpty(subProtocol) && !SubProtocols.Contains(subProtocol, StringComparer.OrdinalIgnoreCase)) - { - throw new InvalidOperationException("Incomplete handshake, the server specified an unknown sub-protocol: " + subProtocol); - } - - Stream stream = response.GetResponseStream(); - - return CommonWebSocket.CreateClientWebSocket(stream, subProtocol, KeepAliveInterval, ReceiveBufferSize); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Client/project.json b/src/Microsoft.AspNetCore.WebSockets.Client/project.json deleted file mode 100644 index e39b3dafae..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Client/project.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "version": "0.2.0-*", - "description": "Client for communicating over web sockets.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/websockets" - } - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "xmlDoc": true - }, - "dependencies": { - "Microsoft.AspNetCore.WebSockets.Protocol": "0.2.0-*" - }, - "frameworks": { - "net451": {} - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/Constants.cs b/src/Microsoft.AspNetCore.WebSockets.Protocol/Constants.cs deleted file mode 100644 index 56e125afc2..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/Constants.cs +++ /dev/null @@ -1,41 +0,0 @@ -// 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. - -namespace Microsoft.AspNetCore.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"; - } - - public static class OpCodes - { - public const int ContinuationFrame = 0x0; - public const int TextFrame = 0x1; - public const int BinaryFrame = 0x2; - public const int CloseFrame = 0x8; - public const int PingFrame = 0x9; - public const int PongFrame = 0xA; - - internal static readonly int[] ValidOpCodes = new int[] - { - ContinuationFrame, - TextFrame, - BinaryFrame, - CloseFrame, - PingFrame, - PongFrame, - }; - } - } -} diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/Microsoft.AspNetCore.WebSockets.Protocol.xproj b/src/Microsoft.AspNetCore.WebSockets.Protocol/Microsoft.AspNetCore.WebSockets.Protocol.xproj deleted file mode 100644 index 5b35ce65e5..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/Microsoft.AspNetCore.WebSockets.Protocol.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - e0c10dec-3339-4a47-85bc-3100c5d34ad4 - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebSockets.Protocol/Properties/AssemblyInfo.cs deleted file mode 100644 index 916862c41d..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -// 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.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("Microsoft.Net.WebSockets")] -[assembly: ComVisible(false)] - -[assembly: Guid("9a9e41ae-1494-4d87-a66f-a4019ff68ce5")] -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/ext/README.md b/src/Microsoft.AspNetCore.WebSockets.Protocol/ext/README.md deleted file mode 100644 index 4b8f84b7ed..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/ext/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# External Code - -External code copied from CoreFX. Do not modify files in this directory, use the `scripts\UpdateCoreFxCore.ps1` script in the repo root. - -This folder structure is designed to exactly mirror the structure in the CoreFX repo (hence the deep nesting). \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/project.json b/src/Microsoft.AspNetCore.WebSockets.Protocol/project.json deleted file mode 100644 index c0ebe738b3..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/project.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "version": "0.2.0-*", - "description": "Managed web socket protocol parser.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/websockets" - } - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591", - "CS1572", - "CS1573" - ], - "xmlDoc": true, - "allowUnsafe": true - }, - "frameworks": { - "net451": {}, - "netstandard1.3": { - "dependencies": { - "System.Diagnostics.Debug": "4.0.11-*", - "System.Diagnostics.Contracts": "4.0.1-*", - "System.Globalization": "4.0.11-*", - "System.IO": "4.1.0-*", - "System.Linq": "4.1.0-*", - "System.Net.WebSockets": "4.0.0-*", - "System.Resources.ResourceManager": "4.0.1-*", - "System.Runtime.InteropServices": "4.1.0-*", - "System.Runtime.Extensions": "4.1.0-*", - "System.Security.Cryptography.Algorithms": "4.2.0-*", - "System.Text.Encoding.Extensions": "4.0.11-*", - "System.Threading": "4.0.11-*", - "System.Threading.Tasks": "4.0.11-*", - "System.Threading.Timer": "4.0.1-*" - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Server/Microsoft.AspNetCore.WebSockets.Server.xproj b/src/Microsoft.AspNetCore.WebSockets.Server/Microsoft.AspNetCore.WebSockets.Server.xproj deleted file mode 100644 index cace316cad..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Server/Microsoft.AspNetCore.WebSockets.Server.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 78a097d0-c0a4-4aed-93e2-84a65392fb52 - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Server/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebSockets.Server/Properties/AssemblyInfo.cs deleted file mode 100644 index 76feceeff0..0000000000 --- a/src/Microsoft.AspNetCore.WebSockets.Server/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -// 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.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.WebSockets.Server/ExtendedWebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.WebSockets/ExtendedWebSocketAcceptContext.cs similarity index 79% rename from src/Microsoft.AspNetCore.WebSockets.Server/ExtendedWebSocketAcceptContext.cs rename to src/Microsoft.AspNetCore.WebSockets/ExtendedWebSocketAcceptContext.cs index eb6fd197c1..23186d7eb5 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Server/ExtendedWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNetCore.WebSockets/ExtendedWebSocketAcceptContext.cs @@ -4,14 +4,12 @@ using System; using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNetCore.WebSockets.Server +namespace Microsoft.AspNetCore.WebSockets { public class ExtendedWebSocketAcceptContext : WebSocketAcceptContext { public override string SubProtocol { get; set; } public int? ReceiveBufferSize { get; set; } public TimeSpan? KeepAliveInterval { get; set; } - - // public ArraySegment? Buffer { get; set; } // TODO } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Client/Constants.cs b/src/Microsoft.AspNetCore.WebSockets/Internal/Constants.cs similarity index 94% rename from src/Microsoft.AspNetCore.WebSockets.Client/Constants.cs rename to src/Microsoft.AspNetCore.WebSockets/Internal/Constants.cs index 941c75c63b..ffc5db2c14 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Client/Constants.cs +++ b/src/Microsoft.AspNetCore.WebSockets/Internal/Constants.cs @@ -1,7 +1,7 @@ // 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. -namespace Microsoft.AspNetCore.WebSockets.Client +namespace Microsoft.AspNetCore.WebSockets.Internal { public static class Constants { diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/HandshakeHelpers.cs b/src/Microsoft.AspNetCore.WebSockets/Internal/HandshakeHelpers.cs similarity index 84% rename from src/Microsoft.AspNetCore.WebSockets.Protocol/HandshakeHelpers.cs rename to src/Microsoft.AspNetCore.WebSockets/Internal/HandshakeHelpers.cs index 8afe0a9ce5..019f84a08c 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/HandshakeHelpers.cs +++ b/src/Microsoft.AspNetCore.WebSockets/Internal/HandshakeHelpers.cs @@ -6,26 +6,20 @@ using System.Collections.Generic; using System.Security.Cryptography; using System.Text; -namespace Microsoft.AspNetCore.WebSockets.Protocol +namespace Microsoft.AspNetCore.WebSockets.Internal { public static class HandshakeHelpers { /// /// Gets request headers needed process the handshake on the server. /// - public static IEnumerable NeededHeaders + public static readonly IEnumerable NeededHeaders = new[] { - get - { - return new[] - { - Constants.Headers.Upgrade, - Constants.Headers.Connection, - Constants.Headers.SecWebSocketKey, - Constants.Headers.SecWebSocketVersion - }; - } - } + 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) @@ -103,20 +97,6 @@ namespace Microsoft.AspNetCore.WebSockets.Protocol } } - 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'" diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/CommonWebSocket.cs b/src/Microsoft.AspNetCore.WebSockets/Internal/WebSocketFactory.cs similarity index 92% rename from src/Microsoft.AspNetCore.WebSockets.Protocol/CommonWebSocket.cs rename to src/Microsoft.AspNetCore.WebSockets/Internal/WebSocketFactory.cs index 78f29aa9ca..9946d5e9b2 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/CommonWebSocket.cs +++ b/src/Microsoft.AspNetCore.WebSockets/Internal/WebSocketFactory.cs @@ -5,9 +5,9 @@ using System; using System.IO; using System.Net.WebSockets; -namespace Microsoft.AspNetCore.WebSockets.Protocol +namespace Microsoft.AspNetCore.WebSockets.Internal { - public static class CommonWebSocket + public static class WebSocketFactory { public static WebSocket CreateClientWebSocket(Stream stream, string subProtocol, TimeSpan keepAliveInterval, int receiveBufferSize) { diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/CompatHelpers.cs b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/CompatHelpers.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebSockets.Protocol/CompatHelpers.cs rename to src/Microsoft.AspNetCore.WebSockets/Internal/fx/CompatHelpers.cs diff --git a/src/Microsoft.AspNetCore.WebSockets/Internal/fx/README.md b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/README.md new file mode 100644 index 0000000000..ac2ad020a7 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/README.md @@ -0,0 +1,5 @@ +# Code copied from dotnet/corefx + +This is code copied out of dotnet/corefx. **Do not** modify anything under the `src` subdirectory as it is copied by `scripts\UpdateCoreFxCore.ps1` in this repo. The files in the root of this directory are only here to shim out code that the corefx code depends on. + +Any changes to code under `src` in this directory MUST be made in dotnet/corefx as well and should mention `Tratcher`, `anurse` and `stephentoub`. \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/SR.cs b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/SR.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebSockets.Protocol/SR.cs rename to src/Microsoft.AspNetCore.WebSockets/Internal/fx/SR.cs diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/ext/src/Common/src/System/Net/WebSockets/WebSocketValidate.cs b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/src/Common/src/System/Net/WebSockets/WebSocketValidate.cs similarity index 98% rename from src/Microsoft.AspNetCore.WebSockets.Protocol/ext/src/Common/src/System/Net/WebSockets/WebSocketValidate.cs rename to src/Microsoft.AspNetCore.WebSockets/Internal/fx/src/Common/src/System/Net/WebSockets/WebSocketValidate.cs index 06e07f29dd..284b9ee0b4 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/ext/src/Common/src/System/Net/WebSockets/WebSocketValidate.cs +++ b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/src/Common/src/System/Net/WebSockets/WebSocketValidate.cs @@ -1,3 +1,5 @@ +#pragma warning disable 1572 +#pragma warning disable 1573 // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. diff --git a/src/Microsoft.AspNetCore.WebSockets.Protocol/ext/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ManagedWebSocket.cs b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ManagedWebSocket.cs similarity index 99% rename from src/Microsoft.AspNetCore.WebSockets.Protocol/ext/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ManagedWebSocket.cs rename to src/Microsoft.AspNetCore.WebSockets/Internal/fx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ManagedWebSocket.cs index 738b0a7348..5b6f1e94da 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Protocol/ext/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ManagedWebSocket.cs +++ b/src/Microsoft.AspNetCore.WebSockets/Internal/fx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ManagedWebSocket.cs @@ -1,3 +1,5 @@ +#pragma warning disable 1572 +#pragma warning disable 1573 // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. diff --git a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/Microsoft.AspNetCore.WebSockets.Protocol.Test.xproj b/src/Microsoft.AspNetCore.WebSockets/Microsoft.AspNetCore.WebSockets.xproj similarity index 64% rename from test/Microsoft.AspNetCore.WebSockets.Protocol.Test/Microsoft.AspNetCore.WebSockets.Protocol.Test.xproj rename to src/Microsoft.AspNetCore.WebSockets/Microsoft.AspNetCore.WebSockets.xproj index bbc4595fcc..a0c37d1140 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/Microsoft.AspNetCore.WebSockets.Protocol.Test.xproj +++ b/src/Microsoft.AspNetCore.WebSockets/Microsoft.AspNetCore.WebSockets.xproj @@ -1,22 +1,19 @@  - + - 14.0 + 14.0.25420 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - aaf2dfcf-845e-4410-bbf0-0683ad60dd6a - Microsoft.AspNetCore.WebSockets.Protocol.Test + cde16880-0374-46fa-8896-99f1b90b4b6f + Microsoft.AspNetCore.WebSockets .\obj .\bin\ - v4.6.1 + 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebSockets.Client/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebSockets/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebSockets.Client/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.WebSockets/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNetCore.WebSockets.Server/WebSocketMiddleware.cs b/src/Microsoft.AspNetCore.WebSockets/WebSocketMiddleware.cs similarity index 95% rename from src/Microsoft.AspNetCore.WebSockets.Server/WebSocketMiddleware.cs rename to src/Microsoft.AspNetCore.WebSockets/WebSocketMiddleware.cs index 9bfccfd5c1..006912b29c 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Server/WebSocketMiddleware.cs +++ b/src/Microsoft.AspNetCore.WebSockets/WebSocketMiddleware.cs @@ -9,10 +9,10 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.WebSockets.Protocol; +using Microsoft.AspNetCore.WebSockets.Internal; using Microsoft.Extensions.Options; -namespace Microsoft.AspNetCore.WebSockets.Server +namespace Microsoft.AspNetCore.WebSockets { public class WebSocketMiddleware { @@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.WebSockets.Server } Stream opaqueTransport = await _upgradeFeature.UpgradeAsync(); // Sets status code to 101 - return CommonWebSocket.CreateServerWebSocket(opaqueTransport, subProtocol, keepAliveInterval, receiveBufferSize); + return WebSocketFactory.CreateServerWebSocket(opaqueTransport, subProtocol, keepAliveInterval, receiveBufferSize); } } } diff --git a/src/Microsoft.AspNetCore.WebSockets.Server/WebSocketMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.WebSockets/WebSocketMiddlewareExtensions.cs similarity index 95% rename from src/Microsoft.AspNetCore.WebSockets.Server/WebSocketMiddlewareExtensions.cs rename to src/Microsoft.AspNetCore.WebSockets/WebSocketMiddlewareExtensions.cs index 32295ab5af..403271f09a 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Server/WebSocketMiddlewareExtensions.cs +++ b/src/Microsoft.AspNetCore.WebSockets/WebSocketMiddlewareExtensions.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNetCore.WebSockets.Server; +using Microsoft.AspNetCore.WebSockets; using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.Builder diff --git a/src/Microsoft.AspNetCore.WebSockets.Server/WebSocketOptions.cs b/src/Microsoft.AspNetCore.WebSockets/WebSocketOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebSockets.Server/WebSocketOptions.cs rename to src/Microsoft.AspNetCore.WebSockets/WebSocketOptions.cs diff --git a/src/Microsoft.AspNetCore.WebSockets.Server/project.json b/src/Microsoft.AspNetCore.WebSockets/project.json similarity index 76% rename from src/Microsoft.AspNetCore.WebSockets.Server/project.json rename to src/Microsoft.AspNetCore.WebSockets/project.json index 33a2d2a0c5..5364d0e805 100644 --- a/src/Microsoft.AspNetCore.WebSockets.Server/project.json +++ b/src/Microsoft.AspNetCore.WebSockets/project.json @@ -6,7 +6,8 @@ "nowarn": [ "CS1591" ], - "xmlDoc": true + "xmlDoc": true, + "allowUnsafe": true }, "description": "ASP.NET 5 web socket middleware for use on top of opaque servers.", "packOptions": { @@ -17,13 +18,15 @@ }, "dependencies": { "Microsoft.AspNetCore.Http.Extensions": "1.1.0-*", - "Microsoft.AspNetCore.WebSockets.Protocol": "0.2.0-*", "Microsoft.Extensions.Options": "1.1.0-*" }, "frameworks": { "net451": {}, "netstandard1.3": { - "dependencies": {} + "dependencies": { + "System.Text.Encoding.Extensions": "4.0.11", + "System.Threading.Timer": "4.0.1" + } } } } \ No newline at end of file diff --git a/test/AutobahnTestApp/project.json b/test/AutobahnTestApp/project.json index db9aab27e7..2269497e8a 100644 --- a/test/AutobahnTestApp/project.json +++ b/test/AutobahnTestApp/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNetCore.WebSockets.Server": "0.2.0-*", + "Microsoft.AspNetCore.WebSockets": "0.2.0-*", "Microsoft.NETCore.App": { "version": "1.0.0", "type": "platform" diff --git a/test/Microsoft.AspNetCore.WebSockets.Client.Test/WebSocketClientTests.cs b/test/Microsoft.AspNetCore.WebSockets.Client.Test/WebSocketClientTests.cs deleted file mode 100644 index 1b742cd8e8..0000000000 --- a/test/Microsoft.AspNetCore.WebSockets.Client.Test/WebSocketClientTests.cs +++ /dev/null @@ -1,536 +0,0 @@ -// 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.Net.WebSockets; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Testing.xunit; -using Xunit; - -namespace Microsoft.AspNetCore.WebSockets.Client.Test -{ - public class WebSocketClientTests - { - private static string ClientAddress = "ws://localhost:54321/"; - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task Connect_Success() - { - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task NegotiateSubProtocol_Success() - { - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - Assert.Equal("alpha, bravo, charlie", context.Request.Headers["Sec-WebSocket-Protocol"]); - var webSocket = await context.WebSockets.AcceptWebSocketAsync("Bravo"); - })) - { - var client = new WebSocketClient(); - client.SubProtocols.Add("alpha"); - client.SubProtocols.Add("bravo"); - client.SubProtocols.Add("charlie"); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - Assert.Equal("Bravo", clientSocket.SubProtocol); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task SendEmptyData_Success() - { - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[0]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var orriginalData = new byte[0]; - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task SendShortData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[orriginalData.Length]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, serverBuffer); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task SendMediumData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[orriginalData.Length]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, serverBuffer); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task SendLongData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[orriginalData.Length]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - int intermediateCount = result.Count; - Assert.False(result.EndOfMessage); - Assert.Equal(WebSocketMessageType.Text, result.MessageType); - - result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); - intermediateCount += result.Count; - Assert.False(result.EndOfMessage); - Assert.Equal(WebSocketMessageType.Text, result.MessageType); - - result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); - intermediateCount += result.Count; - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, intermediateCount); - Assert.Equal(WebSocketMessageType.Text, result.MessageType); - - Assert.Equal(orriginalData, serverBuffer); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task SendFragmentedData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[orriginalData.Length]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(2, result.Count); - int totalReceived = result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - result = await webSocket.ReceiveAsync( - new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(2, result.Count); - totalReceived += result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - result = await webSocket.ReceiveAsync( - new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(7, result.Count); - totalReceived += result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - Assert.Equal(orriginalData, serverBuffer); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - await clientSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await clientSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await clientSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task ReceiveEmptyData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var clientBuffer = new byte[0]; - var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task ReceiveShortData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var clientBuffer = new byte[orriginalData.Length]; - var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task ReceiveMediumData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var clientBuffer = new byte[orriginalData.Length]; - var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); - } - } - } - - [ConditionalTheory] - [InlineData(1024 * 16)] - [InlineData(0xFFFFFF)] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task ReceiveLongData(int receiveBufferSize) - { - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); - })) - { - var client = new WebSocketClient() { ReceiveBufferSize = receiveBufferSize }; - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var clientBuffer = new byte[orriginalData.Length]; - WebSocketReceiveResult result; - int receivedCount = 0; - do - { - result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer, receivedCount, clientBuffer.Length - receivedCount), CancellationToken.None); - receivedCount += result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - } - while (!result.EndOfMessage); - - Assert.Equal(orriginalData.Length, receivedCount); - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task ReceiveFragmentedData_Success() - { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - await webSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await webSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await webSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var clientBuffer = new byte[orriginalData.Length]; - var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(2, result.Count); - int totalReceived = result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - result = await clientSocket.ReceiveAsync( - new ArraySegment(clientBuffer, totalReceived, clientBuffer.Length - totalReceived), CancellationToken.None); - Assert.False(result.EndOfMessage); - Assert.Equal(2, result.Count); - totalReceived += result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - result = await clientSocket.ReceiveAsync( - new ArraySegment(clientBuffer, totalReceived, clientBuffer.Length - totalReceived), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(7, result.Count); - totalReceived += result.Count; - Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - - Assert.Equal(orriginalData, clientBuffer); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task SendClose_Success() - { - string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[1024]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Close, result.MessageType); - Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); - Assert.Equal(closeDescription, result.CloseStatusDescription); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - await clientSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - Assert.Equal(WebSocketState.CloseSent, clientSocket.State); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task ReceiveClose_Success() - { - string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var clientBuffer = new byte[1024]; - var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Close, result.MessageType); - Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); - Assert.Equal(closeDescription, result.CloseStatusDescription); - - Assert.Equal(WebSocketState.CloseReceived, clientSocket.State); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task CloseFromOpen_Success() - { - string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[1024]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Close, result.MessageType); - Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); - Assert.Equal(closeDescription, result.CloseStatusDescription); - - await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - await clientSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - Assert.Equal(WebSocketState.Closed, clientSocket.State); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task CloseFromCloseSent_Success() - { - string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - var serverBuffer = new byte[1024]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Close, result.MessageType); - Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); - Assert.Equal(closeDescription, result.CloseStatusDescription); - - await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - await clientSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - Assert.Equal(WebSocketState.CloseSent, clientSocket.State); - - await clientSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - Assert.Equal(WebSocketState.Closed, clientSocket.State); - } - } - } - - [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] - public async Task CloseFromCloseReceived_Success() - { - string closeDescription = "Test Closed"; - using (var server = KestrelWebSocketHelpers.CreateServer(async context => - { - Assert.True(context.WebSockets.IsWebSocketRequest); - var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - - await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); - - var serverBuffer = new byte[1024]; - var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Close, result.MessageType); - Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); - Assert.Equal(closeDescription, result.CloseStatusDescription); - })) - { - var client = new WebSocketClient(); - using (var clientSocket = await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None)) - { - var clientBuffer = new byte[1024]; - var result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); - Assert.True(result.EndOfMessage); - Assert.Equal(0, result.Count); - Assert.Equal(WebSocketMessageType.Close, result.MessageType); - Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); - Assert.Equal(closeDescription, result.CloseStatusDescription); - - Assert.Equal(WebSocketState.CloseReceived, clientSocket.State); - - await clientSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - - Assert.Equal(WebSocketState.Closed, clientSocket.State); - } - } - } - } -} diff --git a/test/Microsoft.AspNetCore.WebSockets.Client.Test/project.json b/test/Microsoft.AspNetCore.WebSockets.Client.Test/project.json deleted file mode 100644 index 9a5cc63182..0000000000 --- a/test/Microsoft.AspNetCore.WebSockets.Client.Test/project.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.WebSockets.Client": "0.2.0-*", - "Microsoft.AspNetCore.WebSockets.Server": "0.2.0-*", - "Microsoft.AspNetCore.Server.Kestrel": "1.1.0-*", - "Microsoft.AspNetCore.Testing": "1.1.0-*", - "xunit": "2.2.0-*" - }, - "testRunner": "xunit", - "frameworks": { - "net451": {} - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnCaseResult.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnCaseResult.cs similarity index 92% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnCaseResult.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnCaseResult.cs index 017d178880..2cba13cf25 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnCaseResult.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnCaseResult.cs @@ -2,7 +2,7 @@ using System.Linq; using Newtonsoft.Json.Linq; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class AutobahnCaseResult { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnExpectations.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnExpectations.cs similarity index 98% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnExpectations.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnExpectations.cs index dfcf9a4c25..a8e7425461 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnExpectations.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnExpectations.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text; using Microsoft.AspNetCore.Server.Testing; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class AutobahnExpectations { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnResult.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnResult.cs similarity index 89% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnResult.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnResult.cs index c23164a13c..0e88a07917 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnResult.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnResult.cs @@ -4,7 +4,7 @@ using System.Linq; using Microsoft.AspNetCore.Server.Testing; using Newtonsoft.Json.Linq; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class AutobahnResult { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnServerResult.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnServerResult.cs similarity index 94% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnServerResult.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnServerResult.cs index 4986bbdfc6..a92892d111 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnServerResult.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnServerResult.cs @@ -4,7 +4,7 @@ using System.Linq; using Microsoft.AspNetCore.Server.Testing; using Newtonsoft.Json.Linq; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class AutobahnServerResult { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnSpec.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnSpec.cs similarity index 96% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnSpec.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnSpec.cs index 0c97999136..18218f3a61 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnSpec.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnSpec.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class AutobahnSpec { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnTester.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnTester.cs similarity index 98% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnTester.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnTester.cs index ed74e67b5a..13ecaee858 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/AutobahnTester.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/AutobahnTester.cs @@ -11,7 +11,7 @@ using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using Xunit; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class AutobahnTester : IDisposable { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Executable.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Executable.cs similarity index 95% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Executable.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Executable.cs index eb9a46a889..28fd671bb3 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Executable.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Executable.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class Executable { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Expectation.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Expectation.cs similarity index 64% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Expectation.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Expectation.cs index a3a8040f9d..0661b0d02f 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Expectation.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Expectation.cs @@ -1,4 +1,4 @@ -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public enum Expectation { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/ServerSpec.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/ServerSpec.cs similarity index 88% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/ServerSpec.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/ServerSpec.cs index 265d1f7971..e100794a91 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/ServerSpec.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/ServerSpec.cs @@ -1,7 +1,7 @@ using System; using Newtonsoft.Json.Linq; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { public class ServerSpec { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Wstest.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Wstest.cs similarity index 88% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Wstest.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Wstest.cs index 07d09d34f5..bfa2c18af9 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Autobahn/Wstest.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Autobahn/Wstest.cs @@ -1,6 +1,6 @@ using System; -namespace Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn { /// /// Wrapper around the Autobahn Test Suite's "wstest" app. diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/AutobahnTests.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/AutobahnTests.cs similarity index 97% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/AutobahnTests.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/AutobahnTests.cs index 0a55c8b0d1..89cbfd5bbd 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/AutobahnTests.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/AutobahnTests.cs @@ -6,11 +6,11 @@ using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNetCore.Server.Testing; using Microsoft.AspNetCore.Testing.xunit; -using Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn; +using Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn; using Microsoft.Extensions.Logging; using Microsoft.Extensions.PlatformAbstractions; -namespace Microsoft.AspNetCore.WebSockets.Server.Test +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest { public class AutobahnTests { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Helpers.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Helpers.cs similarity index 94% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Helpers.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Helpers.cs index a22eb25bf3..ad0f500837 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Helpers.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Helpers.cs @@ -2,7 +2,7 @@ using System.IO; using Microsoft.Extensions.PlatformAbstractions; -namespace Microsoft.AspNetCore.WebSockets.Server.Test +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest { public class Helpers { diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest.xproj b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Microsoft.AspNetCore.WebSockets.ConformanceTest.xproj similarity index 86% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest.xproj rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Microsoft.AspNetCore.WebSockets.ConformanceTest.xproj index 10e9e7c82d..4be31bf78c 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest.xproj +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Microsoft.AspNetCore.WebSockets.ConformanceTest.xproj @@ -6,8 +6,8 @@ - a722bb6c-9114-4f25-9bb0-2191d4405f3a - Microsoft.AspNetCore.WebSockets.Server.ConformanceTest + 74f45408-1959-4fee-9511-25d40f4913fd + Microsoft.AspNetCore.WebSockets.ConformanceTest .\obj .\bin\ diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Properties/AssemblyInfo.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/Properties/AssemblyInfo.cs diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/SkipIfWsTestNotPresentAttribute.cs b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/SkipIfWsTestNotPresentAttribute.cs similarity index 75% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/SkipIfWsTestNotPresentAttribute.cs rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/SkipIfWsTestNotPresentAttribute.cs index b37fd95868..ea6b1cc824 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/SkipIfWsTestNotPresentAttribute.cs +++ b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/SkipIfWsTestNotPresentAttribute.cs @@ -1,8 +1,8 @@ using System; using Microsoft.AspNetCore.Testing.xunit; -using Microsoft.AspNetCore.WebSockets.Server.Test.Autobahn; +using Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn; -namespace Microsoft.AspNetCore.WebSockets.Server.Test +namespace Microsoft.AspNetCore.WebSockets.ConformanceTest { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class SkipIfWsTestNotPresentAttribute : Attribute, ITestCondition diff --git a/test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/project.json b/test/Microsoft.AspNetCore.WebSockets.ConformanceTest/project.json similarity index 100% rename from test/Microsoft.AspNetCore.WebSockets.Server.ConformanceTest/project.json rename to test/Microsoft.AspNetCore.WebSockets.ConformanceTest/project.json diff --git a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/BufferStream.cs b/test/Microsoft.AspNetCore.WebSockets.Test/BufferStream.cs similarity index 99% rename from test/Microsoft.AspNetCore.WebSockets.Protocol.Test/BufferStream.cs rename to test/Microsoft.AspNetCore.WebSockets.Test/BufferStream.cs index 0d8454162f..61a6699034 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/BufferStream.cs +++ b/test/Microsoft.AspNetCore.WebSockets.Test/BufferStream.cs @@ -8,7 +8,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNetCore.WebSockets.Protocol.Test +namespace Microsoft.AspNetCore.WebSockets.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.AspNetCore.WebSockets.Protocol.Test/DuplexStream.cs b/test/Microsoft.AspNetCore.WebSockets.Test/DuplexStream.cs similarity index 98% rename from test/Microsoft.AspNetCore.WebSockets.Protocol.Test/DuplexStream.cs rename to test/Microsoft.AspNetCore.WebSockets.Test/DuplexStream.cs index 9d0c40bfc2..528b20466e 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/DuplexStream.cs +++ b/test/Microsoft.AspNetCore.WebSockets.Test/DuplexStream.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNetCore.WebSockets.Protocol.Test +namespace Microsoft.AspNetCore.WebSockets.Test { // A duplex wrapper around a read and write stream. public class DuplexStream : Stream diff --git a/test/Microsoft.AspNetCore.WebSockets.Client.Test/KestrelWebSocketHelpers.cs b/test/Microsoft.AspNetCore.WebSockets.Test/KestrelWebSocketHelpers.cs similarity index 97% rename from test/Microsoft.AspNetCore.WebSockets.Client.Test/KestrelWebSocketHelpers.cs rename to test/Microsoft.AspNetCore.WebSockets.Test/KestrelWebSocketHelpers.cs index b6bc9250d8..646286183a 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Client.Test/KestrelWebSocketHelpers.cs +++ b/test/Microsoft.AspNetCore.WebSockets.Test/KestrelWebSocketHelpers.cs @@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; -namespace Microsoft.AspNetCore.WebSockets.Client.Test +namespace Microsoft.AspNetCore.WebSockets.Test { public class KestrelWebSocketHelpers { diff --git a/test/Microsoft.AspNetCore.WebSockets.Client.Test/Microsoft.AspNetCore.WebSockets.Client.Test.xproj b/test/Microsoft.AspNetCore.WebSockets.Test/Microsoft.AspNetCore.WebSockets.Test.xproj similarity index 54% rename from test/Microsoft.AspNetCore.WebSockets.Client.Test/Microsoft.AspNetCore.WebSockets.Client.Test.xproj rename to test/Microsoft.AspNetCore.WebSockets.Test/Microsoft.AspNetCore.WebSockets.Test.xproj index e54463273b..7ad8fa523a 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Client.Test/Microsoft.AspNetCore.WebSockets.Client.Test.xproj +++ b/test/Microsoft.AspNetCore.WebSockets.Test/Microsoft.AspNetCore.WebSockets.Test.xproj @@ -1,20 +1,19 @@  - + - 14.0 + 14.0.25420 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + - 6604d154-817f-4bc5-be95-ff7e851179d9 + 5afa74f5-9b1d-4fc5-815f-ef471f5ac1ef + Microsoft.AspNetCore.WebSockets.Test .\obj .\bin\ + 2.0 - - - - + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.WebSockets.Test/Properties/AssemblyInfo.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebSockets.Protocol.Test/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNetCore.WebSockets.Test/Properties/AssemblyInfo.cs diff --git a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/SendReceiveTests.cs b/test/Microsoft.AspNetCore.WebSockets.Test/SendReceiveTests.cs similarity index 98% rename from test/Microsoft.AspNetCore.WebSockets.Protocol.Test/SendReceiveTests.cs rename to test/Microsoft.AspNetCore.WebSockets.Test/SendReceiveTests.cs index 109c4b821a..9580b7faad 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/SendReceiveTests.cs +++ b/test/Microsoft.AspNetCore.WebSockets.Test/SendReceiveTests.cs @@ -6,7 +6,7 @@ using System.Threading; using System.Threading.Tasks; using Xunit; -namespace Microsoft.AspNetCore.WebSockets.Protocol.Test +namespace Microsoft.AspNetCore.WebSockets.Test { public class SendReceiveTests { diff --git a/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs b/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs new file mode 100644 index 0000000000..4034af10a4 --- /dev/null +++ b/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketMiddlewareTests.cs @@ -0,0 +1,541 @@ +// 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.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.WebSockets.Test +{ + public class WebSocketMiddlewareTests + { + private static string ClientAddress = "ws://localhost:54321/"; + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task Connect_Success() + { + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task NegotiateSubProtocol_Success() + { + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + Assert.Equal("alpha, bravo, charlie", context.Request.Headers["Sec-WebSocket-Protocol"]); + var webSocket = await context.WebSockets.AcceptWebSocketAsync("Bravo"); + })) + { + using (var client = new ClientWebSocket()) + { + client.Options.AddSubProtocol("alpha"); + client.Options.AddSubProtocol("bravo"); + client.Options.AddSubProtocol("charlie"); + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + Assert.Equal("Bravo", client.SubProtocol); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task SendEmptyData_Success() + { + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[0]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + var orriginalData = new byte[0]; + await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task SendShortData_Success() + { + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, serverBuffer); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task SendMediumData_Success() + { + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, serverBuffer); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task SendLongData_Success() + { + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + int intermediateCount = result.Count; + Assert.False(result.EndOfMessage); + Assert.Equal(WebSocketMessageType.Text, result.MessageType); + + result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); + intermediateCount += result.Count; + Assert.False(result.EndOfMessage); + Assert.Equal(WebSocketMessageType.Text, result.MessageType); + + result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer, intermediateCount, orriginalData.Length - intermediateCount), CancellationToken.None); + intermediateCount += result.Count; + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, intermediateCount); + Assert.Equal(WebSocketMessageType.Text, result.MessageType); + + Assert.Equal(orriginalData, serverBuffer); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task SendFragmentedData_Success() + { + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[orriginalData.Length]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(2, result.Count); + int totalReceived = result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + result = await webSocket.ReceiveAsync( + new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(2, result.Count); + totalReceived += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + result = await webSocket.ReceiveAsync( + new ArraySegment(serverBuffer, totalReceived, serverBuffer.Length - totalReceived), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(7, result.Count); + totalReceived += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + Assert.Equal(orriginalData, serverBuffer); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await client.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await client.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await client.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task ReceiveShortData_Success() + { + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + var clientBuffer = new byte[orriginalData.Length]; + var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, clientBuffer); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task ReceiveMediumData_Success() + { + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + var clientBuffer = new byte[orriginalData.Length]; + var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, clientBuffer); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task ReceiveLongData() + { + var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + var clientBuffer = new byte[orriginalData.Length]; + WebSocketReceiveResult result; + int receivedCount = 0; + do + { + result = await client.ReceiveAsync(new ArraySegment(clientBuffer, receivedCount, clientBuffer.Length - receivedCount), CancellationToken.None); + receivedCount += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + } + while (!result.EndOfMessage); + + Assert.Equal(orriginalData.Length, receivedCount); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, clientBuffer); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task ReceiveFragmentedData_Success() + { + var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + await webSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + var clientBuffer = new byte[orriginalData.Length]; + var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(2, result.Count); + int totalReceived = result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + result = await client.ReceiveAsync( + new ArraySegment(clientBuffer, totalReceived, clientBuffer.Length - totalReceived), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(2, result.Count); + totalReceived += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + result = await client.ReceiveAsync( + new ArraySegment(clientBuffer, totalReceived, clientBuffer.Length - totalReceived), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(7, result.Count); + totalReceived += result.Count; + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + Assert.Equal(orriginalData, clientBuffer); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task SendClose_Success() + { + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + + Assert.Equal(WebSocketState.CloseSent, client.State); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task ReceiveClose_Success() + { + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + var clientBuffer = new byte[1024]; + var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); + + Assert.Equal(WebSocketState.CloseReceived, client.State); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task CloseFromOpen_Success() + { + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); + + await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await client.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + + Assert.Equal(WebSocketState.Closed, client.State); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task CloseFromCloseSent_Success() + { + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); + + await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + Assert.Equal(WebSocketState.CloseSent, client.State); + + await client.CloseAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + Assert.Equal(WebSocketState.Closed, client.State); + } + } + } + + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "No WebSockets Client for this platform")] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No WebSockets Client for this platform")] + public async Task CloseFromCloseReceived_Success() + { + string closeDescription = "Test Closed"; + using (var server = KestrelWebSocketHelpers.CreateServer(async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + var webSocket = await context.WebSockets.AcceptWebSocketAsync(); + + await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeDescription, CancellationToken.None); + + var serverBuffer = new byte[1024]; + var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); + })) + { + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + var clientBuffer = new byte[1024]; + var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketCloseStatus.NormalClosure, result.CloseStatus); + Assert.Equal(closeDescription, result.CloseStatusDescription); + + Assert.Equal(WebSocketState.CloseReceived, client.State); + + await client.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + + Assert.Equal(WebSocketState.Closed, client.State); + } + } + } +} +} diff --git a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/WebSocketPair.cs b/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketPair.cs similarity index 64% rename from test/Microsoft.AspNetCore.WebSockets.Protocol.Test/WebSocketPair.cs rename to test/Microsoft.AspNetCore.WebSockets.Test/WebSocketPair.cs index 1bf3512468..936371acdd 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/WebSocketPair.cs +++ b/test/Microsoft.AspNetCore.WebSockets.Test/WebSocketPair.cs @@ -1,7 +1,8 @@ using System; using System.Net.WebSockets; +using Microsoft.AspNetCore.WebSockets.Internal; -namespace Microsoft.AspNetCore.WebSockets.Protocol.Test +namespace Microsoft.AspNetCore.WebSockets.Test { internal class WebSocketPair { @@ -21,8 +22,8 @@ namespace Microsoft.AspNetCore.WebSockets.Protocol.Test var clientStream = serverStream.CreateReverseDuplexStream(); return new WebSocketPair( - clientSocket: CommonWebSocket.CreateClientWebSocket(clientStream, null, TimeSpan.FromMinutes(2), 1024), - serverSocket: CommonWebSocket.CreateServerWebSocket(serverStream, null, TimeSpan.FromMinutes(2), 1024)); + clientSocket: WebSocketFactory.CreateClientWebSocket(clientStream, null, TimeSpan.FromMinutes(2), 1024), + serverSocket: WebSocketFactory.CreateServerWebSocket(serverStream, null, TimeSpan.FromMinutes(2), 1024)); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/project.json b/test/Microsoft.AspNetCore.WebSockets.Test/project.json similarity index 57% rename from test/Microsoft.AspNetCore.WebSockets.Protocol.Test/project.json rename to test/Microsoft.AspNetCore.WebSockets.Test/project.json index 9eb586b89b..ee1dcaccef 100644 --- a/test/Microsoft.AspNetCore.WebSockets.Protocol.Test/project.json +++ b/test/Microsoft.AspNetCore.WebSockets.Test/project.json @@ -1,13 +1,17 @@ -{ +{ "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.WebSockets.Protocol": "0.2.0-*", + "Microsoft.AspNetCore.Testing": "1.1.0-*", + "Microsoft.AspNetCore.WebSockets": "0.2.0-*", + "Microsoft.AspNetCore.Server.Kestrel": "1.1.0-*", "xunit": "2.2.0-*" }, "testRunner": "xunit", "frameworks": { + "net451": {}, "netcoreapp1.0": { "dependencies": { + "System.Net.WebSockets.Client": "4.0.0", "Microsoft.NETCore.App": { "version": "1.0.0-*", "type": "platform"