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_UPSTREAM_H
262c593315Sopenharmony_ci#define SHRPX_UPSTREAM_H
272c593315Sopenharmony_ci
282c593315Sopenharmony_ci#include "shrpx.h"
292c593315Sopenharmony_ci#include "shrpx_io_control.h"
302c593315Sopenharmony_ci#include "memchunk.h"
312c593315Sopenharmony_ci
322c593315Sopenharmony_ciusing namespace nghttp2;
332c593315Sopenharmony_ci
342c593315Sopenharmony_cinamespace shrpx {
352c593315Sopenharmony_ci
362c593315Sopenharmony_ciclass ClientHandler;
372c593315Sopenharmony_ciclass Downstream;
382c593315Sopenharmony_ciclass DownstreamConnection;
392c593315Sopenharmony_ci
402c593315Sopenharmony_ciclass Upstream {
412c593315Sopenharmony_cipublic:
422c593315Sopenharmony_ci  virtual ~Upstream() {}
432c593315Sopenharmony_ci  virtual int on_read() = 0;
442c593315Sopenharmony_ci  virtual int on_write() = 0;
452c593315Sopenharmony_ci  virtual int on_timeout(Downstream *downstream) { return 0; };
462c593315Sopenharmony_ci  virtual int on_downstream_abort_request(Downstream *downstream,
472c593315Sopenharmony_ci                                          unsigned int status_code) = 0;
482c593315Sopenharmony_ci  // Called when the current request is aborted without forwarding it
492c593315Sopenharmony_ci  // to backend, and it should be redirected to https URI.
502c593315Sopenharmony_ci  virtual int
512c593315Sopenharmony_ci  on_downstream_abort_request_with_https_redirect(Downstream *downstream) = 0;
522c593315Sopenharmony_ci  virtual int downstream_read(DownstreamConnection *dconn) = 0;
532c593315Sopenharmony_ci  virtual int downstream_write(DownstreamConnection *dconn) = 0;
542c593315Sopenharmony_ci  virtual int downstream_eof(DownstreamConnection *dconn) = 0;
552c593315Sopenharmony_ci  virtual int downstream_error(DownstreamConnection *dconn, int events) = 0;
562c593315Sopenharmony_ci  virtual ClientHandler *get_client_handler() const = 0;
572c593315Sopenharmony_ci
582c593315Sopenharmony_ci  virtual int on_downstream_header_complete(Downstream *downstream) = 0;
592c593315Sopenharmony_ci  virtual int on_downstream_body(Downstream *downstream, const uint8_t *data,
602c593315Sopenharmony_ci                                 size_t len, bool flush) = 0;
612c593315Sopenharmony_ci  virtual int on_downstream_body_complete(Downstream *downstream) = 0;
622c593315Sopenharmony_ci
632c593315Sopenharmony_ci  virtual void on_handler_delete() = 0;
642c593315Sopenharmony_ci  // Called when downstream connection for |downstream| is reset.
652c593315Sopenharmony_ci  // Currently this is only used by Http2Session.  If |no_retry| is
662c593315Sopenharmony_ci  // true, another connection attempt using new DownstreamConnection
672c593315Sopenharmony_ci  // is not allowed.
682c593315Sopenharmony_ci  virtual int on_downstream_reset(Downstream *downstream, bool no_retry) = 0;
692c593315Sopenharmony_ci
702c593315Sopenharmony_ci  virtual void pause_read(IOCtrlReason reason) = 0;
712c593315Sopenharmony_ci  virtual int resume_read(IOCtrlReason reason, Downstream *downstream,
722c593315Sopenharmony_ci                          size_t consumed) = 0;
732c593315Sopenharmony_ci  virtual int send_reply(Downstream *downstream, const uint8_t *body,
742c593315Sopenharmony_ci                         size_t bodylen) = 0;
752c593315Sopenharmony_ci
762c593315Sopenharmony_ci  // Starts server push.  The |downstream| is an associated stream for
772c593315Sopenharmony_ci  // the pushed resource.  This function returns 0 if it succeeds,
782c593315Sopenharmony_ci  // otherwise -1.
792c593315Sopenharmony_ci  virtual int initiate_push(Downstream *downstream, const StringRef &uri) = 0;
802c593315Sopenharmony_ci
812c593315Sopenharmony_ci  // Fills response data in |iov| whose capacity is |iovcnt|.  Returns
822c593315Sopenharmony_ci  // the number of iovs filled.
832c593315Sopenharmony_ci  virtual int response_riovec(struct iovec *iov, int iovcnt) const = 0;
842c593315Sopenharmony_ci  virtual void response_drain(size_t n) = 0;
852c593315Sopenharmony_ci  virtual bool response_empty() const = 0;
862c593315Sopenharmony_ci
872c593315Sopenharmony_ci  // Called when PUSH_PROMISE was started in downstream.  The
882c593315Sopenharmony_ci  // associated downstream is given as |downstream|.  The promised
892c593315Sopenharmony_ci  // stream ID is given as |promised_stream_id|.  If upstream supports
902c593315Sopenharmony_ci  // server push for the corresponding upstream connection, it should
912c593315Sopenharmony_ci  // return Downstream object for pushed stream.  Otherwise, returns
922c593315Sopenharmony_ci  // nullptr.
932c593315Sopenharmony_ci  virtual Downstream *
942c593315Sopenharmony_ci  on_downstream_push_promise(Downstream *downstream,
952c593315Sopenharmony_ci                             int32_t promised_stream_id) = 0;
962c593315Sopenharmony_ci  // Called when PUSH_PROMISE frame was completely received in
972c593315Sopenharmony_ci  // downstream.  The associated downstream is given as |downstream|.
982c593315Sopenharmony_ci  // This function returns 0 if it succeeds, or -1.
992c593315Sopenharmony_ci  virtual int
1002c593315Sopenharmony_ci  on_downstream_push_promise_complete(Downstream *downstream,
1012c593315Sopenharmony_ci                                      Downstream *promised_downstream) = 0;
1022c593315Sopenharmony_ci  // Returns true if server push is enabled in upstream connection.
1032c593315Sopenharmony_ci  virtual bool push_enabled() const = 0;
1042c593315Sopenharmony_ci  // Cancels promised downstream.  This function is called when
1052c593315Sopenharmony_ci  // PUSH_PROMISE for |promised_downstream| is not submitted to
1062c593315Sopenharmony_ci  // upstream session.
1072c593315Sopenharmony_ci  virtual void cancel_premature_downstream(Downstream *promised_downstream) = 0;
1082c593315Sopenharmony_ci};
1092c593315Sopenharmony_ci
1102c593315Sopenharmony_ci} // namespace shrpx
1112c593315Sopenharmony_ci
1122c593315Sopenharmony_ci#endif // SHRPX_UPSTREAM_H
113