13
13
*/
14
14
#include < aws/discovery/DiscoveryClient.h>
15
15
16
+ #include < aws/crt/Api.h>
16
17
#include < aws/crt/Types.h>
18
+ #include < aws/crt/http/HttpRequestResponse.h>
17
19
#include < aws/crt/io/TlsOptions.h>
18
20
#include < aws/crt/io/Uri.h>
19
21
@@ -22,23 +24,23 @@ namespace Aws
22
24
namespace Discovery
23
25
{
24
26
DiscoveryClientConfig::DiscoveryClientConfig () noexcept
25
- : allocator(Crt::DefaultAllocator()), bootstrap(nullptr ), tlsContext(nullptr ), socketOptions(nullptr ),
26
- region (" us-east-1" ), maxConnections(2 )
27
+ : Bootstrap(nullptr ), TlsContext(), SocketOptions(), Region(), MaxConnections(2 ), ProxyOptions()
27
28
{
28
29
}
29
30
30
- DiscoveryClient::DiscoveryClient (const Aws::Discovery::DiscoveryClientConfig &clientConfig) noexcept
31
+ DiscoveryClient::DiscoveryClient (
32
+ const Aws::Discovery::DiscoveryClientConfig &clientConfig,
33
+ Crt::Allocator *allocator) noexcept
31
34
{
32
- AWS_ASSERT (clientConfig.tlsContext );
33
- AWS_ASSERT (clientConfig.bootstrap );
34
- AWS_ASSERT (clientConfig.socketOptions );
35
+ AWS_FATAL_ASSERT (clientConfig.TlsContext );
36
+ AWS_FATAL_ASSERT (clientConfig.Bootstrap );
35
37
36
- m_allocator = clientConfig. allocator ;
38
+ m_allocator = allocator;
37
39
38
40
Crt::StringStream ss;
39
- ss << " greengrass-ats.iot." << clientConfig.region << " .amazonaws.com" ;
41
+ ss << " greengrass-ats.iot." << clientConfig.Region << " .amazonaws.com" ;
40
42
41
- Crt::Io::TlsConnectionOptions tlsConnectionOptions = clientConfig.tlsContext ->NewConnectionOptions ();
43
+ Crt::Io::TlsConnectionOptions tlsConnectionOptions = clientConfig.TlsContext ->NewConnectionOptions ();
42
44
uint16_t port = 443 ;
43
45
44
46
if (Crt::Io::TlsContextOptions::IsAlpnSupported ())
@@ -54,17 +56,38 @@ namespace Aws
54
56
Crt::ByteCursor serverName = Crt::ByteCursorFromCString (m_hostName.c_str ());
55
57
tlsConnectionOptions.SetServerName (serverName);
56
58
59
+ Crt::Http::HttpClientConnectionOptions connectionOptions;
60
+ connectionOptions.SocketOptions = clientConfig.SocketOptions ;
61
+ connectionOptions.Bootstrap = clientConfig.Bootstrap ;
62
+ connectionOptions.TlsOptions = tlsConnectionOptions;
63
+ connectionOptions.HostName = Crt::String ((const char *)serverName.ptr , serverName.len );
64
+ connectionOptions.Port = port;
65
+ if (clientConfig.ProxyOptions )
66
+ {
67
+ connectionOptions.ProxyOptions = *clientConfig.ProxyOptions ;
68
+ }
69
+
57
70
Crt::Http::HttpClientConnectionManagerOptions connectionManagerOptions;
58
- connectionManagerOptions.socketOptions = clientConfig.socketOptions ;
59
- connectionManagerOptions.bootstrap = clientConfig.bootstrap ;
60
- connectionManagerOptions.tlsConnectionOptions = &tlsConnectionOptions;
61
- connectionManagerOptions.maxConnections = clientConfig.maxConnections ;
62
- connectionManagerOptions.initialWindowSize = SIZE_MAX;
63
- connectionManagerOptions.hostName = serverName;
64
- connectionManagerOptions.port = port;
65
-
66
- m_connectionManager = Crt::Http::HttpClientConnectionManager::NewClientConnectionManager (
67
- connectionManagerOptions, clientConfig.allocator );
71
+ connectionManagerOptions.ConnectionOptions = connectionOptions;
72
+ connectionManagerOptions.MaxConnections = clientConfig.MaxConnections ;
73
+
74
+ m_connectionManager =
75
+ Crt::Http::HttpClientConnectionManager::NewClientConnectionManager (connectionManagerOptions, allocator);
76
+ }
77
+
78
+ std::shared_ptr<DiscoveryClient> DiscoveryClient::CreateClient (
79
+ const Aws::Discovery::DiscoveryClientConfig &clientConfig,
80
+ Crt::Allocator *allocator)
81
+ {
82
+ auto *toSeat = static_cast <DiscoveryClient *>(aws_mem_acquire (allocator, sizeof (DiscoveryClient)));
83
+ if (toSeat)
84
+ {
85
+ toSeat = new (toSeat) DiscoveryClient (clientConfig, allocator);
86
+ return std::shared_ptr<DiscoveryClient>(
87
+ toSeat, [allocator](DiscoveryClient *client) { Crt::Delete (client, allocator); });
88
+ }
89
+
90
+ return nullptr ;
68
91
}
69
92
70
93
struct ClientCallbackContext
@@ -77,8 +100,7 @@ namespace Aws
77
100
const Crt::String &thingName,
78
101
const OnDiscoverResponse &onDiscoverResponse) noexcept
79
102
{
80
-
81
- auto *callbackContext = Crt::New<ClientCallbackContext>(m_allocator);
103
+ auto callbackContext = Crt::MakeShared<ClientCallbackContext>(m_allocator);
82
104
if (!callbackContext)
83
105
{
84
106
return false ;
@@ -89,69 +111,81 @@ namespace Aws
89
111
bool res = m_connectionManager->AcquireConnection (
90
112
[this , callbackContext, thingName, onDiscoverResponse](
91
113
std::shared_ptr<Crt::Http::HttpClientConnection> connection, int errorCode) {
92
- if (! errorCode)
114
+ if (errorCode)
93
115
{
94
- Crt::StringStream ss;
95
- ss << " /greengrass/discover/thing/" << thingName;
96
- Crt::String uriStr = ss.str ();
97
- Crt::Http::HttpRequestOptions requestOptions;
98
- requestOptions.uri = Crt::ByteCursorFromCString (uriStr.c_str ());
99
- requestOptions.method = Crt::ByteCursorFromCString (" GET" );
100
-
101
- Crt::Http::HttpHeader hostNameHeader;
102
- hostNameHeader.name = Crt::ByteCursorFromCString (" host" );
103
- hostNameHeader.value = Crt::ByteCursorFromCString (m_hostName.c_str ());
104
-
105
- requestOptions.headerArray = &hostNameHeader;
106
- requestOptions.headerArrayLength = 1 ;
107
-
108
- requestOptions.onStreamOutgoingBody = nullptr ;
109
- requestOptions.onIncomingHeaders =
110
- [](Crt::Http::HttpStream &, const Crt::Http::HttpHeader *, std::size_t ) {};
111
- requestOptions.onIncomingHeadersBlockDone =
112
- [callbackContext](Crt::Http::HttpStream &stream, bool ) {
113
- callbackContext->responseCode = stream.GetResponseStatusCode ();
114
- };
115
- requestOptions.onIncomingBody =
116
- [callbackContext](Crt::Http::HttpStream &, const Crt::ByteCursor &data, std::size_t &) {
117
- callbackContext->ss .write (reinterpret_cast <const char *>(data.ptr ), data.len );
118
- };
119
- requestOptions.onStreamComplete = [this , connection, callbackContext, onDiscoverResponse](
120
- Crt::Http::HttpStream &stream, int errorCode) {
121
- if (!errorCode && callbackContext->responseCode == 200 )
122
- {
123
- Crt::JsonObject jsonObject (callbackContext->ss .str ());
124
- DiscoverResponse response (jsonObject.View ());
125
- onDiscoverResponse (&response, AWS_ERROR_SUCCESS, callbackContext->responseCode );
126
- }
127
- else
128
- {
129
- if (!errorCode)
130
- {
131
- errorCode = AWS_ERROR_UNKNOWN;
132
- }
133
- onDiscoverResponse (nullptr , errorCode, callbackContext->responseCode );
134
- }
116
+ onDiscoverResponse (nullptr , errorCode, 0 );
117
+ return ;
118
+ }
135
119
136
- Crt::Delete (callbackContext, m_allocator);
137
- };
120
+ auto request = Aws::Crt::MakeShared<Crt::Http::HttpRequest>(m_allocator, m_allocator);
121
+ if (request == nullptr )
122
+ {
123
+ onDiscoverResponse (nullptr , Crt::LastErrorOrUnknown (), 0 );
124
+ return ;
125
+ }
138
126
139
- if (!connection->NewClientStream (requestOptions))
140
- {
141
- onDiscoverResponse (nullptr , aws_last_error (), 0 );
142
- Crt::Delete (callbackContext, m_allocator);
143
- }
127
+ Crt::StringStream ss;
128
+ ss << " /greengrass/discover/thing/" << thingName;
129
+ Crt::String uriStr = ss.str ();
130
+ if (!request->SetMethod (Crt::ByteCursorFromCString (" GET" )))
131
+ {
132
+ onDiscoverResponse (nullptr , Crt::LastErrorOrUnknown (), 0 );
133
+ return ;
134
+ }
144
135
136
+ if (!request->SetPath (Crt::ByteCursorFromCString (uriStr.c_str ())))
137
+ {
138
+ onDiscoverResponse (nullptr , Crt::LastErrorOrUnknown (), 0 );
139
+ return ;
140
+ }
141
+
142
+ Crt::Http::HttpHeader hostNameHeader;
143
+ hostNameHeader.name = Crt::ByteCursorFromCString (" host" );
144
+ hostNameHeader.value = Crt::ByteCursorFromCString (m_hostName.c_str ());
145
+
146
+ if (!request->AddHeader (hostNameHeader))
147
+ {
148
+ onDiscoverResponse (nullptr , Crt::LastErrorOrUnknown (), 0 );
145
149
return ;
146
150
}
147
151
148
- onDiscoverResponse (nullptr , errorCode, 0 );
149
- Crt::Delete (callbackContext, m_allocator);
152
+ Crt::Http::HttpRequestOptions requestOptions;
153
+ requestOptions.request = request.get ();
154
+ requestOptions.onIncomingHeaders =
155
+ [](Crt::Http::HttpStream &, const Crt::Http::HttpHeader *, std::size_t ) {};
156
+ requestOptions.onIncomingHeadersBlockDone = [callbackContext](Crt::Http::HttpStream &stream, bool ) {
157
+ callbackContext->responseCode = stream.GetResponseStatusCode ();
158
+ };
159
+ requestOptions.onIncomingBody =
160
+ [callbackContext](Crt::Http::HttpStream &, const Crt::ByteCursor &data) {
161
+ callbackContext->ss .write (reinterpret_cast <const char *>(data.ptr ), data.len );
162
+ };
163
+ requestOptions.onStreamComplete = [request, connection, callbackContext, onDiscoverResponse](
164
+ Crt::Http::HttpStream &, int errorCode) {
165
+ if (!errorCode && callbackContext->responseCode == 200 )
166
+ {
167
+ Crt::JsonObject jsonObject (callbackContext->ss .str ());
168
+ DiscoverResponse response (jsonObject.View ());
169
+ onDiscoverResponse (&response, AWS_ERROR_SUCCESS, callbackContext->responseCode );
170
+ }
171
+ else
172
+ {
173
+ if (!errorCode)
174
+ {
175
+ errorCode = AWS_ERROR_UNKNOWN;
176
+ }
177
+ onDiscoverResponse (nullptr , errorCode, callbackContext->responseCode );
178
+ }
179
+ };
180
+
181
+ if (!connection->NewClientStream (requestOptions))
182
+ {
183
+ onDiscoverResponse (nullptr , Crt::LastErrorOrUnknown (), 0 );
184
+ }
150
185
});
151
186
152
187
if (!res)
153
188
{
154
- Crt::Delete (callbackContext, m_allocator);
155
189
return false ;
156
190
}
157
191
0 commit comments