Skip to content

Commit 4b2aa3d

Browse files
committed
http session connect async
1 parent 30a597a commit 4b2aa3d

File tree

8 files changed

+63
-16
lines changed

8 files changed

+63
-16
lines changed

.husky/pre-push

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#!/usr/bin/env sh
22
. "$(dirname -- "$0")/_/husky.sh"
33

4-
dotnet test --no-restore tests/SocketIOClient.UnitTests
4+
dotnet test --no-restore tests/SocketIOClient.UnitTests
5+
dotnet test --no-restore tests/SocketIOClient.Serializer.Tests
6+
dotnet test --no-restore tests/SocketIOClient.Serializer.NewtonsoftJson.Tests

src/SocketIOClient/SocketIOClient.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
</PropertyGroup>
2525

2626
<ItemGroup>
27-
<ProjectReference Include="..\..\SocketIOClient.Core\SocketIOClient.Core.csproj" />
28-
<ProjectReference Include="..\..\SocketIOClient.Serializer\SocketIOClient.Serializer.csproj" />
2927
<ProjectReference Include="..\SocketIO.Serializer.Core\SocketIO.Serializer.Core.csproj" />
3028
<ProjectReference Include="..\SocketIO.Serializer.SystemTextJson\SocketIO.Serializer.SystemTextJson.csproj" />
3129
<ProjectReference Include="..\SocketIOClient.Core\SocketIOClient.Core.csproj" />

src/SocketIOClient/V2/Protocol/Http/HttpAdapter.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class HttpAdapter(IHttpClient httpClient) : IHttpAdapter
1111
{
1212
private readonly List<IMyObserver<ProtocolMessage>> _observers = [];
1313

14-
private async Task<IHttpResponse> GetResponseAsync(ProtocolMessage message, CancellationToken cancellationToken)
14+
private async Task<IHttpResponse> SendProtocolMessageAsync(ProtocolMessage message, CancellationToken cancellationToken)
1515
{
1616
var req = new HttpRequest
1717
{
@@ -35,7 +35,7 @@ private async Task<IHttpResponse> GetResponseAsync(ProtocolMessage message, Canc
3535
private static async Task<ProtocolMessage> GetMessageAsync(IHttpResponse response)
3636
{
3737
var message = new ProtocolMessage();
38-
if (response.MediaType.Equals("application/octet-stream", StringComparison.InvariantCultureIgnoreCase))
38+
if (response.MediaType.Equals(MediaTypeNames.Application.Octet, StringComparison.InvariantCultureIgnoreCase))
3939
{
4040
message.Type = ProtocolMessageType.Bytes;
4141
message.Bytes = await response.ReadAsByteArrayAsync();
@@ -50,14 +50,25 @@ private static async Task<ProtocolMessage> GetMessageAsync(IHttpResponse respons
5050

5151
public async Task SendAsync(ProtocolMessage message, CancellationToken cancellationToken)
5252
{
53-
var response = await GetResponseAsync(message, cancellationToken);
53+
var response = await SendProtocolMessageAsync(message, cancellationToken);
54+
await HandleResponseAsync(response);
55+
}
56+
57+
private async Task HandleResponseAsync(IHttpResponse response)
58+
{
5459
var incomingMessage = await GetMessageAsync(response);
5560
foreach (var observer in _observers)
5661
{
5762
observer.OnNext(incomingMessage);
5863
}
5964
}
6065

66+
public async Task SendAsync(IHttpRequest req, CancellationToken cancellationToken)
67+
{
68+
var response = await httpClient.SendAsync(req, cancellationToken);
69+
await HandleResponseAsync(response);
70+
}
71+
6172
public void Subscribe(IMyObserver<ProtocolMessage> observer)
6273
{
6374
if (_observers.Contains(observer))
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
14
namespace SocketIOClient.V2.Protocol.Http;
25

3-
public interface IHttpAdapter : IProtocolAdapter//, IHttpResponseObserver
6+
public interface IHttpAdapter : IProtocolAdapter
47
{
8+
Task SendAsync(IHttpRequest req, CancellationToken cancellationToken);
59
}

src/SocketIOClient/V2/Session/HttpSession.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ public async Task SendAsync(IMessage message, CancellationToken cancellationToke
106106
}
107107
// TODO: serialize by message.Type
108108
// var protocolMessages = serializer.Serialize()
109+
110+
// _serializer.Serialize()
109111
await _httpAdapter.SendAsync(null, cancellationToken);
110112
throw new NotImplementedException();
111113
}
@@ -117,13 +119,13 @@ public async Task ConnectAsync(CancellationToken cancellationToken)
117119
SessionOptions.ServerUri,
118120
SessionOptions.Path,
119121
SessionOptions.Query);
120-
var message = new ProtocolMessage
122+
var req = new HttpRequest
121123
{
122-
Text = string.Empty,
124+
Uri = uri,
123125
};
124126
try
125127
{
126-
await _httpAdapter.SendAsync(message, cancellationToken);
128+
await _httpAdapter.SendAsync(req, cancellationToken);
127129
}
128130
catch (Exception e)
129131
{

tests/SocketIOClient.Serializer.Tests/SocketIOClient.Serializer.Tests.csproj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
<IsPackable>false</IsPackable>
99
<IsTestProject>true</IsTestProject>
10+
<LangVersion>default</LangVersion>
1011
</PropertyGroup>
1112

1213
<ItemGroup>
@@ -23,10 +24,7 @@
2324
</ItemGroup>
2425

2526
<ItemGroup>
26-
<ProjectReference Include="..\..\SocketIOClient.Core\SocketIOClient.Core.csproj" />
27-
<ProjectReference Include="..\..\SocketIOClient.Serializer\SocketIOClient.Serializer.csproj" />
2827
<ProjectReference Include="..\..\src\SocketIOClient.Core\SocketIOClient.Core.csproj" />
2928
<ProjectReference Include="..\..\src\SocketIOClient.Serializer\SocketIOClient.Serializer.csproj" />
3029
</ItemGroup>
31-
3230
</Project>

tests/SocketIOClient.UnitTests/V2/Protocol/Http/HttpAdapterTests.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public HttpAdapterTests()
2020
private readonly IHttpClient _httpClient;
2121

2222
[Fact]
23-
public async Task SendAsync_WhenCalled_OnNextShouldBeTriggered()
23+
public async Task SendProtocolMessageAsync_WhenCalled_OnNextShouldBeTriggered()
2424
{
2525
var observer = Substitute.For<IMyObserver<ProtocolMessage>>();
2626
_httpAdapter.Subscribe(observer);
@@ -29,4 +29,15 @@ public async Task SendAsync_WhenCalled_OnNextShouldBeTriggered()
2929

3030
observer.Received().OnNext(Arg.Any<ProtocolMessage>());
3131
}
32+
33+
[Fact]
34+
public async Task SendHttpRequestAsync_WhenCalled_OnNextShouldBeTriggered()
35+
{
36+
var observer = Substitute.For<IMyObserver<ProtocolMessage>>();
37+
_httpAdapter.Subscribe(observer);
38+
39+
await _httpAdapter.SendAsync(new HttpRequest(), CancellationToken.None);
40+
41+
observer.Received().OnNext(Arg.Any<ProtocolMessage>());
42+
}
3243
}

tests/SocketIOClient.UnitTests/V2/Session/HttpSessionTests.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Net.Http;
45
using System.Text.Json;
56
using System.Threading;
@@ -55,7 +56,7 @@ await _session.Invoking(async x => await x.SendAsync(null, CancellationToken.Non
5556
public async Task ConnectAsync_HttpAdapterThrowAnyException_SessionThrowConnectionFailedException()
5657
{
5758
_httpAdapter
58-
.SendAsync(Arg.Any<ProtocolMessage>(), Arg.Any<CancellationToken>())
59+
.SendAsync(Arg.Any<IHttpRequest>(), Arg.Any<CancellationToken>())
5960
.Throws(new HttpRequestException("Server refused connection"));
6061

6162
await _session.Invoking(async x => await x.ConnectAsync(CancellationToken.None))
@@ -66,11 +67,31 @@ await _session.Invoking(async x => await x.ConnectAsync(CancellationToken.None))
6667
.WithMessage("Server refused connection");
6768
}
6869

70+
[Fact]
71+
public async Task ConnectAsync_WhenCalled_PassCorrectHttpRequestToAdapter()
72+
{
73+
var requests = new List<IHttpRequest>();
74+
_httpAdapter
75+
.When(async a => await a.SendAsync(Arg.Any<IHttpRequest>(), Arg.Any<CancellationToken>()))
76+
.Do(callInfo => { requests.Add(callInfo.Arg<IHttpRequest>()); });
77+
78+
await _session.ConnectAsync(CancellationToken.None);
79+
80+
requests.Should()
81+
.BeEquivalentTo([
82+
new HttpRequest
83+
{
84+
Uri = new Uri("http://localhost:3000/socket.io/?EIO=4&transport=polling"),
85+
Method = RequestMethod.Get,
86+
},
87+
]);
88+
}
89+
6990
[Fact]
7091
public async Task ConnectAsync_CancelledToken_ThrowConnectionFailedException()
7192
{
7293
_httpAdapter
73-
.SendAsync(Arg.Any<ProtocolMessage>(), Arg.Is<CancellationToken>(t => t.IsCancellationRequested))
94+
.SendAsync(Arg.Any<IHttpRequest>(), Arg.Is<CancellationToken>(t => t.IsCancellationRequested))
7495
.Throws(new TaskCanceledException("Task was canceled"));
7596

7697
await _session.Invoking(async x =>

0 commit comments

Comments
 (0)