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
|
#ifndef AWS_HTTP_REQUEST_RESPONSE_IMPL_H
#define AWS_HTTP_REQUEST_RESPONSE_IMPL_H
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/common/task_scheduler.h>
#include <aws/http/request_response.h>
#include <aws/http/private/http_impl.h>
#include <aws/common/atomics.h>
struct aws_http_stream_vtable {
void (*destroy)(struct aws_http_stream *stream);
void (*update_window)(struct aws_http_stream *stream, size_t increment_size);
int (*activate)(struct aws_http_stream *stream);
void (*cancel)(struct aws_http_stream *stream, int error_code);
int (*http1_write_chunk)(struct aws_http_stream *http1_stream, const struct aws_http1_chunk_options *options);
int (*http1_add_trailer)(struct aws_http_stream *http1_stream, const struct aws_http_headers *trailing_headers);
int (*http2_reset_stream)(struct aws_http_stream *http2_stream, uint32_t http2_error);
int (*http2_get_received_error_code)(struct aws_http_stream *http2_stream, uint32_t *http2_error);
int (*http2_get_sent_error_code)(struct aws_http_stream *http2_stream, uint32_t *http2_error);
int (*http2_write_data)(
struct aws_http_stream *http2_stream,
const struct aws_http2_stream_write_data_options *options);
};
/**
* Base class for streams.
* There are specific implementations for each HTTP version.
*/
struct aws_http_stream {
const struct aws_http_stream_vtable *vtable;
struct aws_allocator *alloc;
struct aws_http_connection *owning_connection;
uint32_t id;
void *user_data;
aws_http_on_incoming_headers_fn *on_incoming_headers;
aws_http_on_incoming_header_block_done_fn *on_incoming_header_block_done;
aws_http_on_incoming_body_fn *on_incoming_body;
aws_http_on_stream_metrics_fn *on_metrics;
aws_http_on_stream_complete_fn *on_complete;
aws_http_on_stream_destroy_fn *on_destroy;
struct aws_atomic_var refcount;
enum aws_http_method request_method;
struct aws_http_stream_metrics metrics;
union {
struct aws_http_stream_client_data {
int response_status;
uint64_t response_first_byte_timeout_ms;
/* Using aws_task instead of aws_channel_task because, currently, channel-tasks can't be canceled.
* We only touch this from the connection's thread */
struct aws_task response_first_byte_timeout_task;
} client;
struct aws_http_stream_server_data {
struct aws_byte_cursor request_method_str;
struct aws_byte_cursor request_path;
aws_http_on_incoming_request_done_fn *on_request_done;
} server;
} client_or_server_data;
/* On client connections, `client_data` points to client_or_server_data.client and `server_data` is null.
* Opposite is true on server connections */
struct aws_http_stream_client_data *client_data;
struct aws_http_stream_server_data *server_data;
};
#endif /* AWS_HTTP_REQUEST_RESPONSE_IMPL_H */
|