aws-crt-cpp
HttpConnection.h
Go to the documentation of this file.
1 #pragma once
2 /*
3  * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License").
6  * You may not use this file except in compliance with the License.
7  * A copy of the License is located at
8  *
9  * http://aws.amazon.com/apache2.0
10  *
11  * or in the "license" file accompanying this file. This file is distributed
12  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied. See the License for the specific language governing
14  * permissions and limitations under the License.
15  */
16 #include <aws/http/connection.h>
17 #include <aws/http/request_response.h>
18 
19 #include <aws/crt/Types.h>
20 #include <aws/crt/io/Bootstrap.h>
22 #include <aws/crt/io/TlsOptions.h>
23 
24 #include <functional>
25 #include <memory>
26 
27 namespace Aws
28 {
29  namespace Crt
30  {
31  namespace Io
32  {
33  class ClientBootstrap;
34  }
35 
36  namespace Http
37  {
38  class HttpClientConnection;
39  class HttpStream;
40  class HttpClientStream;
41  class HttpRequest;
42  using HttpHeader = aws_http_header;
43 
51  std::function<void(const std::shared_ptr<HttpClientConnection> &connection, int errorCode)>;
52 
61  using OnConnectionShutdown = std::function<void(HttpClientConnection &connection, int errorCode)>;
62 
71  using OnIncomingHeaders = std::function<void(
72  HttpStream &stream,
73  enum aws_http_header_block headerBlock,
74  const HttpHeader *headersArray,
75  std::size_t headersCount)>;
76 
84  std::function<void(HttpStream &stream, enum aws_http_header_block block)>;
85 
92  using OnIncomingBody = std::function<void(HttpStream &stream, const ByteCursor &data)>;
93 
102  using OnStreamComplete = std::function<void(HttpStream &stream, int errorCode)>;
103 
108  {
109 
124  };
125 
130  class AWS_CRT_CPP_API HttpStream : public std::enable_shared_from_this<HttpStream>
131  {
132  public:
133  virtual ~HttpStream();
134  HttpStream(const HttpStream &) = delete;
135  HttpStream(HttpStream &&) = delete;
136  HttpStream &operator=(const HttpStream &) = delete;
138 
142  HttpClientConnection &GetConnection() const noexcept;
143 
144  virtual int GetResponseStatusCode() const noexcept = 0;
145 
155  void UpdateWindow(std::size_t incrementSize) noexcept;
156 
157  protected:
158  aws_http_stream *m_stream;
159  std::shared_ptr<HttpClientConnection> m_connection;
160  HttpStream(const std::shared_ptr<HttpClientConnection> &connection) noexcept;
161 
162  private:
163  OnIncomingHeaders m_onIncomingHeaders;
164  OnIncomingHeadersBlockDone m_onIncomingHeadersBlockDone;
165  OnIncomingBody m_onIncomingBody;
166  OnStreamComplete m_onStreamComplete;
167 
168  static int s_onIncomingHeaders(
169  struct aws_http_stream *stream,
170  enum aws_http_header_block headerBlock,
171  const struct aws_http_header *headerArray,
172  size_t numHeaders,
173  void *userData) noexcept;
174  static int s_onIncomingHeaderBlockDone(
175  struct aws_http_stream *stream,
176  enum aws_http_header_block headerBlock,
177  void *userData) noexcept;
178  static int s_onIncomingBody(
179  struct aws_http_stream *stream,
180  const struct aws_byte_cursor *data,
181  void *userData) noexcept;
182  static void s_onStreamComplete(struct aws_http_stream *stream, int errorCode, void *userData) noexcept;
183 
184  friend class HttpClientConnection;
185  };
186 
188  {
189  ClientStreamCallbackData() : allocator(nullptr), stream(nullptr) {}
191  std::shared_ptr<HttpStream> stream;
192  };
193 
195  {
196  public:
197  ~HttpClientStream();
202 
207  virtual int GetResponseStatusCode() const noexcept override;
208 
214  bool Activate() noexcept;
215 
216  private:
217  HttpClientStream(const std::shared_ptr<HttpClientConnection> &connection) noexcept;
218 
219  ClientStreamCallbackData m_callbackData;
220  friend class HttpClientConnection;
221  };
222 
228  {
229  None = AWS_HPAT_NONE,
230  Basic = AWS_HPAT_BASIC,
231  };
232 
237  {
238  public:
242 
245 
247 
253 
258  uint16_t Port;
259 
265 
270 
275 
280  };
281 
286  {
287  public:
291 
293 
296 
302 
307 
314 
321 
327 
332  uint16_t Port;
333 
339 
345 
351 
360  };
361  enum class HttpVersion
362  {
363  Unknown = AWS_HTTP_VERSION_UNKNOWN,
364  Http1_0 = AWS_HTTP_VERSION_1_0,
365  Http1_1 = AWS_HTTP_VERSION_1_1,
366  Http2 = AWS_HTTP_VERSION_2,
367  };
371  class AWS_CRT_CPP_API HttpClientConnection : public std::enable_shared_from_this<HttpClientConnection>
372  {
373  public:
374  virtual ~HttpClientConnection() = default;
379 
392  std::shared_ptr<HttpClientStream> NewClientStream(const HttpRequestOptions &requestOptions) noexcept;
393 
397  bool IsOpen() const noexcept;
398 
406  void Close() noexcept;
407 
411  HttpVersion GetVersion() noexcept;
415  int LastError() const noexcept { return m_lastError; }
416 
425  static bool CreateConnection(
426  const HttpClientConnectionOptions &connectionOptions,
427  Allocator *allocator) noexcept;
428 
429  protected:
430  HttpClientConnection(aws_http_connection *m_connection, Allocator *allocator) noexcept;
431  aws_http_connection *m_connection;
432 
433  private:
434  Allocator *m_allocator;
435  int m_lastError;
436 
437  static void s_onClientConnectionSetup(
438  struct aws_http_connection *connection,
439  int error_code,
440  void *user_data) noexcept;
441  static void s_onClientConnectionShutdown(
442  struct aws_http_connection *connection,
443  int error_code,
444  void *user_data) noexcept;
445  };
446 
447  } // namespace Http
448  } // namespace Crt
449 } // namespace Aws
Aws::Crt::Allocator
aws_allocator Allocator
Definition: StlAllocator.h:25
Aws::Crt::Http::HttpVersion::Unknown
@ Unknown
Aws::Crt::Http::HttpClientStream::operator=
HttpClientStream & operator=(HttpClientStream &&)=delete
Aws::Crt::Http::HttpRequestOptions::request
HttpRequest * request
Definition: HttpConnection.h:110
Aws::Crt::Http::HttpRequestOptions::onStreamComplete
OnStreamComplete onStreamComplete
Definition: HttpConnection.h:123
Aws::Crt::Http::HttpClientConnectionOptions::OnConnectionSetupCallback
OnConnectionSetup OnConnectionSetupCallback
Definition: HttpConnection.h:313
Aws::Crt::Http::OnIncomingHeadersBlockDone
std::function< void(HttpStream &stream, enum aws_http_header_block block)> OnIncomingHeadersBlockDone
Definition: HttpConnection.h:84
Aws::Crt::Http::HttpStream::operator=
HttpStream & operator=(const HttpStream &)=delete
Aws::Crt::Io::SocketOptions
Definition: SocketOptions.h:55
Types.h
Aws::Crt::Http::HttpClientConnectionProxyOptions::TlsOptions
Optional< Io::TlsConnectionOptions > TlsOptions
Definition: HttpConnection.h:264
Aws::Crt::Http::HttpClientConnectionProxyOptions
Definition: HttpConnection.h:237
Aws::Crt::Http::HttpClientConnectionProxyOptions::AuthType
AwsHttpProxyAuthenticationType AuthType
Definition: HttpConnection.h:269
Aws::Crt::Http::HttpClientConnectionOptions::Port
uint16_t Port
Definition: HttpConnection.h:332
AWS_CRT_CPP_API
#define AWS_CRT_CPP_API
Definition: Exports.h:34
Aws::Crt::Http::HttpClientConnectionProxyOptions::HostName
String HostName
Definition: HttpConnection.h:252
Aws::Crt::Http::HttpClientConnectionOptions::operator=
HttpClientConnectionOptions & operator=(const HttpClientConnectionOptions &rhs)=default
Aws::Crt::Http::OnStreamComplete
std::function< void(HttpStream &stream, int errorCode)> OnStreamComplete
Definition: HttpConnection.h:102
Aws::Crt::Http::ClientStreamCallbackData::allocator
Allocator * allocator
Definition: HttpConnection.h:190
Aws::Crt::Http::HttpStream::HttpStream
HttpStream(const HttpStream &)=delete
Aws::Crt::Http::HttpClientConnection::~HttpClientConnection
virtual ~HttpClientConnection()=default
TlsOptions.h
Aws::Crt::Http::HttpClientStream::operator=
HttpClientStream & operator=(const HttpClientStream &)=delete
Bootstrap.h
Aws::Crt::Http::HttpClientConnectionProxyOptions::~HttpClientConnectionProxyOptions
~HttpClientConnectionProxyOptions()=default
Aws::Crt::Http::HttpClientStream
Definition: HttpConnection.h:195
Aws::Crt::Http::HttpRequest
Definition: HttpRequestResponse.h:84
Aws::Crt::Http::AwsHttpProxyAuthenticationType::Basic
@ Basic
Aws::Crt::ByteCursor
aws_byte_cursor ByteCursor
Definition: Types.h:44
Aws::Crt::Http::HttpClientConnectionOptions::HostName
String HostName
Definition: HttpConnection.h:326
Aws::Crt::Http::HttpClientConnectionOptions::ManualWindowManagement
bool ManualWindowManagement
Definition: HttpConnection.h:359
Aws::Crt::LastError
AWS_CRT_CPP_API int LastError() noexcept
Definition: Api.cpp:116
Aws::Crt::Http::ClientStreamCallbackData
Definition: HttpConnection.h:188
Aws::Crt::Http::HttpClientConnectionOptions::SocketOptions
Io::SocketOptions SocketOptions
Definition: HttpConnection.h:338
Aws::Crt::Http::OnIncomingHeaders
std::function< void(HttpStream &stream, enum aws_http_header_block headerBlock, const HttpHeader *headersArray, std::size_t headersCount)> OnIncomingHeaders
Definition: HttpConnection.h:75
SocketOptions.h
Aws::Crt::Http::HttpClientConnectionOptions::HttpClientConnectionOptions
HttpClientConnectionOptions(HttpClientConnectionOptions &&rhs)=default
Aws::Crt::Http::HttpClientConnectionProxyOptions::HttpClientConnectionProxyOptions
HttpClientConnectionProxyOptions(HttpClientConnectionProxyOptions &&rhs)=default
Aws::Crt::Http::HttpVersion::Http1_1
@ Http1_1
Aws::Crt::Http::HttpRequestOptions
Definition: HttpConnection.h:108
Aws::Crt::Http::ClientStreamCallbackData::stream
std::shared_ptr< HttpStream > stream
Definition: HttpConnection.h:191
Aws::Crt::Http::AwsHttpProxyAuthenticationType
AwsHttpProxyAuthenticationType
Definition: HttpConnection.h:228
Aws::Crt::Http::HttpRequestOptions::onIncomingHeaders
OnIncomingHeaders onIncomingHeaders
Definition: HttpConnection.h:114
Aws::Crt::Http::HttpClientStream::HttpClientStream
HttpClientStream(const HttpClientStream &)=delete
Aws::Crt::Http::OnConnectionShutdown
std::function< void(HttpClientConnection &connection, int errorCode)> OnConnectionShutdown
Definition: HttpConnection.h:61
Aws::Crt::Http::HttpClientConnection::operator=
HttpClientConnection & operator=(HttpClientConnection &&)=delete
Aws::Crt::Http::HttpClientConnection::HttpClientConnection
HttpClientConnection(HttpClientConnection &&)=delete
Aws::Crt::Http::HttpClientConnectionProxyOptions::BasicAuthUsername
String BasicAuthUsername
Definition: HttpConnection.h:274
Aws::Crt::Http::HttpClientConnectionProxyOptions::operator=
HttpClientConnectionProxyOptions & operator=(HttpClientConnectionProxyOptions &&rhs)=default
Aws::Crt::Http::HttpClientStream::HttpClientStream
HttpClientStream(HttpClientStream &&)=delete
Aws::Crt::Http::HttpClientConnectionOptions::TlsOptions
Optional< Io::TlsConnectionOptions > TlsOptions
Definition: HttpConnection.h:344
Aws::Crt::Http::HttpClientConnectionOptions::~HttpClientConnectionOptions
~HttpClientConnectionOptions()=default
Aws::Crt::Http::HttpStream::operator=
HttpStream & operator=(HttpStream &&)=delete
Aws::Crt::Http::HttpVersion
HttpVersion
Definition: HttpConnection.h:362
Aws::Crt::Http::HttpClientConnectionProxyOptions::operator=
HttpClientConnectionProxyOptions & operator=(const HttpClientConnectionProxyOptions &rhs)=default
Aws::Crt::Http::HttpVersion::Http2
@ Http2
Aws
Definition: Api.h:25
Aws::Crt::LogLevel::None
@ None
Aws::Crt::Http::HttpStream
Definition: HttpConnection.h:131
Aws::Crt::Http::HttpRequestOptions::onIncomingHeadersBlockDone
OnIncomingHeadersBlockDone onIncomingHeadersBlockDone
Definition: HttpConnection.h:115
Aws::Crt::Http::HttpRequestOptions::onIncomingBody
OnIncomingBody onIncomingBody
Definition: HttpConnection.h:119
Aws::Crt::Optional
Definition: Optional.h:32
Aws::Crt::Http::HttpClientConnectionOptions::HttpClientConnectionOptions
HttpClientConnectionOptions(const HttpClientConnectionOptions &rhs)=default
Aws::Crt::Http::HttpClientConnectionOptions
Definition: HttpConnection.h:286
Aws::Crt::Http::HttpClientConnectionOptions::OnConnectionShutdownCallback
OnConnectionShutdown OnConnectionShutdownCallback
Definition: HttpConnection.h:320
Aws::Crt::Http::ClientStreamCallbackData::ClientStreamCallbackData
ClientStreamCallbackData()
Definition: HttpConnection.h:189
Aws::Crt::Http::HttpHeader
aws_http_header HttpHeader
Definition: HttpConnection.h:42
Aws::Crt::Http::HttpClientConnection::m_connection
aws_http_connection * m_connection
Definition: HttpConnection.h:431
Aws::Crt::Http::OnIncomingBody
std::function< void(HttpStream &stream, const ByteCursor &data)> OnIncomingBody
Definition: HttpConnection.h:92
Aws::Crt::Http::HttpClientConnectionOptions::InitialWindowSize
size_t InitialWindowSize
Definition: HttpConnection.h:306
Aws::Crt::Http::HttpClientConnectionOptions::operator=
HttpClientConnectionOptions & operator=(HttpClientConnectionOptions &&rhs)=default
Aws::Crt::String
std::basic_string< char, std::char_traits< char >, StlAllocator< char > > String
Definition: Types.h:58
Aws::Crt::Http::HttpClientConnectionOptions::ProxyOptions
Optional< HttpClientConnectionProxyOptions > ProxyOptions
Definition: HttpConnection.h:350
Aws::Crt::Io::ClientBootstrap
Definition: Bootstrap.h:45
Aws::Crt::Http::HttpStream::HttpStream
HttpStream(HttpStream &&)=delete
Aws::Crt::Http::HttpClientConnection
Definition: HttpConnection.h:372
Aws::Crt::Http::OnConnectionSetup
std::function< void(const std::shared_ptr< HttpClientConnection > &connection, int errorCode)> OnConnectionSetup
Definition: HttpConnection.h:51
Aws::Crt::Http::HttpClientConnectionOptions::Bootstrap
Io::ClientBootstrap * Bootstrap
Definition: HttpConnection.h:301
Aws::Crt::Http::HttpClientConnection::HttpClientConnection
HttpClientConnection(const HttpClientConnection &)=delete
Aws::Crt::Http::HttpClientConnectionProxyOptions::BasicAuthPassword
String BasicAuthPassword
Definition: HttpConnection.h:279
Aws::Crt::Http::HttpClientConnection::operator=
HttpClientConnection & operator=(const HttpClientConnection &)=delete
Aws::Crt::Http::HttpClientConnectionProxyOptions::Port
uint16_t Port
Definition: HttpConnection.h:258
Aws::Crt::Http::HttpClientConnectionProxyOptions::HttpClientConnectionProxyOptions
HttpClientConnectionProxyOptions(const HttpClientConnectionProxyOptions &rhs)=default
Aws::Crt::Http::HttpVersion::Http1_0
@ Http1_0