Re-layer the .NET Client into Http and non-Http (#544)
* Re-layer the .NET Client into Http and non-Http - Moved IConnection to Sockets.Abstractions and removed HttpConnection and TransportType dependency. - Renamed Sockets.Client to Sockets.Client.Http - Renamed Sockets.Common to Sockets.Common.Http - Renamed Connection to HttpConnection - Removed HTTP dependency from HubConnection - Removed tests that were testing connection logic in HubConnection #518
This commit is contained in:
parent
bdea0f07ef
commit
12917ef0e9
60
SignalR.sln
60
SignalR.sln
|
|
@ -16,41 +16,37 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C4BC9889-B49F-41B6-806B-F84941B2549B}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C4BC9889-B49F-41B6-806B-F84941B2549B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketsSample", "samples\SocketsSample\SocketsSample.csproj", "{C4AEAB04-F341-4539-B6C0-52368FB4BF9E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SocketsSample", "samples\SocketsSample\SocketsSample.csproj", "{C4AEAB04-F341-4539-B6C0-52368FB4BF9E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets", "src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj", "{1715EA8D-8E13-4ACF-8BCA-57D048E55ED8}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets", "src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj", "{1715EA8D-8E13-4ACF-8BCA-57D048E55ED8}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6A35B453-52EC-48AF-89CA-D4A69800F131}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{6A35B453-52EC-48AF-89CA-D4A69800F131}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets.Tests", "test\Microsoft.AspNetCore.Sockets.Tests\Microsoft.AspNetCore.Sockets.Tests.csproj", "{AAD719D5-5E31-4ED1-A60F-6EB92EFA66D9}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Tests", "test\Microsoft.AspNetCore.Sockets.Tests\Microsoft.AspNetCore.Sockets.Tests.csproj", "{AAD719D5-5E31-4ED1-A60F-6EB92EFA66D9}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR", "src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj", "{42E76F87-92B6-45AB-BF07-6B811C0F2CAC}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR", "src\Microsoft.AspNetCore.SignalR\Microsoft.AspNetCore.SignalR.csproj", "{42E76F87-92B6-45AB-BF07-6B811C0F2CAC}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Redis", "src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj", "{59319B72-38BE-4041-8E5C-FF6938874CE8}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Redis", "src\Microsoft.AspNetCore.SignalR.Redis\Microsoft.AspNetCore.SignalR.Redis.csproj", "{59319B72-38BE-4041-8E5C-FF6938874CE8}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatSample", "samples\ChatSample\ChatSample.csproj", "{300979F6-A02E-407A-B8DF-F6200806C18D}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChatSample", "samples\ChatSample\ChatSample.csproj", "{300979F6-A02E-407A-B8DF-F6200806C18D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocialWeather", "samples\SocialWeather\SocialWeather.csproj", "{8D789F94-CB74-45FD-ACE7-92AF6E55042E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SocialWeather", "samples\SocialWeather\SocialWeather.csproj", "{8D789F94-CB74-45FD-ACE7-92AF6E55042E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Test.Server", "client-ts\Microsoft.AspNetCore.SignalR.Test.Server\Microsoft.AspNetCore.SignalR.Test.Server.csproj", "{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Test.Server", "client-ts\Microsoft.AspNetCore.SignalR.Test.Server\Microsoft.AspNetCore.SignalR.Test.Server.csproj", "{A0BF246B-FE7D-4E12-99BF-FFDC131B85D8}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Tests", "test\Microsoft.AspNetCore.SignalR.Tests\Microsoft.AspNetCore.SignalR.Tests.csproj", "{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Tests", "test\Microsoft.AspNetCore.SignalR.Tests\Microsoft.AspNetCore.SignalR.Tests.csproj", "{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientSample", "samples\ClientSample\ClientSample.csproj", "{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientSample", "samples\ClientSample\ClientSample.csproj", "{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebSocketSample", "samples\WebSocketSample\WebSocketSample.csproj", "{EE790D50-C632-46B9-A430-06FA2F2FDCD7}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSocketSample", "samples\WebSocketSample\WebSocketSample.csproj", "{EE790D50-C632-46B9-A430-06FA2F2FDCD7}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets.Client", "src\Microsoft.AspNetCore.Sockets.Client\Microsoft.AspNetCore.Sockets.Client.csproj", "{623FD372-36DE-41A9-A564-F6040D570DBD}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.Tests", "test\Microsoft.AspNetCore.SignalR.Client.Tests\Microsoft.AspNetCore.SignalR.Client.Tests.csproj", "{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client.Tests", "test\Microsoft.AspNetCore.SignalR.Client.Tests\Microsoft.AspNetCore.SignalR.Client.Tests.csproj", "{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Common", "src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj", "{E37324FF-6BAF-4243-BA80-7C024CF5F29D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Common", "src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj", "{E37324FF-6BAF-4243-BA80-7C024CF5F29D}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client", "src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj", "{354335AB-CEE9-4434-A641-78058F6EFE56}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client", "src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj", "{354335AB-CEE9-4434-A641-78058F6EFE56}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.FunctionalTests", "test\Microsoft.AspNetCore.SignalR.Client.FunctionalTests\Microsoft.AspNetCore.SignalR.Client.FunctionalTests.csproj", "{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}"
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Client.FunctionalTests", "test\Microsoft.AspNetCore.SignalR.Client.FunctionalTests\Microsoft.AspNetCore.SignalR.Client.FunctionalTests.csproj", "{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Sockets.Common", "src\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj", "{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.TS", "client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj", "{333526A4-633B-491A-AC45-CC62A0012D1C}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client.TS", "client-ts\Microsoft.AspNetCore.SignalR.Client.TS\Microsoft.AspNetCore.SignalR.Client.TS.csproj", "{333526A4-633B-491A-AC45-CC62A0012D1C}"
|
||||||
EndProject
|
EndProject
|
||||||
|
|
@ -67,7 +63,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "client-ts", "client-ts", "{
|
||||||
client-ts\package.json = client-ts\package.json
|
client-ts\package.json = client-ts\package.json
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.SignalR.Microbenchmarks", "test\Microsoft.AspNetCore.SignalR.Microbenchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks.csproj", "{96771B3F-4D18-41A7-A75B-FF38E76AAC89}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Microbenchmarks", "test\Microsoft.AspNetCore.SignalR.Microbenchmarks\Microsoft.AspNetCore.SignalR.Microbenchmarks.csproj", "{96771B3F-4D18-41A7-A75B-FF38E76AAC89}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Common.Tests", "test\Microsoft.AspNetCore.SignalR.Common.Tests\Microsoft.AspNetCore.SignalR.Common.Tests.csproj", "{75E342F6-5445-4E7E-9143-6D9AE62C2B1E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Common.Tests", "test\Microsoft.AspNetCore.SignalR.Common.Tests\Microsoft.AspNetCore.SignalR.Common.Tests.csproj", "{75E342F6-5445-4E7E-9143-6D9AE62C2B1E}"
|
||||||
EndProject
|
EndProject
|
||||||
|
|
@ -77,6 +73,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Signal
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Http", "src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj", "{9E403E93-3284-486F-9A5F-1E15FCE426A5}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Http", "src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj", "{9E403E93-3284-486F-9A5F-1E15FCE426A5}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Client.Http", "src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj", "{B0243F99-2D3F-4CC6-AD71-E3F891B64724}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Sockets.Common.Http", "src\Microsoft.AspNetCore.Sockets.Common.Http\Microsoft.AspNetCore.Sockets.Common.Http.csproj", "{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -127,10 +127,6 @@ Global
|
||||||
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.Build.0 = Release|Any CPU
|
{EE790D50-C632-46B9-A430-06FA2F2FDCD7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{623FD372-36DE-41A9-A564-F6040D570DBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{623FD372-36DE-41A9-A564-F6040D570DBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{623FD372-36DE-41A9-A564-F6040D570DBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{623FD372-36DE-41A9-A564-F6040D570DBD}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
|
@ -147,10 +143,6 @@ Global
|
||||||
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.Build.0 = Release|Any CPU
|
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{333526A4-633B-491A-AC45-CC62A0012D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{333526A4-633B-491A-AC45-CC62A0012D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{333526A4-633B-491A-AC45-CC62A0012D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
|
@ -175,6 +167,14 @@ Global
|
||||||
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.Build.0 = Release|Any CPU
|
{9E403E93-3284-486F-9A5F-1E15FCE426A5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{B0243F99-2D3F-4CC6-AD71-E3F891B64724}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -191,12 +191,10 @@ Global
|
||||||
{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
{1CE2B3BE-056C-41E3-A5F5-6A1EF1D288BA} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
||||||
{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
|
{BA99C2A1-48F9-4FA5-B95A-9687A73B7CC9} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
|
||||||
{EE790D50-C632-46B9-A430-06FA2F2FDCD7} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
|
{EE790D50-C632-46B9-A430-06FA2F2FDCD7} = {C4BC9889-B49F-41B6-806B-F84941B2549B}
|
||||||
{623FD372-36DE-41A9-A564-F6040D570DBD} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
|
||||||
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
{B19C15A5-F5EA-4CA7-936B-1166ABEE35C4} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
||||||
{E37324FF-6BAF-4243-BA80-7C024CF5F29D} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
{E37324FF-6BAF-4243-BA80-7C024CF5F29D} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
||||||
{354335AB-CEE9-4434-A641-78058F6EFE56} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
{354335AB-CEE9-4434-A641-78058F6EFE56} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
||||||
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
{455B68D2-C5B6-4BF4-A685-964B07AFAAF8} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
||||||
{F3EFFD9F-DD85-48A2-9B11-83A133ECC099} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
|
||||||
{333526A4-633B-491A-AC45-CC62A0012D1C} = {3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}
|
{333526A4-633B-491A-AC45-CC62A0012D1C} = {3A76C5A2-79ED-49BC-8BDC-6A3A766FFA1B}
|
||||||
{6CEC3DC2-5B01-45A8-8F0D-8531315DA90B} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
{6CEC3DC2-5B01-45A8-8F0D-8531315DA90B} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
||||||
{96771B3F-4D18-41A7-A75B-FF38E76AAC89} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
{96771B3F-4D18-41A7-A75B-FF38E76AAC89} = {6A35B453-52EC-48AF-89CA-D4A69800F131}
|
||||||
|
|
@ -204,5 +202,7 @@ Global
|
||||||
{F2E4FBD6-9AEA-4A82-BAC9-3FAACA677DF8} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
{F2E4FBD6-9AEA-4A82-BAC9-3FAACA677DF8} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
||||||
{FD80BB0F-0876-4F11-8D84-6657C8EF84CA} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
{FD80BB0F-0876-4F11-8D84-6657C8EF84CA} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
||||||
{9E403E93-3284-486F-9A5F-1E15FCE426A5} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
{9E403E93-3284-486F-9A5F-1E15FCE426A5} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
||||||
|
{B0243F99-2D3F-4CC6-AD71-E3F891B64724} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
||||||
|
{E081EE41-D95F-4AD2-BC0B-4B562C0A2A47} = {DA69F624-5398-4884-87E4-B816698CDE65}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
||||||
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.SignalR.Client;
|
using Microsoft.AspNetCore.SignalR.Client;
|
||||||
|
using Microsoft.AspNetCore.Sockets.Client;
|
||||||
using Microsoft.Extensions.CommandLineUtils;
|
using Microsoft.Extensions.CommandLineUtils;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
|
@ -32,7 +33,8 @@ namespace ClientSample
|
||||||
var loggerFactory = new LoggerFactory();
|
var loggerFactory = new LoggerFactory();
|
||||||
|
|
||||||
Console.WriteLine("Connecting to {0}", baseUrl);
|
Console.WriteLine("Connecting to {0}", baseUrl);
|
||||||
var connection = new HubConnection(new Uri(baseUrl), loggerFactory);
|
var httpConnection = new HttpConnection(new Uri(baseUrl));
|
||||||
|
var connection = new HubConnection(httpConnection, loggerFactory);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await connection.StartAsync();
|
await connection.StartAsync();
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ using System.Net.Http;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Sockets;
|
|
||||||
using Microsoft.AspNetCore.Sockets.Client;
|
using Microsoft.AspNetCore.Sockets.Client;
|
||||||
using Microsoft.Extensions.CommandLineUtils;
|
using Microsoft.Extensions.CommandLineUtils;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
@ -37,7 +36,7 @@ namespace ClientSample
|
||||||
var logger = loggerFactory.CreateLogger<Program>();
|
var logger = loggerFactory.CreateLogger<Program>();
|
||||||
|
|
||||||
Console.WriteLine($"Connecting to {baseUrl}...");
|
Console.WriteLine($"Connecting to {baseUrl}...");
|
||||||
var connection = new Connection(new Uri(baseUrl), loggerFactory);
|
var connection = new HttpConnection(new Uri(baseUrl), loggerFactory);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var cts = new CancellationTokenSource();
|
var cts = new CancellationTokenSource();
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,11 @@ using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Threading.Tasks.Channels;
|
using System.Threading.Tasks.Channels;
|
||||||
using Microsoft.AspNetCore.SignalR.Internal;
|
using Microsoft.AspNetCore.SignalR.Internal;
|
||||||
using Microsoft.AspNetCore.SignalR.Internal.Protocol;
|
using Microsoft.AspNetCore.SignalR.Internal.Protocol;
|
||||||
using Microsoft.AspNetCore.Sockets;
|
|
||||||
using Microsoft.AspNetCore.Sockets.Client;
|
using Microsoft.AspNetCore.Sockets.Client;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Logging.Abstractions;
|
using Microsoft.Extensions.Logging.Abstractions;
|
||||||
|
|
@ -27,8 +25,6 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
private readonly IHubProtocol _protocol;
|
private readonly IHubProtocol _protocol;
|
||||||
private readonly HubBinder _binder;
|
private readonly HubBinder _binder;
|
||||||
|
|
||||||
private HttpClient _httpClient;
|
|
||||||
|
|
||||||
private readonly object _pendingCallsLock = new object();
|
private readonly object _pendingCallsLock = new object();
|
||||||
private readonly CancellationTokenSource _connectionActive = new CancellationTokenSource();
|
private readonly CancellationTokenSource _connectionActive = new CancellationTokenSource();
|
||||||
private readonly Dictionary<string, InvocationRequest> _pendingCalls = new Dictionary<string, InvocationRequest>();
|
private readonly Dictionary<string, InvocationRequest> _pendingCalls = new Dictionary<string, InvocationRequest>();
|
||||||
|
|
@ -48,12 +44,8 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
remove { _connection.Closed -= value; }
|
remove { _connection.Closed -= value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public HubConnection(Uri url)
|
public HubConnection(IConnection connection)
|
||||||
: this(new Connection(url), new JsonHubProtocol(new JsonSerializer()), null)
|
: this(connection, new JsonHubProtocol(new JsonSerializer()), null)
|
||||||
{ }
|
|
||||||
|
|
||||||
public HubConnection(Uri url, ILoggerFactory loggerFactory)
|
|
||||||
: this(new Connection(url), new JsonHubProtocol(new JsonSerializer()), loggerFactory)
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
// These are only really needed for tests now...
|
// These are only really needed for tests now...
|
||||||
|
|
@ -82,31 +74,14 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
_connection.Closed += Shutdown;
|
_connection.Closed += Shutdown;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task StartAsync() => StartAsync(TransportType.All, httpClient: null);
|
public async Task StartAsync()
|
||||||
public Task StartAsync(HttpClient httpClient) => StartAsync(TransportType.All, httpClient: httpClient);
|
|
||||||
public Task StartAsync(TransportType transportType) => StartAsync(transportType, httpClient: null);
|
|
||||||
|
|
||||||
public async Task StartAsync(TransportType transportType, HttpClient httpClient)
|
|
||||||
{
|
{
|
||||||
if (httpClient == null)
|
await _connection.StartAsync();
|
||||||
{
|
|
||||||
// We are creating the client so store it to be able to dispose
|
|
||||||
_httpClient = httpClient = new HttpClient();
|
|
||||||
}
|
|
||||||
|
|
||||||
await _connection.StartAsync(new DefaultTransportFactory(transportType, _loggerFactory, httpClient), httpClient);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient)
|
|
||||||
{
|
|
||||||
await _connection.StartAsync(transportFactory, httpClient);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DisposeAsync()
|
public async Task DisposeAsync()
|
||||||
{
|
{
|
||||||
await _connection.DisposeAsync();
|
await _connection.DisposeAsync();
|
||||||
|
|
||||||
_httpClient?.Dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Client return values/tasks?
|
// TODO: Client return values/tasks?
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" />
|
<ProjectReference Include="..\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" />
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Client\Microsoft.AspNetCore.Sockets.Client.csproj" />
|
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Abstractions\Microsoft.AspNetCore.Sockets.Abstractions.csproj" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="$(AspNetCoreVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,4 @@
|
||||||
<PackageReference Include="System.IO.Pipelines.Text.Primitives" Version="$(CoreFxLabsVersion)" />
|
<PackageReference Include="System.IO.Pipelines.Text.Primitives" Version="$(CoreFxLabsVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
|
@ -10,7 +9,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
{
|
{
|
||||||
public interface IConnection
|
public interface IConnection
|
||||||
{
|
{
|
||||||
Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient);
|
Task StartAsync();
|
||||||
Task SendAsync(byte[] data, CancellationToken cancellationToken);
|
Task SendAsync(byte[] data, CancellationToken cancellationToken);
|
||||||
Task DisposeAsync();
|
Task DisposeAsync();
|
||||||
|
|
||||||
|
|
@ -15,18 +15,19 @@ using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Sockets.Client
|
namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
{
|
{
|
||||||
public class Connection : IConnection
|
public class HttpConnection : IConnection
|
||||||
{
|
{
|
||||||
private readonly ILoggerFactory _loggerFactory;
|
private readonly ILoggerFactory _loggerFactory;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
private volatile int _connectionState = ConnectionState.Initial;
|
private volatile int _connectionState = ConnectionState.Initial;
|
||||||
private volatile IChannelConnection<byte[], SendMessage> _transportChannel;
|
private volatile IChannelConnection<byte[], SendMessage> _transportChannel;
|
||||||
private HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
private volatile ITransport _transport;
|
private volatile ITransport _transport;
|
||||||
private volatile Task _receiveLoopTask;
|
private volatile Task _receiveLoopTask;
|
||||||
private TaskCompletionSource<object> _startTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
private TaskCompletionSource<object> _startTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||||
private TaskQueue _eventQueue = new TaskQueue();
|
private TaskQueue _eventQueue = new TaskQueue();
|
||||||
|
private readonly ITransportFactory _transportFactory;
|
||||||
|
|
||||||
private ReadableChannel<byte[]> Input => _transportChannel.Input;
|
private ReadableChannel<byte[]> Input => _transportChannel.Input;
|
||||||
private WritableChannel<SendMessage> Output => _transportChannel.Output;
|
private WritableChannel<SendMessage> Output => _transportChannel.Output;
|
||||||
|
|
@ -37,34 +38,45 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
public event Action<byte[]> Received;
|
public event Action<byte[]> Received;
|
||||||
public event Action<Exception> Closed;
|
public event Action<Exception> Closed;
|
||||||
|
|
||||||
public Connection(Uri url)
|
public HttpConnection(Uri url)
|
||||||
: this(url, null)
|
: this(url, TransportType.WebSockets)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public Connection(Uri url, ILoggerFactory loggerFactory)
|
public HttpConnection(Uri url, TransportType transportType)
|
||||||
|
: this(url, transportType, loggerFactory: null)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpConnection(Uri url, ILoggerFactory loggerFactory)
|
||||||
|
: this(url, TransportType.WebSockets, loggerFactory, httpMessageHandler: null)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpConnection(Uri url, TransportType transportType, ILoggerFactory loggerFactory)
|
||||||
|
: this(url, transportType, loggerFactory, httpMessageHandler: null)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpConnection(Uri url, TransportType transportType, ILoggerFactory loggerFactory, HttpMessageHandler httpMessageHandler)
|
||||||
{
|
{
|
||||||
Url = url ?? throw new ArgumentNullException(nameof(url));
|
Url = url ?? throw new ArgumentNullException(nameof(url));
|
||||||
|
|
||||||
_loggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
|
_loggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
|
||||||
_logger = _loggerFactory.CreateLogger<Connection>();
|
_logger = _loggerFactory.CreateLogger<HttpConnection>();
|
||||||
|
_httpClient = httpMessageHandler == null ? new HttpClient() : new HttpClient(httpMessageHandler);
|
||||||
|
_transportFactory = new DefaultTransportFactory(transportType, _loggerFactory, _httpClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task StartAsync() => StartAsync(transportFactory: null, httpClient: null);
|
public HttpConnection(Uri url, ITransportFactory transportFactory, ILoggerFactory loggerFactory, HttpMessageHandler httpMessageHandler)
|
||||||
public Task StartAsync(HttpClient httpClient) => StartAsync(transportFactory: null, httpClient: httpClient);
|
|
||||||
public Task StartAsync(ITransportFactory transportFactory) => StartAsync(transportFactory, httpClient: null);
|
|
||||||
public Task StartAsync(TransportType transportType) => StartAsync(transportType, httpClient: null);
|
|
||||||
public Task StartAsync(TransportType transportType, HttpClient httpClient)
|
|
||||||
{
|
{
|
||||||
if (httpClient == null)
|
Url = url ?? throw new ArgumentNullException(nameof(url));
|
||||||
{
|
_loggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
|
||||||
// We are creating the client so store it to be able to dispose
|
_logger = _loggerFactory.CreateLogger<HttpConnection>();
|
||||||
_httpClient = httpClient = new HttpClient();
|
_httpClient = httpMessageHandler == null ? new HttpClient() : new HttpClient(httpMessageHandler);
|
||||||
}
|
_transportFactory = transportFactory ?? throw new ArgumentNullException(nameof(transportFactory));
|
||||||
|
|
||||||
return StartAsync(new DefaultTransportFactory(transportType, _loggerFactory, httpClient), httpClient);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient)
|
public Task StartAsync()
|
||||||
{
|
{
|
||||||
if (Interlocked.CompareExchange(ref _connectionState, ConnectionState.Connecting, ConnectionState.Initial)
|
if (Interlocked.CompareExchange(ref _connectionState, ConnectionState.Connecting, ConnectionState.Initial)
|
||||||
!= ConnectionState.Initial)
|
!= ConnectionState.Initial)
|
||||||
|
|
@ -73,13 +85,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
new InvalidOperationException("Cannot start a connection that is not in the Initial state."));
|
new InvalidOperationException("Cannot start a connection that is not in the Initial state."));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (httpClient == null)
|
StartAsyncInternal()
|
||||||
{
|
|
||||||
// We are creating the client so store it to be able to dispose
|
|
||||||
_httpClient = httpClient = new HttpClient();
|
|
||||||
}
|
|
||||||
|
|
||||||
StartAsyncInternal(transportFactory ?? new DefaultTransportFactory(TransportType.All, _loggerFactory, httpClient), httpClient)
|
|
||||||
.ContinueWith(t =>
|
.ContinueWith(t =>
|
||||||
{
|
{
|
||||||
if (t.IsFaulted)
|
if (t.IsFaulted)
|
||||||
|
|
@ -99,13 +105,13 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
return _startTcs.Task;
|
return _startTcs.Task;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task StartAsyncInternal(ITransportFactory transportFactory, HttpClient httpClient)
|
private async Task StartAsyncInternal()
|
||||||
{
|
{
|
||||||
_logger.LogDebug("Starting connection.");
|
_logger.LogDebug("Starting connection.");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var negotiationResponse = await Negotiate(Url, httpClient, _logger);
|
var negotiationResponse = await Negotiate(Url, _httpClient, _logger);
|
||||||
|
|
||||||
// Connection is being stopped while start was in progress
|
// Connection is being stopped while start was in progress
|
||||||
if (_connectionState == ConnectionState.Disconnected)
|
if (_connectionState == ConnectionState.Disconnected)
|
||||||
|
|
@ -114,7 +120,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_transport = transportFactory.CreateTransport(GetAvailableServerTransports(negotiationResponse));
|
_transport = _transportFactory.CreateTransport(GetAvailableServerTransports(negotiationResponse));
|
||||||
|
|
||||||
var connectUrl = CreateConnectUrl(Url, negotiationResponse);
|
var connectUrl = CreateConnectUrl(Url, negotiationResponse);
|
||||||
_logger.LogDebug("Starting transport '{0}' with Url: {1}", _transport.GetType().Name, connectUrl);
|
_logger.LogDebug("Starting transport '{0}' with Url: {1}", _transport.GetType().Name, connectUrl);
|
||||||
|
|
@ -161,7 +167,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
_logger.LogDebug("Draining event queue");
|
_logger.LogDebug("Draining event queue");
|
||||||
await _eventQueue.Drain();
|
await _eventQueue.Drain();
|
||||||
|
|
||||||
_httpClient?.Dispose();
|
_httpClient.Dispose();
|
||||||
|
|
||||||
_logger.LogDebug("Raising Closed event");
|
_logger.LogDebug("Raising Closed event");
|
||||||
|
|
||||||
|
|
@ -387,7 +393,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
||||||
await _receiveLoopTask;
|
await _receiveLoopTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
_httpClient?.Dispose();
|
_httpClient.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ConnectionState
|
private class ConnectionState
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Abstractions\Microsoft.AspNetCore.Sockets.Abstractions.csproj" />
|
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Abstractions\Microsoft.AspNetCore.Sockets.Abstractions.csproj" />
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" />
|
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common.Http\Microsoft.AspNetCore.Sockets.Common.Http.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" />
|
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" />
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" />
|
<ProjectReference Include="..\Microsoft.AspNetCore.Sockets.Common.Http\Microsoft.AspNetCore.Sockets.Common.Http.csproj" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authorization.Policy" Version="$(AspNetCoreVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Authorization.Policy" Version="$(AspNetCoreVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="$(AspNetCoreVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="$(AspNetCoreVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Routing" Version="$(AspNetCoreVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Routing" Version="$(AspNetCoreVersion)" />
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.SignalR.Tests.Common;
|
using Microsoft.AspNetCore.SignalR.Tests.Common;
|
||||||
using Microsoft.AspNetCore.Sockets;
|
using Microsoft.AspNetCore.Sockets;
|
||||||
|
using Microsoft.AspNetCore.Sockets.Client;
|
||||||
using Microsoft.AspNetCore.TestHost;
|
using Microsoft.AspNetCore.TestHost;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
@ -51,21 +52,19 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
{
|
{
|
||||||
var loggerFactory = CreateLogger();
|
var loggerFactory = CreateLogger();
|
||||||
|
|
||||||
using (var httpClient = _testServer.CreateClient())
|
var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
|
||||||
|
var connection = new HubConnection(httpConnection, loggerFactory);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory);
|
await connection.StartAsync();
|
||||||
try
|
|
||||||
{
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
|
|
||||||
var result = await connection.Invoke<string>(nameof(TestHub.HelloWorld));
|
var result = await connection.Invoke<string>(nameof(TestHub.HelloWorld));
|
||||||
|
|
||||||
Assert.Equal("Hello World!", result);
|
Assert.Equal("Hello World!", result);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,21 +74,19 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
var loggerFactory = CreateLogger();
|
var loggerFactory = CreateLogger();
|
||||||
const string originalMessage = "SignalR";
|
const string originalMessage = "SignalR";
|
||||||
|
|
||||||
using (var httpClient = _testServer.CreateClient())
|
var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
|
||||||
|
var connection = new HubConnection(httpConnection, loggerFactory);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory);
|
await connection.StartAsync();
|
||||||
try
|
|
||||||
{
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
|
|
||||||
var result = await connection.Invoke<string>(nameof(TestHub.Echo), originalMessage);
|
var result = await connection.Invoke<string>(nameof(TestHub.Echo), originalMessage);
|
||||||
|
|
||||||
Assert.Equal(originalMessage, result);
|
Assert.Equal(originalMessage, result);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,21 +96,19 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
var loggerFactory = CreateLogger();
|
var loggerFactory = CreateLogger();
|
||||||
const string originalMessage = "SignalR";
|
const string originalMessage = "SignalR";
|
||||||
|
|
||||||
using (var httpClient = _testServer.CreateClient())
|
var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
|
||||||
|
var connection = new HubConnection(httpConnection, loggerFactory);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory);
|
await connection.StartAsync();
|
||||||
try
|
|
||||||
{
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
|
|
||||||
var result = await connection.Invoke<string>(nameof(TestHub.Echo).ToLowerInvariant(), originalMessage);
|
var result = await connection.Invoke<string>(nameof(TestHub.Echo).ToLowerInvariant(), originalMessage);
|
||||||
|
|
||||||
Assert.Equal(originalMessage, result);
|
Assert.Equal(originalMessage, result);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,24 +118,22 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
var loggerFactory = CreateLogger();
|
var loggerFactory = CreateLogger();
|
||||||
const string originalMessage = "SignalR";
|
const string originalMessage = "SignalR";
|
||||||
|
|
||||||
using (var httpClient = _testServer.CreateClient())
|
var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
|
||||||
|
var connection = new HubConnection(httpConnection, loggerFactory);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory);
|
await connection.StartAsync();
|
||||||
try
|
|
||||||
{
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
|
|
||||||
var tcs = new TaskCompletionSource<string>();
|
var tcs = new TaskCompletionSource<string>();
|
||||||
connection.On<string>("Echo", tcs.SetResult);
|
connection.On<string>("Echo", tcs.SetResult);
|
||||||
|
|
||||||
await connection.Invoke(nameof(TestHub.CallEcho), originalMessage).OrTimeout();
|
await connection.Invoke(nameof(TestHub.CallEcho), originalMessage).OrTimeout();
|
||||||
|
|
||||||
Assert.Equal(originalMessage, await tcs.Task.OrTimeout());
|
Assert.Equal(originalMessage, await tcs.Task.OrTimeout());
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync().OrTimeout();
|
await connection.DisposeAsync().OrTimeout();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -149,23 +142,21 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
{
|
{
|
||||||
var loggerFactory = CreateLogger();
|
var loggerFactory = CreateLogger();
|
||||||
|
|
||||||
using (var httpClient = _testServer.CreateClient())
|
var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
|
||||||
|
var connection = new HubConnection(httpConnection, loggerFactory);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory);
|
await connection.StartAsync();
|
||||||
try
|
|
||||||
{
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
|
|
||||||
var tcs = new TaskCompletionSource<string>();
|
var tcs = new TaskCompletionSource<string>();
|
||||||
|
|
||||||
var results = await connection.Stream<string>(nameof(TestHub.Stream)).ReadAllAsync().OrTimeout();
|
var results = await connection.Stream<string>(nameof(TestHub.Stream)).ReadAllAsync().OrTimeout();
|
||||||
|
|
||||||
Assert.Equal(new[] { "a", "b", "c" }, results.ToArray());
|
Assert.Equal(new[] { "a", "b", "c" }, results.ToArray());
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync().OrTimeout();
|
await connection.DisposeAsync().OrTimeout();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -174,22 +165,20 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
{
|
{
|
||||||
var loggerFactory = CreateLogger();
|
var loggerFactory = CreateLogger();
|
||||||
|
|
||||||
using (var httpClient = _testServer.CreateClient())
|
var httpConnection = new HttpConnection(new Uri("http://test/hubs"), TransportType.LongPolling, loggerFactory, _testServer.CreateHandler());
|
||||||
|
var connection = new HubConnection(httpConnection, loggerFactory);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new HubConnection(new Uri("http://test/hubs"), loggerFactory);
|
await connection.StartAsync();
|
||||||
try
|
|
||||||
{
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
|
|
||||||
var ex = await Assert.ThrowsAnyAsync<Exception>(
|
var ex = await Assert.ThrowsAnyAsync<Exception>(
|
||||||
async () => await connection.Invoke("!@#$%"));
|
async () => await connection.Invoke("!@#$%"));
|
||||||
|
|
||||||
Assert.Equal("Unknown hub method '!@#$%'", ex.Message);
|
Assert.Equal("Unknown hub method '!@#$%'", ex.Message);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" />
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
||||||
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets\Microsoft.AspNetCore.Sockets.csproj" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(AspNetCoreVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(AspNetCoreVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(AspNetCoreVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(AspNetCoreVersion)" />
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
[Fact]
|
[Fact]
|
||||||
public void CannotCreateConnectionWithNullUrl()
|
public void CannotCreateConnectionWithNullUrl()
|
||||||
{
|
{
|
||||||
var exception = Assert.Throws<ArgumentNullException>(() => new Connection(null));
|
var exception = Assert.Throws<ArgumentNullException>(() => new HttpConnection(null));
|
||||||
Assert.Equal("url", exception.ParamName);
|
Assert.Equal("url", exception.ParamName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -29,17 +29,16 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
public void ConnectionReturnsUrlUsedToStartTheConnection()
|
public void ConnectionReturnsUrlUsedToStartTheConnection()
|
||||||
{
|
{
|
||||||
var connectionUrl = new Uri("http://fakeuri.org/");
|
var connectionUrl = new Uri("http://fakeuri.org/");
|
||||||
Assert.Equal(connectionUrl, new Connection(connectionUrl).Url);
|
Assert.Equal(connectionUrl, new HttpConnection(connectionUrl).Url);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData((TransportType)0)]
|
[InlineData((TransportType)0)]
|
||||||
[InlineData(TransportType.All + 1)]
|
[InlineData(TransportType.All + 1)]
|
||||||
public async Task CannotStartConnectionWithInvalidTransportType(TransportType requestedTransportType)
|
public void CannotStartConnectionWithInvalidTransportType(TransportType requestedTransportType)
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
Assert.Throws<ArgumentOutOfRangeException>(
|
||||||
await Assert.ThrowsAsync<ArgumentOutOfRangeException>(
|
() => new HttpConnection(new Uri("http://fakeuri.org/"), requestedTransportType));
|
||||||
() => connection.StartAsync(requestedTransportType));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -57,21 +56,18 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
await connection.StartAsync();
|
||||||
try
|
var exception =
|
||||||
{
|
await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
async () => await connection.StartAsync());
|
||||||
var exception =
|
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(
|
}
|
||||||
async () => await connection.StartAsync());
|
finally
|
||||||
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
|
{
|
||||||
}
|
await connection.DisposeAsync();
|
||||||
finally
|
|
||||||
{
|
|
||||||
await connection.DisposeAsync();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,18 +85,15 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
await connection.StartAsync();
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
var exception =
|
var exception =
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(
|
await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
async () => await connection.StartAsync());
|
async () => await connection.StartAsync());
|
||||||
|
|
||||||
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
|
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -108,7 +101,7 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
{
|
{
|
||||||
using (var httpClient = new HttpClient())
|
using (var httpClient = new HttpClient())
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
var exception =
|
var exception =
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(
|
await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
|
|
@ -142,31 +135,29 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
|
||||||
var transport = new Mock<ITransport>();
|
|
||||||
transport.Setup(t => t.StopAsync()).Returns(async () => { await releaseDisposeTcs.Task; });
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
|
||||||
|
|
||||||
var startTask = connection.StartAsync(new TestTransportFactory(transport.Object), httpClient);
|
var transport = new Mock<ITransport>();
|
||||||
await allowDisposeTcs.Task;
|
transport.Setup(t => t.StopAsync()).Returns(async () => { await releaseDisposeTcs.Task; });
|
||||||
var disposeTask = connection.DisposeAsync();
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(transport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
// allow StartAsync to continue once DisposeAsync has started
|
|
||||||
releaseNegotiateTcs.SetResult(null);
|
|
||||||
|
|
||||||
// unblock DisposeAsync only after StartAsync completed
|
var startTask = connection.StartAsync();
|
||||||
await startTask.OrTimeout();
|
await allowDisposeTcs.Task;
|
||||||
releaseDisposeTcs.SetResult(null);
|
var disposeTask = connection.DisposeAsync();
|
||||||
await disposeTask.OrTimeout();
|
// allow StartAsync to continue once DisposeAsync has started
|
||||||
|
releaseNegotiateTcs.SetResult(null);
|
||||||
|
|
||||||
transport.Verify(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>()), Times.Never);
|
// unblock DisposeAsync only after StartAsync completed
|
||||||
}
|
await startTask.OrTimeout();
|
||||||
|
releaseDisposeTcs.SetResult(null);
|
||||||
|
await disposeTask.OrTimeout();
|
||||||
|
|
||||||
|
transport.Verify(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>()), Times.Never);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task SendThrowsIfConnectionIsNotStarted()
|
public async Task SendThrowsIfConnectionIsNotStarted()
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
|
||||||
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
async () => await connection.SendAsync(new byte[0]));
|
async () => await connection.SendAsync(new byte[0]));
|
||||||
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
||||||
|
|
@ -186,17 +177,15 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
await connection.DisposeAsync();
|
|
||||||
|
|
||||||
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
await connection.StartAsync();
|
||||||
async () => await connection.SendAsync(new byte[0]));
|
await connection.DisposeAsync();
|
||||||
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
|
||||||
}
|
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
|
async () => await connection.SendAsync(new byte[0]));
|
||||||
|
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -213,22 +202,20 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var connectedEventRaisedTcs = new TaskCompletionSource<object>();
|
||||||
try
|
connection.Connected += () => connectedEventRaisedTcs.SetResult(null);
|
||||||
{
|
|
||||||
var connectedEventRaisedTcs = new TaskCompletionSource<object>();
|
|
||||||
connection.Connected += () => connectedEventRaisedTcs.SetResult(null);
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
await connection.StartAsync();
|
||||||
|
|
||||||
await connectedEventRaisedTcs.Task.OrTimeout();
|
await connectedEventRaisedTcs.Task.OrTimeout();
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -250,25 +237,23 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
mockTransport.Setup(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>()))
|
mockTransport.Setup(t => t.StartAsync(It.IsAny<Uri>(), It.IsAny<IChannelConnection<SendMessage, byte[]>>()))
|
||||||
.Returns(Task.FromException(new InvalidOperationException("Transport failed to start")));
|
.Returns(Task.FromException(new InvalidOperationException("Transport failed to start")));
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(mockTransport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
var connectedEventRaised = false;
|
||||||
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
connection.Connected += () => connectedEventRaised = true;
|
||||||
var connectedEventRaised = false;
|
|
||||||
|
|
||||||
try
|
await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
{
|
async () => await connection.StartAsync());
|
||||||
connection.Connected += () => connectedEventRaised = true;
|
|
||||||
|
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(
|
|
||||||
async () => await connection.StartAsync(new TestTransportFactory(mockTransport.Object), httpClient));
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
await connection.DisposeAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert.False(connectedEventRaised);
|
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await connection.DisposeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.False(connectedEventRaised);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -285,19 +270,17 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
|
||||||
|
|
||||||
var closedEventTcs = new TaskCompletionSource<Exception>();
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
connection.Closed += e => closedEventTcs.SetResult(e);
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
var closedEventTcs = new TaskCompletionSource<Exception>();
|
||||||
await connection.DisposeAsync();
|
connection.Closed += e => closedEventTcs.SetResult(e);
|
||||||
|
|
||||||
// in case of clean disconnect error should be null
|
await connection.StartAsync();
|
||||||
Assert.Null(await closedEventTcs.Task.OrTimeout());
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
|
// in case of clean disconnect error should be null
|
||||||
|
Assert.Null(await closedEventTcs.Task.OrTimeout());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -317,21 +300,18 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
var closedEventTcs = new TaskCompletionSource<Exception>();
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
connection.Closed += e => closedEventTcs.TrySetResult(e);
|
||||||
var closedEventTcs = new TaskCompletionSource<Exception>();
|
|
||||||
connection.Closed += e => closedEventTcs.TrySetResult(e);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
await connection.StartAsync();
|
||||||
Assert.IsType<HttpRequestException>(await closedEventTcs.Task.OrTimeout());
|
Assert.IsType<HttpRequestException>(await closedEventTcs.Task.OrTimeout());
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -367,16 +347,14 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
|
||||||
var receivedInvoked = false;
|
|
||||||
connection.Received += (m) => receivedInvoked = true;
|
|
||||||
|
|
||||||
await connection.StartAsync(new TestTransportFactory(mockTransport.Object), httpClient);
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(mockTransport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
await connection.DisposeAsync();
|
var receivedInvoked = false;
|
||||||
Assert.False(receivedInvoked);
|
connection.Received += (m) => receivedInvoked = true;
|
||||||
}
|
|
||||||
|
await connection.StartAsync();
|
||||||
|
await connection.DisposeAsync();
|
||||||
|
Assert.False(receivedInvoked);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -408,39 +386,37 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
|
||||||
var closedTcs = new TaskCompletionSource<object>();
|
|
||||||
var allowDisposeTcs = new TaskCompletionSource<object>();
|
|
||||||
int receivedInvocationCount = 0;
|
|
||||||
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var closedTcs = new TaskCompletionSource<object>();
|
||||||
connection.Received +=
|
var allowDisposeTcs = new TaskCompletionSource<object>();
|
||||||
async (m) =>
|
int receivedInvocationCount = 0;
|
||||||
|
|
||||||
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(mockTransport.Object), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
connection.Received +=
|
||||||
|
async (m) =>
|
||||||
|
{
|
||||||
|
if (Interlocked.Increment(ref receivedInvocationCount) == 2)
|
||||||
{
|
{
|
||||||
if (Interlocked.Increment(ref receivedInvocationCount) == 2)
|
allowDisposeTcs.TrySetResult(null);
|
||||||
{
|
}
|
||||||
allowDisposeTcs.TrySetResult(null);
|
await closedTcs.Task;
|
||||||
}
|
};
|
||||||
await closedTcs.Task;
|
connection.Closed += e => closedTcs.SetResult(null);
|
||||||
};
|
|
||||||
connection.Closed += e => closedTcs.SetResult(null);
|
|
||||||
|
|
||||||
await connection.StartAsync(new TestTransportFactory(mockTransport.Object), httpClient);
|
await connection.StartAsync();
|
||||||
channel.Output.TryWrite(Array.Empty<byte>());
|
channel.Output.TryWrite(Array.Empty<byte>());
|
||||||
channel.Output.TryWrite(Array.Empty<byte>());
|
channel.Output.TryWrite(Array.Empty<byte>());
|
||||||
await allowDisposeTcs.Task.OrTimeout();
|
await allowDisposeTcs.Task.OrTimeout();
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
Assert.Equal(2, receivedInvocationCount);
|
Assert.Equal(2, receivedInvocationCount);
|
||||||
// if the events were running on the main loop they would deadlock
|
// if the events were running on the main loop they would deadlock
|
||||||
await closedTcs.Task.OrTimeout();
|
await closedTcs.Task.OrTimeout();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task ClosedEventNotRaisedWhenTheClientIsStoppedButWasNeverStarted()
|
public async Task ClosedEventNotRaisedWhenTheClientIsStoppedButWasNeverStarted()
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
|
||||||
|
|
||||||
bool closedEventRaised = false;
|
bool closedEventRaised = false;
|
||||||
connection.Closed += e => closedEventRaised = true;
|
connection.Closed += e => closedEventRaised = true;
|
||||||
|
|
@ -467,11 +443,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
||||||
{
|
{
|
||||||
var longPollingTransport = new LongPollingTransport(httpClient, new LoggerFactory());
|
var longPollingTransport = new LongPollingTransport(httpClient, new LoggerFactory());
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), new TestTransportFactory(longPollingTransport), loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await connection.StartAsync(new TestTransportFactory(longPollingTransport), httpClient);
|
await connection.StartAsync();
|
||||||
|
|
||||||
Assert.False(longPollingTransport.Running.IsCompleted);
|
Assert.False(longPollingTransport.Running.IsCompleted);
|
||||||
}
|
}
|
||||||
|
|
@ -506,28 +482,25 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
await connection.StartAsync();
|
||||||
try
|
|
||||||
{
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
|
|
||||||
await connection.SendAsync(data);
|
await connection.SendAsync(data);
|
||||||
|
|
||||||
Assert.Equal(data, await sendTcs.Task.OrTimeout());
|
Assert.Equal(data, await sendTcs.Task.OrTimeout());
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task SendAsyncThrowsIfConnectionIsNotStarted()
|
public async Task SendAsyncThrowsIfConnectionIsNotStarted()
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"));
|
||||||
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
async () => await connection.SendAsync(new byte[0]));
|
async () => await connection.SendAsync(new byte[0]));
|
||||||
|
|
||||||
|
|
@ -555,18 +528,15 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK, content);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK, content);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
await connection.StartAsync();
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
|
|
||||||
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
async () => await connection.SendAsync(new byte[0]));
|
async () => await connection.SendAsync(new byte[0]));
|
||||||
|
|
||||||
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -586,17 +556,14 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
await connection.StartAsync();
|
||||||
|
|
||||||
var exception = await Assert.ThrowsAsync<HttpRequestException>(
|
var exception = await Assert.ThrowsAsync<HttpRequestException>(
|
||||||
async () => await connection.SendAsync(new byte[0]));
|
async () => await connection.SendAsync(new byte[0]));
|
||||||
|
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -621,33 +588,30 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK, content);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK, content);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var receiveTcs = new TaskCompletionSource<string>();
|
||||||
try
|
connection.Received += (data) => receiveTcs.TrySetResult(Encoding.UTF8.GetString(data));
|
||||||
{
|
connection.Closed += e =>
|
||||||
var receiveTcs = new TaskCompletionSource<string>();
|
{
|
||||||
connection.Received += (data) => receiveTcs.TrySetResult(Encoding.UTF8.GetString(data));
|
if (e != null)
|
||||||
connection.Closed += e =>
|
|
||||||
{
|
{
|
||||||
if (e != null)
|
receiveTcs.TrySetException(e);
|
||||||
{
|
}
|
||||||
receiveTcs.TrySetException(e);
|
else
|
||||||
}
|
{
|
||||||
else
|
receiveTcs.TrySetCanceled();
|
||||||
{
|
}
|
||||||
receiveTcs.TrySetCanceled();
|
};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
await connection.StartAsync();
|
||||||
|
|
||||||
Assert.Equal("42", await receiveTcs.Task.OrTimeout());
|
Assert.Equal("42", await receiveTcs.Task.OrTimeout());
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -668,28 +632,25 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
: ResponseUtils.CreateResponse(HttpStatusCode.OK);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
var closeTcs = new TaskCompletionSource<Exception>();
|
||||||
try
|
connection.Closed += e => closeTcs.TrySetResult(e);
|
||||||
{
|
|
||||||
var closeTcs = new TaskCompletionSource<Exception>();
|
|
||||||
connection.Closed += e => closeTcs.TrySetResult(e);
|
|
||||||
|
|
||||||
await connection.StartAsync(TransportType.LongPolling, httpClient);
|
await connection.StartAsync();
|
||||||
|
|
||||||
// Exception in send should shutdown the connection
|
// Exception in send should shutdown the connection
|
||||||
await closeTcs.Task.OrTimeout();
|
await closeTcs.Task.OrTimeout();
|
||||||
|
|
||||||
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
async () => await connection.SendAsync(new byte[0]));
|
async () => await connection.SendAsync(new byte[0]));
|
||||||
|
|
||||||
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await connection.DisposeAsync();
|
await connection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -707,14 +668,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
return ResponseUtils.CreateResponse(HttpStatusCode.OK, negotiatePayload);
|
return ResponseUtils.CreateResponse(HttpStatusCode.OK, negotiatePayload);
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
var exception = await Assert.ThrowsAsync<FormatException>(
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
() => connection.StartAsync());
|
||||||
var exception = await Assert.ThrowsAsync<FormatException>(
|
|
||||||
() => connection.StartAsync(TransportType.LongPolling, httpClient));
|
|
||||||
|
|
||||||
Assert.Equal("Invalid negotiation response received.", exception.Message);
|
Assert.Equal("Invalid negotiation response received.", exception.Message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -730,14 +688,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
ResponseUtils.CreateNegotiationResponse(connectionId: null));
|
ResponseUtils.CreateNegotiationResponse(connectionId: null));
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
var exception = await Assert.ThrowsAsync<FormatException>(
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
() => connection.StartAsync());
|
||||||
var exception = await Assert.ThrowsAsync<FormatException>(
|
|
||||||
() => connection.StartAsync(TransportType.LongPolling, httpClient));
|
|
||||||
|
|
||||||
Assert.Equal("Invalid connection id returned in negotiation response.", exception.Message);
|
Assert.Equal("Invalid connection id returned in negotiation response.", exception.Message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -753,14 +708,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
ResponseUtils.CreateNegotiationResponse(transportTypes: null));
|
ResponseUtils.CreateNegotiationResponse(transportTypes: null));
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
var exception = await Assert.ThrowsAsync<FormatException>(
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
() => connection.StartAsync());
|
||||||
var exception = await Assert.ThrowsAsync<FormatException>(
|
|
||||||
() => connection.StartAsync(TransportType.LongPolling, httpClient));
|
|
||||||
|
|
||||||
Assert.Equal("No transports returned in negotiation response.", exception.Message);
|
Assert.Equal("No transports returned in negotiation response.", exception.Message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
|
|
@ -778,14 +730,11 @@ namespace Microsoft.AspNetCore.Sockets.Client.Tests
|
||||||
ResponseUtils.CreateNegotiationResponse(transportTypes: serverTransports));
|
ResponseUtils.CreateNegotiationResponse(transportTypes: serverTransports));
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
var connection = new HttpConnection(new Uri("http://fakeuri.org/"), TransportType.LongPolling, loggerFactory: null, httpMessageHandler: mockHttpHandler.Object);
|
||||||
{
|
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
var connection = new Connection(new Uri("http://fakeuri.org/"));
|
() => connection.StartAsync());
|
||||||
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
|
||||||
() => connection.StartAsync(TransportType.LongPolling, httpClient));
|
|
||||||
|
|
||||||
Assert.Equal("No requested transports available on the server.", exception.Message);
|
Assert.Equal("No requested transports available on the server.", exception.Message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,19 +4,13 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Client.Tests;
|
|
||||||
using Microsoft.AspNetCore.SignalR.Internal;
|
using Microsoft.AspNetCore.SignalR.Internal;
|
||||||
using Microsoft.AspNetCore.SignalR.Internal.Protocol;
|
using Microsoft.AspNetCore.SignalR.Internal.Protocol;
|
||||||
using Microsoft.AspNetCore.SignalR.Tests.Common;
|
using Microsoft.AspNetCore.SignalR.Tests.Common;
|
||||||
using Microsoft.AspNetCore.Sockets;
|
|
||||||
using Microsoft.AspNetCore.Sockets.Client;
|
using Microsoft.AspNetCore.Sockets.Client;
|
||||||
using Microsoft.AspNetCore.Sockets.Client.Tests;
|
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Moq.Protected;
|
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
|
|
@ -24,110 +18,34 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
public class HubConnectionTests
|
public class HubConnectionTests
|
||||||
{
|
{
|
||||||
[Fact]
|
[Fact]
|
||||||
public void CannotCreateHubConnectionWithNullUrl()
|
public async Task StartAsyncCallsConnectionStart()
|
||||||
{
|
{
|
||||||
var exception = Assert.Throws<ArgumentNullException>(
|
var connection = new Mock<IConnection>();
|
||||||
() => new HubConnection((Uri)null, Mock.Of<ILoggerFactory>()));
|
connection.Setup(m => m.StartAsync()).Returns(Task.CompletedTask).Verifiable();
|
||||||
Assert.Equal("url", exception.ParamName);
|
var hubConnection = new HubConnection(connection.Object);
|
||||||
|
await hubConnection.StartAsync();
|
||||||
|
|
||||||
|
connection.Verify(c => c.StartAsync(), Times.Once());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task CanDisposeNotStartedHubConnection()
|
public async Task DisposeAsyncCallsConnectionStart()
|
||||||
{
|
{
|
||||||
await new HubConnection(new Uri("http://fakeuri.org"), new LoggerFactory())
|
var connection = new Mock<IConnection>();
|
||||||
.DisposeAsync();
|
connection.Setup(m => m.StartAsync()).Verifiable();
|
||||||
}
|
var hubConnection = new HubConnection(connection.Object);
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task CannotStartRunningHubConnection()
|
|
||||||
{
|
|
||||||
var mockHttpHandler = new Mock<HttpMessageHandler>();
|
|
||||||
mockHttpHandler.Protected()
|
|
||||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
|
||||||
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
|
|
||||||
{
|
|
||||||
await Task.Yield();
|
|
||||||
return request.Method == HttpMethod.Options
|
|
||||||
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
|
|
||||||
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
|
|
||||||
});
|
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
|
||||||
var hubConnection = new HubConnection(new Uri("http://fakeuri.org/"), new LoggerFactory());
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await hubConnection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
var exception =
|
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(
|
|
||||||
async () => await hubConnection.StartAsync());
|
|
||||||
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
await hubConnection.DisposeAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task CannotStartStoppedHubConnection()
|
|
||||||
{
|
|
||||||
var mockHttpHandler = new Mock<HttpMessageHandler>();
|
|
||||||
mockHttpHandler.Protected()
|
|
||||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
|
||||||
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
|
|
||||||
{
|
|
||||||
await Task.Yield();
|
|
||||||
return request.Method == HttpMethod.Options
|
|
||||||
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
|
|
||||||
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
|
|
||||||
});
|
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
|
||||||
var hubConnection = new HubConnection(new Uri("http://fakeuri.org/"), new LoggerFactory());
|
|
||||||
|
|
||||||
await hubConnection.StartAsync(TransportType.LongPolling, httpClient);
|
|
||||||
await hubConnection.DisposeAsync();
|
|
||||||
var exception =
|
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(
|
|
||||||
async () => await hubConnection.StartAsync());
|
|
||||||
|
|
||||||
Assert.Equal("Cannot start a connection that is not in the Initial state.", exception.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task InvokeThrowsIfHubConnectionNotStarted()
|
|
||||||
{
|
|
||||||
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"));
|
|
||||||
var exception =
|
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test"));
|
|
||||||
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task InvokeThrowsIfHubConnectionDisposed()
|
|
||||||
{
|
|
||||||
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"));
|
|
||||||
await hubConnection.DisposeAsync();
|
await hubConnection.DisposeAsync();
|
||||||
|
|
||||||
var exception =
|
connection.Verify(c => c.DisposeAsync(), Times.Once());
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test"));
|
|
||||||
Assert.Equal("Cannot send messages when the connection is not in the Connected state.", exception.Message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task InvokeThrowsIfSerializingMessageFails()
|
public async Task InvokeThrowsIfSerializingMessageFails()
|
||||||
{
|
{
|
||||||
var mockConnection = new Mock<IConnection>();
|
|
||||||
|
|
||||||
var exception = new InvalidOperationException();
|
var exception = new InvalidOperationException();
|
||||||
var mockProtocol = MockHubProtocol.Throw(exception);
|
var mockProtocol = MockHubProtocol.Throw(exception);
|
||||||
var hubConnection = new HubConnection(mockConnection.Object, mockProtocol, null);
|
var hubConnection = new HubConnection(new TestConnection(), mockProtocol, null);
|
||||||
await hubConnection.StartAsync(TransportType.All, httpClient: null);
|
await hubConnection.StartAsync();
|
||||||
|
|
||||||
var actualException =
|
var actualException =
|
||||||
await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test"));
|
await Assert.ThrowsAsync<InvalidOperationException>(async () => await hubConnection.Invoke<int>("test"));
|
||||||
|
|
@ -137,75 +55,43 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task HubConnectionConnectedEventRaisedWhenTheClientIsConnected()
|
public async Task HubConnectionConnectedEventRaisedWhenTheClientIsConnected()
|
||||||
{
|
{
|
||||||
var mockHttpHandler = new Mock<HttpMessageHandler>();
|
var connection = new TestConnection();
|
||||||
mockHttpHandler.Protected()
|
var hubConnection = new HubConnection(connection);
|
||||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
try
|
||||||
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
|
|
||||||
{
|
|
||||||
await Task.Yield();
|
|
||||||
return request.Method == HttpMethod.Options
|
|
||||||
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
|
|
||||||
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
|
|
||||||
});
|
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
|
||||||
{
|
{
|
||||||
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"), new LoggerFactory());
|
var connectedEventRaisedTcs = new TaskCompletionSource<object>();
|
||||||
try
|
hubConnection.Connected += () => connectedEventRaisedTcs.SetResult(null);
|
||||||
{
|
|
||||||
var connectedEventRaisedTcs = new TaskCompletionSource<object>();
|
|
||||||
hubConnection.Connected += () => connectedEventRaisedTcs.SetResult(null);
|
|
||||||
|
|
||||||
await hubConnection.StartAsync(TransportType.LongPolling, httpClient);
|
await hubConnection.StartAsync();
|
||||||
|
|
||||||
await connectedEventRaisedTcs.Task.OrTimeout();
|
await connectedEventRaisedTcs.Task.OrTimeout();
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await hubConnection.DisposeAsync();
|
await hubConnection.DisposeAsync();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task ClosedEventRaisedWhenTheClientIsStopped()
|
public async Task ClosedEventRaisedWhenTheClientIsStopped()
|
||||||
{
|
{
|
||||||
var mockHttpHandler = new Mock<HttpMessageHandler>();
|
var hubConnection = new HubConnection(new TestConnection());
|
||||||
mockHttpHandler.Protected()
|
var closedEventTcs = new TaskCompletionSource<Exception>();
|
||||||
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
|
hubConnection.Closed += e => closedEventTcs.SetResult(e);
|
||||||
.Returns<HttpRequestMessage, CancellationToken>(async (request, cancellationToken) =>
|
|
||||||
{
|
|
||||||
await Task.Yield();
|
|
||||||
return request.Method == HttpMethod.Options
|
|
||||||
? ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK, ResponseUtils.CreateNegotiationResponse())
|
|
||||||
: ResponseUtils.CreateResponse(System.Net.HttpStatusCode.OK);
|
|
||||||
});
|
|
||||||
|
|
||||||
using (var httpClient = new HttpClient(mockHttpHandler.Object))
|
await hubConnection.StartAsync();
|
||||||
{
|
await hubConnection.DisposeAsync();
|
||||||
var hubConnection = new HubConnection(new Uri("http://fakeuri.org"), new LoggerFactory());
|
|
||||||
var closedEventTcs = new TaskCompletionSource<Exception>();
|
|
||||||
hubConnection.Closed += e => closedEventTcs.SetResult(e);
|
|
||||||
|
|
||||||
await hubConnection.StartAsync(TransportType.LongPolling, httpClient);
|
Assert.Null(await closedEventTcs.Task.OrTimeout());
|
||||||
await hubConnection.DisposeAsync();
|
|
||||||
|
|
||||||
Assert.Null(await closedEventTcs.Task.OrTimeout());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task CannotCallInvokeOnClosedHubConnection()
|
public async Task CannotCallInvokeOnClosedHubConnection()
|
||||||
{
|
{
|
||||||
var mockConnection = new Mock<IConnection>();
|
var connection = new TestConnection();
|
||||||
mockConnection
|
var hubConnection = new HubConnection(connection, new LoggerFactory());
|
||||||
.Setup(m => m.DisposeAsync())
|
|
||||||
.Callback(() => mockConnection.Raise(c => c.Closed += null, (Exception)null))
|
|
||||||
.Returns(Task.FromResult<object>(null));
|
|
||||||
|
|
||||||
var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory());
|
await hubConnection.StartAsync();
|
||||||
|
|
||||||
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null);
|
|
||||||
await hubConnection.DisposeAsync();
|
await hubConnection.DisposeAsync();
|
||||||
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
var exception = await Assert.ThrowsAsync<InvalidOperationException>(
|
||||||
async () => await hubConnection.Invoke<int>("test"));
|
async () => await hubConnection.Invoke<int>("test"));
|
||||||
|
|
@ -216,15 +102,10 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task PendingInvocationsAreCancelledWhenConnectionClosesCleanly()
|
public async Task PendingInvocationsAreCancelledWhenConnectionClosesCleanly()
|
||||||
{
|
{
|
||||||
var mockConnection = new Mock<IConnection>();
|
var connection = new TestConnection();
|
||||||
mockConnection
|
var hubConnection = new HubConnection(connection, new LoggerFactory());
|
||||||
.Setup(m => m.DisposeAsync())
|
|
||||||
.Callback(() => mockConnection.Raise(c => c.Closed += null, (Exception)null))
|
|
||||||
.Returns(Task.FromResult<object>(null));
|
|
||||||
|
|
||||||
var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory());
|
await hubConnection.StartAsync();
|
||||||
|
|
||||||
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null);
|
|
||||||
var invokeTask = hubConnection.Invoke<int>("testMethod");
|
var invokeTask = hubConnection.Invoke<int>("testMethod");
|
||||||
await hubConnection.DisposeAsync();
|
await hubConnection.DisposeAsync();
|
||||||
|
|
||||||
|
|
@ -243,7 +124,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
|
|
||||||
var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory());
|
var hubConnection = new HubConnection(mockConnection.Object, new LoggerFactory());
|
||||||
|
|
||||||
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null);
|
await hubConnection.StartAsync();
|
||||||
var invokeTask = hubConnection.Invoke<int>("testMethod");
|
var invokeTask = hubConnection.Invoke<int>("testMethod");
|
||||||
await hubConnection.DisposeAsync();
|
await hubConnection.DisposeAsync();
|
||||||
|
|
||||||
|
|
@ -261,7 +142,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
var mockProtocol = MockHubProtocol.ReturnOnParse(invocation);
|
var mockProtocol = MockHubProtocol.ReturnOnParse(invocation);
|
||||||
|
|
||||||
var hubConnection = new HubConnection(mockConnection.Object, mockProtocol, null);
|
var hubConnection = new HubConnection(mockConnection.Object, mockProtocol, null);
|
||||||
await hubConnection.StartAsync(new TestTransportFactory(Mock.Of<ITransport>()), httpClient: null);
|
await hubConnection.StartAsync();
|
||||||
|
|
||||||
mockConnection.Raise(c => c.Received += null, new object[] { new byte[] { } });
|
mockConnection.Raise(c => c.Received += null, new object[] { new byte[] { } });
|
||||||
Assert.Equal(1, mockProtocol.ParseCalls);
|
Assert.Equal(1, mockProtocol.ParseCalls);
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client\Microsoft.AspNetCore.Sockets.Client.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(AspNetCoreVersion)" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(AspNetCoreVersion)" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(AspNetCoreVersion)" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(AspNetCoreVersion)" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(TestSdkVersion)" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(TestSdkVersion)" />
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
||||||
throw new ObjectDisposedException("Unable to send message, underlying channel was closed");
|
throw new ObjectDisposedException("Unable to send message, underlying channel was closed");
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task StartAsync(ITransportFactory transportFactory, HttpClient httpClient)
|
public Task StartAsync()
|
||||||
{
|
{
|
||||||
_started.TrySetResult(null);
|
_started.TrySetResult(null);
|
||||||
Connected?.Invoke();
|
Connected?.Invoke();
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Common\Microsoft.AspNetCore.SignalR.Common.csproj" />
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Common\Microsoft.AspNetCore.Sockets.Common.csproj" />
|
|
||||||
<PackageReference Include="BenchmarkDotNet" Version="0.10.3" />
|
<PackageReference Include="BenchmarkDotNet" Version="0.10.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Logging.Testing;
|
using Microsoft.Extensions.Logging.Testing;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using Xunit.Abstractions;
|
using Xunit.Abstractions;
|
||||||
using ClientConnection = Microsoft.AspNetCore.Sockets.Client.Connection;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.SignalR.Tests
|
namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
{
|
{
|
||||||
|
|
@ -88,7 +87,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
const string message = "Major Key";
|
const string message = "Major Key";
|
||||||
|
|
||||||
var url = _serverFixture.BaseUrl + "/echo";
|
var url = _serverFixture.BaseUrl + "/echo";
|
||||||
var connection = new ClientConnection(new Uri(url), loggerFactory);
|
var connection = new HttpConnection(new Uri(url), transportType, loggerFactory);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var receiveTcs = new TaskCompletionSource<string>();
|
var receiveTcs = new TaskCompletionSource<string>();
|
||||||
|
|
@ -114,7 +113,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
};
|
};
|
||||||
|
|
||||||
logger.LogInformation("Starting connection to {url}", url);
|
logger.LogInformation("Starting connection to {url}", url);
|
||||||
await connection.StartAsync(transportType).OrTimeout();
|
await connection.StartAsync().OrTimeout();
|
||||||
logger.LogInformation("Started connection to {url}", url);
|
logger.LogInformation("Started connection to {url}", url);
|
||||||
|
|
||||||
var bytes = Encoding.UTF8.GetBytes(message);
|
var bytes = Encoding.UTF8.GetBytes(message);
|
||||||
|
|
@ -156,7 +155,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||||
|
|
||||||
var url = _serverFixture.BaseUrl + "/echo";
|
var url = _serverFixture.BaseUrl + "/echo";
|
||||||
var connection = new ClientConnection(new Uri(url), loggerFactory);
|
var connection = new HttpConnection(new Uri(url), loggerFactory);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var receiveTcs = new TaskCompletionSource<byte[]>();
|
var receiveTcs = new TaskCompletionSource<byte[]>();
|
||||||
|
|
@ -167,7 +166,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
};
|
};
|
||||||
|
|
||||||
logger.LogInformation("Starting connection to {url}", url);
|
logger.LogInformation("Starting connection to {url}", url);
|
||||||
await connection.StartAsync(TransportType.WebSockets).OrTimeout();
|
await connection.StartAsync().OrTimeout();
|
||||||
logger.LogInformation("Started connection to {url}", url);
|
logger.LogInformation("Started connection to {url}", url);
|
||||||
|
|
||||||
var bytes = Encoding.UTF8.GetBytes(message);
|
var bytes = Encoding.UTF8.GetBytes(message);
|
||||||
|
|
@ -213,7 +212,8 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
var logger = loggerFactory.CreateLogger<EndToEndTests>();
|
||||||
|
|
||||||
var url = _serverFixture.BaseUrl + "/uncreatable";
|
var url = _serverFixture.BaseUrl + "/uncreatable";
|
||||||
var connection = new HubConnection(new Uri(url), loggerFactory);
|
|
||||||
|
var connection = new HubConnection(new HttpConnection(new Uri(url), transportType, loggerFactory), loggerFactory);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var closeTcs = new TaskCompletionSource<object>();
|
var closeTcs = new TaskCompletionSource<object>();
|
||||||
|
|
@ -232,7 +232,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
||||||
};
|
};
|
||||||
|
|
||||||
logger.LogInformation("Starting connection to {url}", url);
|
logger.LogInformation("Starting connection to {url}", url);
|
||||||
await connection.StartAsync(transportType).OrTimeout();
|
await connection.StartAsync().OrTimeout();
|
||||||
|
|
||||||
await closeTcs.Task.OrTimeout();
|
await closeTcs.Task.OrTimeout();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Client.Http\Microsoft.AspNetCore.Sockets.Client.Http.csproj" />
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Sockets.Http\Microsoft.AspNetCore.Sockets.Http.csproj" />
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Http\Microsoft.AspNetCore.SignalR.Http.csproj" />
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.SignalR.Client\Microsoft.AspNetCore.SignalR.Client.csproj" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue