Skip to content

Commit 969c72a

Browse files
C++ client low level API (#8420)
1 parent b7e122f commit 969c72a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1406
-788
lines changed

src/Servers/Kestrel/test/BindTests/AddressRegistrationTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public async Task RegisterIPEndPoint_IPv6StaticPort_Success()
100100
[ConditionalTheory]
101101
[MemberData(nameof(IPEndPointRegistrationDataDynamicPort))]
102102
[IPv6SupportedCondition]
103+
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/2074", FlakyOn.AzP.macOS)]
103104
public async Task RegisterIPEndPoint_DynamicPort_Success(IPEndPoint endPoint, string testUrl)
104105
{
105106
await RegisterIPEndPoint_Success(endPoint, testUrl);
@@ -447,6 +448,7 @@ public Task DefaultsServerAddress_BindsToIPv4WithHttps()
447448

448449
[ConditionalFact]
449450
[IPv6SupportedCondition]
451+
[Flaky("https://github.com/aspnet/AspNetCore-Internal/issues/1756", FlakyOn.AzP.macOS)]
450452
public Task DefaultsServerAddress_BindsToIPv6WithHttps()
451453
{
452454
if (!CanBindToEndpoint(IPAddress.Loopback, 5000) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5000)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
#pragma once
5+
6+
#include <string>
7+
#include <functional>
8+
#include <map>
9+
#include <chrono>
10+
11+
namespace signalr
12+
{
13+
enum class http_method
14+
{
15+
GET,
16+
POST
17+
};
18+
19+
class http_request
20+
{
21+
public:
22+
http_method method;
23+
std::map<std::string, std::string> headers;
24+
std::string content;
25+
std::chrono::seconds timeout;
26+
};
27+
28+
class http_response
29+
{
30+
public:
31+
http_response() {}
32+
http_response(http_response&& rhs) noexcept : status_code(rhs.status_code), content(std::move(rhs.content)) {}
33+
http_response(int code, const std::string& content) : status_code(code), content(content) {}
34+
35+
http_response& operator=(http_response&& rhs)
36+
{
37+
status_code = rhs.status_code;
38+
content = std::move(rhs.content);
39+
40+
return *this;
41+
}
42+
43+
int status_code = 0;
44+
std::string content;
45+
};
46+
47+
class http_client
48+
{
49+
public:
50+
virtual void send(std::string url, http_request request, std::function<void(http_response, std::exception_ptr)> callback) = 0;
51+
52+
virtual ~http_client() {}
53+
};
54+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
#pragma once
5+
6+
namespace signalr
7+
{
8+
enum class transfer_format
9+
{
10+
text,
11+
binary
12+
};
13+
}

src/SignalR/clients/cpp/include/signalrclient/transport_type.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ namespace signalr
1010
long_polling,
1111
websockets
1212
};
13-
}
13+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
#pragma once
5+
6+
#include "transfer_format.h"
7+
8+
namespace signalr
9+
{
10+
class websocket_client
11+
{
12+
public:
13+
virtual ~websocket_client() {};
14+
15+
virtual void start(std::string url, transfer_format format, std::function<void(std::exception_ptr)> callback) = 0;
16+
17+
virtual void stop(std::function<void(std::exception_ptr)> callback) = 0;
18+
19+
virtual void send(std::string payload, std::function<void(std::exception_ptr)> callback) = 0;
20+
21+
virtual void receive(std::function<void(std::string, std::exception_ptr)> callback) = 0;
22+
};
23+
}

src/SignalR/clients/cpp/samples/HubConnectionSample/HubConnectionSample.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@ class logger : public signalr::log_writer
1717
}
1818
};
1919

20-
void send_message(signalr::hub_connection& connection, const std::string& name, const std::string& message)
20+
void send_message(signalr::hub_connection& connection, const std::string& message)
2121
{
2222
web::json::value args{};
23-
args[0] = web::json::value::string(utility::conversions::to_string_t(name));
24-
args[1] = web::json::value(utility::conversions::to_string_t(message));
23+
args[0] = web::json::value(utility::conversions::to_string_t(message));
2524

2625
// if you get an internal compiler error uncomment the lambda below or install VS Update 4
27-
connection.invoke("Invoke", args/*, [](const web::json::value&){}*/)
26+
connection.invoke("Send", args)
2827
.then([](pplx::task<web::json::value> invoke_task) // fire and forget but we need to observe exceptions
2928
{
3029
try
@@ -39,7 +38,7 @@ void send_message(signalr::hub_connection& connection, const std::string& name,
3938
});
4039
}
4140

42-
void chat(const std::string& name)
41+
void chat()
4342
{
4443
signalr::hub_connection connection("http://localhost:5000/default", signalr::trace_level::all, std::make_shared<logger>());
4544
connection.on("Send", [](const web::json::value& m)
@@ -48,7 +47,7 @@ void chat(const std::string& name)
4847
});
4948

5049
connection.start()
51-
.then([&connection, name]()
50+
.then([&connection]()
5251
{
5352
ucout << U("Enter your message:");
5453
for (;;)
@@ -61,7 +60,7 @@ void chat(const std::string& name)
6160
break;
6261
}
6362

64-
send_message(connection, name, message);
63+
send_message(connection, message);
6564
}
6665
})
6766
.then([&connection]() // fine to capture by reference - we are blocking so it is guaranteed to be valid
@@ -84,11 +83,7 @@ void chat(const std::string& name)
8483

8584
int main()
8685
{
87-
ucout << U("Enter your name: ");
88-
std::string name;
89-
std::getline(std::cin, name);
90-
91-
chat(name);
86+
chat();
9287

9388
return 0;
9489
}

src/SignalR/clients/cpp/src/signalrclient/Build/VS/signalrclient.vcxproj

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,32 +41,35 @@
4141
<ItemGroup>
4242
<ClInclude Include="..\..\..\..\include\signalrclient\connection.h" />
4343
<ClInclude Include="..\..\..\..\include\signalrclient\connection_state.h" />
44+
<ClInclude Include="..\..\..\..\include\signalrclient\http_client.h" />
4445
<ClInclude Include="..\..\..\..\include\signalrclient\hub_connection.h" />
4546
<ClInclude Include="..\..\..\..\include\signalrclient\hub_exception.h" />
4647
<ClInclude Include="..\..\..\..\include\signalrclient\log_writer.h" />
4748
<ClInclude Include="..\..\..\..\include\signalrclient\signalr_client_config.h" />
4849
<ClInclude Include="..\..\..\..\include\signalrclient\signalr_exception.h" />
4950
<ClInclude Include="..\..\..\..\include\signalrclient\trace_level.h" />
51+
<ClInclude Include="..\..\..\..\include\signalrclient\transfer_format.h" />
5052
<ClInclude Include="..\..\..\..\include\signalrclient\transport_type.h" />
53+
<ClInclude Include="..\..\..\..\include\signalrclient\websocket_client.h" />
5154
<ClInclude Include="..\..\..\..\include\signalrclient\web_exception.h" />
5255
<ClInclude Include="..\..\..\..\include\signalrclient\_exports.h" />
5356
<ClInclude Include="..\..\case_insensitive_comparison_utils.h" />
5457
<ClInclude Include="..\..\connection_impl.h" />
5558
<ClInclude Include="..\..\constants.h" />
59+
<ClInclude Include="..\..\default_http_client.h" />
5660
<ClInclude Include="..\..\default_websocket_client.h" />
5761
<ClInclude Include="..\..\event.h" />
5862
<ClInclude Include="..\..\http_sender.h" />
5963
<ClInclude Include="..\..\hub_connection_impl.h" />
6064
<ClInclude Include="..\..\callback_manager.h" />
6165
<ClInclude Include="..\..\logger.h" />
6266
<ClInclude Include="..\..\negotiation_response.h" />
63-
<ClInclude Include="..\..\request_sender.h" />
67+
<ClInclude Include="..\..\negotiate.h" />
6468
<ClInclude Include="..\..\stdafx.h" />
6569
<ClInclude Include="..\..\trace_log_writer.h" />
6670
<ClInclude Include="..\..\transport.h" />
6771
<ClInclude Include="..\..\transport_factory.h" />
6872
<ClInclude Include="..\..\url_builder.h" />
69-
<ClInclude Include="..\..\websocket_client.h" />
7073
<ClInclude Include="..\..\websocket_transport.h" />
7174
<ClInclude Include="..\..\web_request.h" />
7275
<ClInclude Include="..\..\web_request_factory.h" />
@@ -75,12 +78,13 @@
7578
<ItemGroup>
7679
<ClCompile Include="..\..\connection.cpp" />
7780
<ClCompile Include="..\..\connection_impl.cpp" />
81+
<ClCompile Include="..\..\default_http_client.cpp" />
7882
<ClCompile Include="..\..\http_sender.cpp" />
7983
<ClCompile Include="..\..\hub_connection.cpp" />
8084
<ClCompile Include="..\..\hub_connection_impl.cpp" />
8185
<ClCompile Include="..\..\callback_manager.cpp" />
8286
<ClCompile Include="..\..\logger.cpp" />
83-
<ClCompile Include="..\..\request_sender.cpp" />
87+
<ClCompile Include="..\..\negotiate.cpp" />
8488
<ClCompile Include="..\..\signalr_client_config.cpp" />
8589
<ClCompile Include="..\..\stdafx.cpp">
8690
<PrecompiledHeader>Create</PrecompiledHeader>
@@ -105,4 +109,4 @@
105109
<PackageReference Include="cpprestsdk.v140.windesktop.msvcstl.dyn.rt-dyn" Version="2.9.1" />
106110
</ItemGroup>
107111
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
108-
</Project>
112+
</Project>

src/SignalR/clients/cpp/src/signalrclient/Build/VS/signalrclient.vcxproj.filters

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@
4545
<ClInclude Include="..\..\negotiation_response.h">
4646
<Filter>Header Files</Filter>
4747
</ClInclude>
48-
<ClInclude Include="..\..\request_sender.h">
49-
<Filter>Header Files</Filter>
50-
</ClInclude>
5148
<ClInclude Include="..\..\websocket_transport.h">
5249
<Filter>Header Files</Filter>
5350
</ClInclude>
@@ -57,9 +54,6 @@
5754
<ClInclude Include="..\..\..\..\include\signalrclient\connection_state.h">
5855
<Filter>Header Files</Filter>
5956
</ClInclude>
60-
<ClInclude Include="..\..\websocket_client.h">
61-
<Filter>Header Files</Filter>
62-
</ClInclude>
6357
<ClInclude Include="..\..\default_websocket_client.h">
6458
<Filter>Header Files</Filter>
6559
</ClInclude>
@@ -111,6 +105,21 @@
111105
<ClInclude Include="..\..\..\..\include\signalrclient\signalr_client_config.h">
112106
<Filter>Header Files</Filter>
113107
</ClInclude>
108+
<ClInclude Include="..\..\default_http_client.h">
109+
<Filter>Header Files</Filter>
110+
</ClInclude>
111+
<ClInclude Include="..\..\negotiate.h">
112+
<Filter>Header Files</Filter>
113+
</ClInclude>
114+
<ClInclude Include="..\..\..\..\include\signalrclient\http_client.h">
115+
<Filter>Header Files</Filter>
116+
</ClInclude>
117+
<ClInclude Include="..\..\..\..\include\signalrclient\transfer_format.h">
118+
<Filter>Header Files</Filter>
119+
</ClInclude>
120+
<ClInclude Include="..\..\..\..\include\signalrclient\websocket_client.h">
121+
<Filter>Header Files</Filter>
122+
</ClInclude>
114123
</ItemGroup>
115124
<ItemGroup>
116125
<ClCompile Include="..\..\stdafx.cpp">
@@ -164,7 +173,10 @@
164173
<ClCompile Include="..\..\signalr_client_config.cpp">
165174
<Filter>Source Files</Filter>
166175
</ClCompile>
167-
<ClCompile Include="..\..\request_sender.cpp">
176+
<ClCompile Include="..\..\default_http_client.cpp">
177+
<Filter>Source Files</Filter>
178+
</ClCompile>
179+
<ClCompile Include="..\..\negotiate.cpp">
168180
<Filter>Source Files</Filter>
169181
</ClCompile>
170182
</ItemGroup>

0 commit comments

Comments
 (0)