NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
http2_connection.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_HTTP_HTTP2_CONNECTION_HPP__
2#define NEFORCE_NETWORK_HTTP_HTTP2_CONNECTION_HPP__
3
12
19
20#ifdef NO_ERROR
21# undef NO_ERROR
22#endif
23
24NEFORCE_BEGIN_NAMESPACE__
25NEFORCE_BEGIN_HTTP__
26
31
46class http2_connection : public enable_shared_from_this<http2_connection> {
47public:
48 using stream_handler = function<void(uint32_t stream_id, const vector<hpack_header_field>& headers,
49 const byte_t* data, size_t data_len, bool end_stream)>;
50 using close_handler = function<void(uint32_t error_code)>;
51
52private:
54 io_context* ctx_{nullptr};
55
56 http2_framer framer_;
57 http2_settings local_settings_;
58 http2_settings remote_settings_;
59 hpack_encoder encoder_;
60 hpack_decoder decoder_;
61 http2_flow_control flow_control_;
62
64 uint32_t last_stream_id_ = 0;
65 atomic<bool> closed_{false};
66 bool preface_received_ = false;
67
68 byte_vector read_buffer_;
69 byte_vector write_buffer_;
70 mutex write_mutex_;
71 mutable recursive_mutex stream_mutex_;
72
73 uint32_t connection_consumed_ = 0;
74 unordered_map<uint32_t, uint32_t> stream_consumed_;
75 unordered_map<uint32_t, uint8_t> stream_priorities_;
76 uint32_t local_stream_window_ = 65535;
77
78 stream_handler stream_handler_;
79 close_handler close_handler_;
80 http_router* router_ = nullptr;
81
82 struct pending_stream {
84 byte_vector header_block_fragment;
86 bool end_stream = false;
87 bool waiting_continuation = false;
88 };
89
91
92 void route_stream(uint32_t stream_id, const vector<hpack_header_field>& headers, const byte_t* data,
93 size_t data_len, bool end_stream);
94
95 void on_readable(int fd, uint32_t events, error_code ec);
96 void on_writable(int fd, uint32_t events, error_code ec);
97
98 void handle_frame(http2_frame_type type, uint8_t flags, uint32_t stream_id, const byte_t* payload, size_t len);
99
100 void handle_data_frame(uint8_t flags, uint32_t stream_id, const byte_t* payload, size_t len);
101 void handle_headers_frame(uint8_t flags, uint32_t stream_id, const byte_t* payload, size_t len);
102 void handle_continuation_frame(uint8_t flags, uint32_t stream_id, const byte_t* payload, size_t len);
103 void handle_priority_frame(uint32_t stream_id, const byte_t* payload, size_t len);
104 void handle_push_promise_frame(uint32_t stream_id, const byte_t* payload, size_t len);
105 void handle_settings_frame(uint8_t flags, const byte_t* payload, size_t len);
106 void handle_ping_frame(uint8_t flags, const byte_t* payload, size_t len);
107 void handle_goaway_frame(const byte_t* payload, size_t len);
108 void handle_rst_stream_frame(uint32_t stream_id, const byte_t* payload);
109 void handle_window_update_frame(uint32_t stream_id, const byte_t* payload);
110 void send_window_update(uint32_t stream_id, uint32_t increment);
111
112 void write_frame(const byte_vector& frame);
113 void flush_writes();
114 void close_connection(http2_error error = http2_error::NO_ERROR);
115
116public:
117 http2_connection(unique_ptr<tcp_socket> socket, io_context& ctx);
118 ~http2_connection();
119
120 http2_connection(const http2_connection&) = delete;
121 http2_connection& operator=(const http2_connection&) = delete;
122
128 void start();
129
137 void send_response(uint32_t stream_id, const vector<hpack_header_field>& headers, const string& body = {},
138 bool end_stream = true);
139
149 void send_push_promise(uint32_t stream_id, uint32_t promised_stream_id,
150 const vector<hpack_header_field>& request_headers);
151
155 void send_rst_stream(uint32_t stream_id, http2_error error);
156
161
169 size_t data_len, bool end_stream);
170
174 void set_stream_handler(stream_handler handler) { stream_handler_ = move(handler); }
175
182 void set_router(http_router* router) { router_ = router; }
183
187 void set_close_handler(close_handler handler) { close_handler_ = move(handler); }
188
192 http2_settings& local_settings() noexcept { return local_settings_; }
193
197 const http2_settings& remote_settings() const noexcept { return remote_settings_; }
198
199 bool is_closed() const noexcept { return closed_; }
200 uint32_t last_stream_id() const noexcept { return last_stream_id_; }
201
202 void stop();
203};
204 // HTTP
206
207NEFORCE_END_HTTP__
208NEFORCE_END_NAMESPACE__
209#endif // NEFORCE_NETWORK_HTTP_HTTP2_CONNECTION_HPP__
原子类型完整实现
函数包装器主模板声明
HPACK 头部解码器(RFC 7541)
HPACK 头部编码器(RFC 7541)
const http2_settings & remote_settings() const noexcept
获取远程设置
http2_settings & local_settings() noexcept
获取本地设置
void set_router(http_router *router)
设置路由器(启用自动请求分发)
void send_rst_stream(uint32_t stream_id, http2_error error)
发送 RST_STREAM
void start()
启动连接处理
void send_response(uint32_t stream_id, const vector< hpack_header_field > &headers, const string &body={}, bool end_stream=true)
发送 HTTP 响应(HEADERS + DATA)
void set_stream_handler(stream_handler handler)
设置流处理器(收到完整请求时回调)
void handle_upgrade_request(uint32_t stream_id, const vector< hpack_header_field > &headers, const byte_t *data, size_t data_len, bool end_stream)
h2c 升级请求注入(RFC 7540 §3.2)
void send_push_promise(uint32_t stream_id, uint32_t promised_stream_id, const vector< hpack_header_field > &request_headers)
发送 PUSH_PROMISE(Server Push)
void set_close_handler(close_handler handler)
设置关闭回调
void send_goaway(http2_error error=http2_error::NO_ERROR)
发送 GOAWAY 并关闭连接
HTTP/2 连接设置管理器
统一异步操作核心
非递归互斥锁
独占智能指针
动态大小数组容器
vector< byte_t > byte_vector
字节向量类型别名
unsigned char byte_t
字节类型,定义为无符号字符
unsigned int uint32_t
32位无符号整数类型
unsigned char uint8_t
8位无符号整数类型
http2_frame_type
HTTP/2 帧类型(RFC 7540 §6)
http2_error
HTTP/2 错误码(RFC 7540 §7)
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
HTTP/2 协议帧、HPACK 编解码器与流控制
HTTP路由器实现
统一异步操作核心
通用原子类型模板
TCP Socket实现
弱智能指针实现