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