12c593315Sopenharmony_ci/* 22c593315Sopenharmony_ci * nghttp2 - HTTP/2 C Library 32c593315Sopenharmony_ci * 42c593315Sopenharmony_ci * Copyright (c) 2012 Tatsuhiro Tsujikawa 52c593315Sopenharmony_ci * 62c593315Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining 72c593315Sopenharmony_ci * a copy of this software and associated documentation files (the 82c593315Sopenharmony_ci * "Software"), to deal in the Software without restriction, including 92c593315Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish, 102c593315Sopenharmony_ci * distribute, sublicense, and/or sell copies of the Software, and to 112c593315Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to 122c593315Sopenharmony_ci * the following conditions: 132c593315Sopenharmony_ci * 142c593315Sopenharmony_ci * The above copyright notice and this permission notice shall be 152c593315Sopenharmony_ci * included in all copies or substantial portions of the Software. 162c593315Sopenharmony_ci * 172c593315Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 182c593315Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 192c593315Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 202c593315Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 212c593315Sopenharmony_ci * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 222c593315Sopenharmony_ci * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 232c593315Sopenharmony_ci * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 242c593315Sopenharmony_ci */ 252c593315Sopenharmony_ci#ifndef SHRPX_HTTP2_UPSTREAM_H 262c593315Sopenharmony_ci#define SHRPX_HTTP2_UPSTREAM_H 272c593315Sopenharmony_ci 282c593315Sopenharmony_ci#include "shrpx.h" 292c593315Sopenharmony_ci 302c593315Sopenharmony_ci#include <memory> 312c593315Sopenharmony_ci 322c593315Sopenharmony_ci#include <ev.h> 332c593315Sopenharmony_ci 342c593315Sopenharmony_ci#include <nghttp2/nghttp2.h> 352c593315Sopenharmony_ci 362c593315Sopenharmony_ci#include "shrpx_upstream.h" 372c593315Sopenharmony_ci#include "shrpx_downstream_queue.h" 382c593315Sopenharmony_ci#include "memchunk.h" 392c593315Sopenharmony_ci#include "buffer.h" 402c593315Sopenharmony_ci 412c593315Sopenharmony_ciusing namespace nghttp2; 422c593315Sopenharmony_ci 432c593315Sopenharmony_cinamespace shrpx { 442c593315Sopenharmony_ci 452c593315Sopenharmony_ciclass ClientHandler; 462c593315Sopenharmony_ciclass HttpsUpstream; 472c593315Sopenharmony_ci 482c593315Sopenharmony_ciclass Http2Upstream : public Upstream { 492c593315Sopenharmony_cipublic: 502c593315Sopenharmony_ci Http2Upstream(ClientHandler *handler); 512c593315Sopenharmony_ci virtual ~Http2Upstream(); 522c593315Sopenharmony_ci virtual int on_read(); 532c593315Sopenharmony_ci virtual int on_write(); 542c593315Sopenharmony_ci virtual int on_timeout(Downstream *downstream); 552c593315Sopenharmony_ci virtual int on_downstream_abort_request(Downstream *downstream, 562c593315Sopenharmony_ci unsigned int status_code); 572c593315Sopenharmony_ci virtual int 582c593315Sopenharmony_ci on_downstream_abort_request_with_https_redirect(Downstream *downstream); 592c593315Sopenharmony_ci virtual ClientHandler *get_client_handler() const; 602c593315Sopenharmony_ci 612c593315Sopenharmony_ci virtual int downstream_read(DownstreamConnection *dconn); 622c593315Sopenharmony_ci virtual int downstream_write(DownstreamConnection *dconn); 632c593315Sopenharmony_ci virtual int downstream_eof(DownstreamConnection *dconn); 642c593315Sopenharmony_ci virtual int downstream_error(DownstreamConnection *dconn, int events); 652c593315Sopenharmony_ci 662c593315Sopenharmony_ci void add_pending_downstream(std::unique_ptr<Downstream> downstream); 672c593315Sopenharmony_ci void remove_downstream(Downstream *downstream); 682c593315Sopenharmony_ci 692c593315Sopenharmony_ci int rst_stream(Downstream *downstream, uint32_t error_code); 702c593315Sopenharmony_ci int terminate_session(uint32_t error_code); 712c593315Sopenharmony_ci int error_reply(Downstream *downstream, unsigned int status_code); 722c593315Sopenharmony_ci 732c593315Sopenharmony_ci virtual void pause_read(IOCtrlReason reason); 742c593315Sopenharmony_ci virtual int resume_read(IOCtrlReason reason, Downstream *downstream, 752c593315Sopenharmony_ci size_t consumed); 762c593315Sopenharmony_ci 772c593315Sopenharmony_ci virtual int on_downstream_header_complete(Downstream *downstream); 782c593315Sopenharmony_ci virtual int on_downstream_body(Downstream *downstream, const uint8_t *data, 792c593315Sopenharmony_ci size_t len, bool flush); 802c593315Sopenharmony_ci virtual int on_downstream_body_complete(Downstream *downstream); 812c593315Sopenharmony_ci 822c593315Sopenharmony_ci virtual void on_handler_delete(); 832c593315Sopenharmony_ci virtual int on_downstream_reset(Downstream *downstream, bool no_retry); 842c593315Sopenharmony_ci virtual int send_reply(Downstream *downstream, const uint8_t *body, 852c593315Sopenharmony_ci size_t bodylen); 862c593315Sopenharmony_ci virtual int initiate_push(Downstream *downstream, const StringRef &uri); 872c593315Sopenharmony_ci virtual int response_riovec(struct iovec *iov, int iovcnt) const; 882c593315Sopenharmony_ci virtual void response_drain(size_t n); 892c593315Sopenharmony_ci virtual bool response_empty() const; 902c593315Sopenharmony_ci 912c593315Sopenharmony_ci virtual Downstream *on_downstream_push_promise(Downstream *downstream, 922c593315Sopenharmony_ci int32_t promised_stream_id); 932c593315Sopenharmony_ci virtual int 942c593315Sopenharmony_ci on_downstream_push_promise_complete(Downstream *downstream, 952c593315Sopenharmony_ci Downstream *promised_downstream); 962c593315Sopenharmony_ci virtual bool push_enabled() const; 972c593315Sopenharmony_ci virtual void cancel_premature_downstream(Downstream *promised_downstream); 982c593315Sopenharmony_ci 992c593315Sopenharmony_ci bool get_flow_control() const; 1002c593315Sopenharmony_ci // Perform HTTP/2 upgrade from |upstream|. On success, this object 1012c593315Sopenharmony_ci // takes ownership of the |upstream|. This function returns 0 if it 1022c593315Sopenharmony_ci // succeeds, or -1. 1032c593315Sopenharmony_ci int upgrade_upstream(HttpsUpstream *upstream); 1042c593315Sopenharmony_ci void start_settings_timer(); 1052c593315Sopenharmony_ci void stop_settings_timer(); 1062c593315Sopenharmony_ci int consume(int32_t stream_id, size_t len); 1072c593315Sopenharmony_ci void log_response_headers(Downstream *downstream, 1082c593315Sopenharmony_ci const std::vector<nghttp2_nv> &nva) const; 1092c593315Sopenharmony_ci void start_downstream(Downstream *downstream); 1102c593315Sopenharmony_ci void initiate_downstream(Downstream *downstream); 1112c593315Sopenharmony_ci 1122c593315Sopenharmony_ci void submit_goaway(); 1132c593315Sopenharmony_ci void check_shutdown(); 1142c593315Sopenharmony_ci // Starts graceful shutdown period. 1152c593315Sopenharmony_ci void start_graceful_shutdown(); 1162c593315Sopenharmony_ci 1172c593315Sopenharmony_ci int prepare_push_promise(Downstream *downstream); 1182c593315Sopenharmony_ci int submit_push_promise(const StringRef &scheme, const StringRef &authority, 1192c593315Sopenharmony_ci const StringRef &path, Downstream *downstream); 1202c593315Sopenharmony_ci 1212c593315Sopenharmony_ci // Called when new request has started. 1222c593315Sopenharmony_ci void on_start_request(const nghttp2_frame *frame); 1232c593315Sopenharmony_ci int on_request_headers(Downstream *downstream, const nghttp2_frame *frame); 1242c593315Sopenharmony_ci 1252c593315Sopenharmony_ci DefaultMemchunks *get_response_buf(); 1262c593315Sopenharmony_ci 1272c593315Sopenharmony_ci size_t get_max_buffer_size() const; 1282c593315Sopenharmony_ci 1292c593315Sopenharmony_ci int redirect_to_https(Downstream *downstream); 1302c593315Sopenharmony_ci 1312c593315Sopenharmony_ciprivate: 1322c593315Sopenharmony_ci DefaultMemchunks wb_; 1332c593315Sopenharmony_ci std::unique_ptr<HttpsUpstream> pre_upstream_; 1342c593315Sopenharmony_ci DownstreamQueue downstream_queue_; 1352c593315Sopenharmony_ci ev_timer settings_timer_; 1362c593315Sopenharmony_ci ev_timer shutdown_timer_; 1372c593315Sopenharmony_ci ev_prepare prep_; 1382c593315Sopenharmony_ci ClientHandler *handler_; 1392c593315Sopenharmony_ci nghttp2_session *session_; 1402c593315Sopenharmony_ci size_t max_buffer_size_; 1412c593315Sopenharmony_ci // The number of requests seen so far. 1422c593315Sopenharmony_ci size_t num_requests_; 1432c593315Sopenharmony_ci bool flow_control_; 1442c593315Sopenharmony_ci}; 1452c593315Sopenharmony_ci 1462c593315Sopenharmony_cinghttp2_session_callbacks *create_http2_upstream_callbacks(); 1472c593315Sopenharmony_ci 1482c593315Sopenharmony_ci} // namespace shrpx 1492c593315Sopenharmony_ci 1502c593315Sopenharmony_ci#endif // SHRPX_HTTP2_UPSTREAM_H 151