1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
|
#ifndef AWS_HTTP_SERVER_H
#define AWS_HTTP_SERVER_H
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/http/http.h>
AWS_PUSH_SANE_WARNING_LEVEL
struct aws_http_connection;
struct aws_server_bootstrap;
struct aws_socket_options;
struct aws_tls_connection_options;
/**
* A listening socket which accepts incoming HTTP connections,
* creating a server-side aws_http_connection to handle each one.
*/
struct aws_http_server;
struct aws_http_stream;
typedef void(aws_http_server_on_incoming_connection_fn)(
struct aws_http_server *server,
struct aws_http_connection *connection,
int error_code,
void *user_data);
typedef void(aws_http_server_on_destroy_fn)(void *user_data);
/**
* Options for creating an HTTP server.
* Initialize with AWS_HTTP_SERVER_OPTIONS_INIT to set default values.
*/
struct aws_http_server_options {
/**
* The sizeof() this struct, used for versioning.
* Set by AWS_HTTP_SERVER_OPTIONS_INIT.
*/
size_t self_size;
/**
* Required.
* Must outlive server.
*/
struct aws_allocator *allocator;
/**
* Required.
* Must outlive server.
*/
struct aws_server_bootstrap *bootstrap;
/**
* Required.
* Server makes copy.
*/
struct aws_socket_endpoint *endpoint;
/**
* Required.
* Server makes a copy.
*/
struct aws_socket_options *socket_options;
/**
* Optional.
* Server copies all contents except the `aws_tls_ctx`, which must outlive the server.
*/
struct aws_tls_connection_options *tls_options;
/**
* Initial window size for incoming connections.
* Optional.
* A default size is set by AWS_HTTP_SERVER_OPTIONS_INIT.
*/
size_t initial_window_size;
/**
* User data passed to callbacks.
* Optional.
*/
void *server_user_data;
/**
* Invoked when an incoming connection has been set up, or when setup has failed.
* Required.
* If setup succeeds, the user must call aws_http_connection_configure_server().
*/
aws_http_server_on_incoming_connection_fn *on_incoming_connection;
/**
* Invoked when the server finishes the destroy operation.
* Optional.
*/
aws_http_server_on_destroy_fn *on_destroy_complete;
/**
* Set to true to manually manage the read window size.
*
* If this is false, the connection will maintain a constant window size.
*
* If this is true, the caller must manually increment the window size using aws_http_stream_update_window().
* If the window is not incremented, it will shrink by the amount of body data received. If the window size
* reaches 0, no further data will be received.
**/
bool manual_window_management;
};
/**
* Initializes aws_http_server_options with default values.
*/
#define AWS_HTTP_SERVER_OPTIONS_INIT \
{ .self_size = sizeof(struct aws_http_server_options), .initial_window_size = SIZE_MAX, }
/**
* Invoked at the start of an incoming request.
* To process the request, the user must create a request handler stream and return it to the connection.
* If NULL is returned, the request will not be processed and the last error will be reported as the reason for failure.
*/
typedef struct aws_http_stream *(
aws_http_on_incoming_request_fn)(struct aws_http_connection *connection, void *user_data);
typedef void(aws_http_on_server_connection_shutdown_fn)(
struct aws_http_connection *connection,
int error_code,
void *connection_user_data);
/**
* Options for configuring a server-side aws_http_connection.
* Initialized with AWS_HTTP_SERVER_CONNECTION_OPTIONS_INIT to set default values.
*/
struct aws_http_server_connection_options {
/**
* The sizeof() this struct, used for versioning.
* Set by AWS_HTTP_SERVER_CONNECTION_OPTIONS_INIT.
*/
size_t self_size;
/**
* User data specific to this connection.
* Optional.
*/
void *connection_user_data;
/**
* Invoked at the start of an incoming request.
* Required.
* The user must create a request handler stream and return it to the connection.
* See `aws_http_on_incoming_request_fn`.
*/
aws_http_on_incoming_request_fn *on_incoming_request;
/**
* Invoked when the connection is shut down.
* Optional.
*/
aws_http_on_server_connection_shutdown_fn *on_shutdown;
};
/**
* Initializes aws_http_server_connection_options with default values.
*/
#define AWS_HTTP_SERVER_CONNECTION_OPTIONS_INIT \
{ .self_size = sizeof(struct aws_http_server_connection_options), }
AWS_EXTERN_C_BEGIN
/**
* Create server, a listening socket that accepts incoming connections.
*/
AWS_HTTP_API
struct aws_http_server *aws_http_server_new(const struct aws_http_server_options *options);
/**
* Release the server. It will close the listening socket and all the connections existing in the server.
* The on_destroy_complete will be invoked when the destroy operation completes
*/
AWS_HTTP_API
void aws_http_server_release(struct aws_http_server *server);
/**
* Configure a server connection.
* This must be called from the server's on_incoming_connection callback.
*/
AWS_HTTP_API
int aws_http_connection_configure_server(
struct aws_http_connection *connection,
const struct aws_http_server_connection_options *options);
/**
* Returns true if this is a server connection.
*/
AWS_HTTP_API
bool aws_http_connection_is_server(const struct aws_http_connection *connection);
/**
* Returns the local listener endpoint of the HTTP server. Only valid as long as the server remains valid.
*/
AWS_HTTP_API
const struct aws_socket_endpoint *aws_http_server_get_listener_endpoint(const struct aws_http_server *server);
AWS_EXTERN_C_END
AWS_POP_SANE_WARNING_LEVEL
#endif /* AWS_HTTP_SERVER_H */
|