1 #ifndef AWS_HTTP_H
2 #define AWS_HTTP_H
3 
4 /**
5  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
6  * SPDX-License-Identifier: Apache-2.0.
7  */
8 
9 #include <aws/common/logging.h>
10 #include <aws/http/exports.h>
11 #include <aws/io/io.h>
12 
13 #define AWS_C_HTTP_PACKAGE_ID 2
14 
15 enum aws_http_errors {
16     AWS_ERROR_HTTP_UNKNOWN = AWS_ERROR_ENUM_BEGIN_RANGE(AWS_C_HTTP_PACKAGE_ID),
17     AWS_ERROR_HTTP_HEADER_NOT_FOUND,
18     AWS_ERROR_HTTP_INVALID_HEADER_FIELD,
19     AWS_ERROR_HTTP_INVALID_HEADER_NAME,
20     AWS_ERROR_HTTP_INVALID_HEADER_VALUE,
21     AWS_ERROR_HTTP_INVALID_METHOD,
22     AWS_ERROR_HTTP_INVALID_PATH,
23     AWS_ERROR_HTTP_INVALID_STATUS_CODE,
24     AWS_ERROR_HTTP_MISSING_BODY_STREAM,
25     AWS_ERROR_HTTP_INVALID_BODY_STREAM,
26     AWS_ERROR_HTTP_CONNECTION_CLOSED,
27     AWS_ERROR_HTTP_SWITCHED_PROTOCOLS,
28     AWS_ERROR_HTTP_UNSUPPORTED_PROTOCOL,
29     AWS_ERROR_HTTP_REACTION_REQUIRED,
30     AWS_ERROR_HTTP_DATA_NOT_AVAILABLE,
31     AWS_ERROR_HTTP_OUTGOING_STREAM_LENGTH_INCORRECT,
32     AWS_ERROR_HTTP_CALLBACK_FAILURE,
33     AWS_ERROR_HTTP_WEBSOCKET_UPGRADE_FAILURE,
34     AWS_ERROR_HTTP_WEBSOCKET_CLOSE_FRAME_SENT,
35     AWS_ERROR_HTTP_WEBSOCKET_IS_MIDCHANNEL_HANDLER,
36     AWS_ERROR_HTTP_CONNECTION_MANAGER_INVALID_STATE_FOR_ACQUIRE,
37     AWS_ERROR_HTTP_CONNECTION_MANAGER_VENDED_CONNECTION_UNDERFLOW,
38     AWS_ERROR_HTTP_SERVER_CLOSED,
39     AWS_ERROR_HTTP_PROXY_CONNECT_FAILED,
40     AWS_ERROR_HTTP_CONNECTION_MANAGER_SHUTTING_DOWN,
41     AWS_ERROR_HTTP_CHANNEL_THROUGHPUT_FAILURE,
42     AWS_ERROR_HTTP_PROTOCOL_ERROR,
43     AWS_ERROR_HTTP_STREAM_IDS_EXHAUSTED,
44     AWS_ERROR_HTTP_GOAWAY_RECEIVED,
45     AWS_ERROR_HTTP_RST_STREAM_RECEIVED,
46     AWS_ERROR_HTTP_RST_STREAM_SENT,
47     AWS_ERROR_HTTP_STREAM_NOT_ACTIVATED,
48     AWS_ERROR_HTTP_STREAM_HAS_COMPLETED,
49     AWS_ERROR_HTTP_PROXY_STRATEGY_NTLM_CHALLENGE_TOKEN_MISSING,
50     AWS_ERROR_HTTP_PROXY_STRATEGY_TOKEN_RETRIEVAL_FAILURE,
51     AWS_ERROR_HTTP_PROXY_CONNECT_FAILED_RETRYABLE,
52     AWS_ERROR_HTTP_PROTOCOL_SWITCH_FAILURE,
53 
54     AWS_ERROR_HTTP_END_RANGE = AWS_ERROR_ENUM_END_RANGE(AWS_C_HTTP_PACKAGE_ID)
55 };
56 
57 /* Error codes that may be present in HTTP/2 RST_STREAM and GOAWAY frames (RFC-7540 7). */
58 enum aws_http2_error_code {
59     AWS_HTTP2_ERR_NO_ERROR = 0x00,
60     AWS_HTTP2_ERR_PROTOCOL_ERROR = 0x01,
61     AWS_HTTP2_ERR_INTERNAL_ERROR = 0x02,
62     AWS_HTTP2_ERR_FLOW_CONTROL_ERROR = 0x03,
63     AWS_HTTP2_ERR_SETTINGS_TIMEOUT = 0x04,
64     AWS_HTTP2_ERR_STREAM_CLOSED = 0x05,
65     AWS_HTTP2_ERR_FRAME_SIZE_ERROR = 0x06,
66     AWS_HTTP2_ERR_REFUSED_STREAM = 0x07,
67     AWS_HTTP2_ERR_CANCEL = 0x08,
68     AWS_HTTP2_ERR_COMPRESSION_ERROR = 0x09,
69     AWS_HTTP2_ERR_CONNECT_ERROR = 0x0A,
70     AWS_HTTP2_ERR_ENHANCE_YOUR_CALM = 0x0B,
71     AWS_HTTP2_ERR_INADEQUATE_SECURITY = 0x0C,
72     AWS_HTTP2_ERR_HTTP_1_1_REQUIRED = 0x0D,
73     AWS_HTTP2_ERR_COUNT,
74 };
75 
76 enum aws_http_log_subject {
77     AWS_LS_HTTP_GENERAL = AWS_LOG_SUBJECT_BEGIN_RANGE(AWS_C_HTTP_PACKAGE_ID),
78     AWS_LS_HTTP_CONNECTION,
79     AWS_LS_HTTP_ENCODER,
80     AWS_LS_HTTP_DECODER,
81     AWS_LS_HTTP_SERVER,
82     AWS_LS_HTTP_STREAM,
83     AWS_LS_HTTP_CONNECTION_MANAGER,
84     AWS_LS_HTTP_WEBSOCKET,
85     AWS_LS_HTTP_WEBSOCKET_SETUP,
86     AWS_LS_HTTP_PROXY_NEGOTIATION,
87 };
88 
89 enum aws_http_version {
90     AWS_HTTP_VERSION_UNKNOWN, /* Invalid version. */
91     AWS_HTTP_VERSION_1_0,
92     AWS_HTTP_VERSION_1_1,
93     AWS_HTTP_VERSION_2,
94     AWS_HTTP_VERSION_COUNT,
95 };
96 
97 AWS_EXTERN_C_BEGIN
98 
99 /**
100  * Initializes internal datastructures used by aws-c-http.
101  * Must be called before using any functionality in aws-c-http.
102  */
103 AWS_HTTP_API
104 void aws_http_library_init(struct aws_allocator *alloc);
105 
106 /**
107  * Clean up internal datastructures used by aws-c-http.
108  * Must not be called until application is done using functionality in aws-c-http.
109  */
110 AWS_HTTP_API
111 void aws_http_library_clean_up(void);
112 
113 /**
114  * Returns the description of common status codes.
115  * Ex: 404 -> "Not Found"
116  * An empty string is returned if the status code is not recognized.
117  */
118 AWS_HTTP_API
119 const char *aws_http_status_text(int status_code);
120 
121 /**
122  * Shortcuts for common HTTP request methods
123  */
124 AWS_HTTP_API
125 extern const struct aws_byte_cursor aws_http_method_get;
126 AWS_HTTP_API
127 extern const struct aws_byte_cursor aws_http_method_head;
128 AWS_HTTP_API
129 extern const struct aws_byte_cursor aws_http_method_post;
130 AWS_HTTP_API
131 extern const struct aws_byte_cursor aws_http_method_put;
132 AWS_HTTP_API
133 extern const struct aws_byte_cursor aws_http_method_delete;
134 AWS_HTTP_API
135 extern const struct aws_byte_cursor aws_http_method_connect;
136 AWS_HTTP_API
137 extern const struct aws_byte_cursor aws_http_method_options;
138 
139 AWS_HTTP_API extern const struct aws_byte_cursor aws_http_header_method;
140 AWS_HTTP_API extern const struct aws_byte_cursor aws_http_header_scheme;
141 AWS_HTTP_API extern const struct aws_byte_cursor aws_http_header_authority;
142 AWS_HTTP_API extern const struct aws_byte_cursor aws_http_header_path;
143 AWS_HTTP_API extern const struct aws_byte_cursor aws_http_header_status;
144 
145 AWS_HTTP_API extern const struct aws_byte_cursor aws_http_scheme_http;
146 AWS_HTTP_API extern const struct aws_byte_cursor aws_http_scheme_https;
147 
148 AWS_EXTERN_C_END
149 
150 #endif /* AWS_HTTP_H */
151