2012-06-04 16:48:31 +02:00
|
|
|
/*
|
2014-03-30 12:09:21 +02:00
|
|
|
* nghttp2 - HTTP/2 C Library
|
2012-06-04 16:48:31 +02:00
|
|
|
*
|
|
|
|
* Copyright (c) 2012 Tatsuhiro Tsujikawa
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
|
|
* a copy of this software and associated documentation files (the
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
|
|
* the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be
|
|
|
|
* included in all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
|
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
|
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
|
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
#ifndef SHRPX_UPSTREAM_H
|
|
|
|
#define SHRPX_UPSTREAM_H
|
|
|
|
|
|
|
|
#include "shrpx.h"
|
2012-11-18 13:23:13 +01:00
|
|
|
#include "shrpx_io_control.h"
|
2015-10-01 16:10:53 +02:00
|
|
|
#include "memchunk.h"
|
|
|
|
|
|
|
|
using namespace nghttp2;
|
2012-11-18 13:23:13 +01:00
|
|
|
|
2012-06-04 16:48:31 +02:00
|
|
|
namespace shrpx {
|
|
|
|
|
|
|
|
class ClientHandler;
|
|
|
|
class Downstream;
|
2014-12-27 18:59:06 +01:00
|
|
|
class DownstreamConnection;
|
2012-06-04 16:48:31 +02:00
|
|
|
|
|
|
|
class Upstream {
|
|
|
|
public:
|
|
|
|
virtual ~Upstream() {}
|
|
|
|
virtual int on_read() = 0;
|
2012-06-04 20:11:43 +02:00
|
|
|
virtual int on_write() = 0;
|
2014-08-09 11:47:45 +02:00
|
|
|
virtual int on_timeout(Downstream *downstream) { return 0; };
|
2014-06-27 15:34:54 +02:00
|
|
|
virtual int on_downstream_abort_request(Downstream *downstream,
|
|
|
|
unsigned int status_code) = 0;
|
2014-12-27 18:59:06 +01:00
|
|
|
virtual int downstream_read(DownstreamConnection *dconn) = 0;
|
|
|
|
virtual int downstream_write(DownstreamConnection *dconn) = 0;
|
|
|
|
virtual int downstream_eof(DownstreamConnection *dconn) = 0;
|
|
|
|
virtual int downstream_error(DownstreamConnection *dconn, int events) = 0;
|
2014-11-27 15:39:04 +01:00
|
|
|
virtual ClientHandler *get_client_handler() const = 0;
|
2012-06-04 16:48:31 +02:00
|
|
|
|
|
|
|
virtual int on_downstream_header_complete(Downstream *downstream) = 0;
|
2014-11-27 15:39:04 +01:00
|
|
|
virtual int on_downstream_body(Downstream *downstream, const uint8_t *data,
|
|
|
|
size_t len, bool flush) = 0;
|
2012-06-04 16:48:31 +02:00
|
|
|
virtual int on_downstream_body_complete(Downstream *downstream) = 0;
|
2012-11-18 13:23:13 +01:00
|
|
|
|
2014-11-18 17:59:09 +01:00
|
|
|
virtual void on_handler_delete() = 0;
|
nghttpx: Check HTTP/2 downstream connection after certain idle time
Previously when requests are issued to HTTP/2 downstream connection,
but it turns out that connection is down, handlers of those requests
are deleted. In some situations, we only know connection is down when
we write something to network, so we'd like to handle this kind of
situation in more robust manner. In this change, certain seconds
passed after last network activity, we first issue PING frame to
downstream connection before issuing new HTTP request. If writing
PING frame is failed, it means connection was lost. In this case,
instead of deleting handler, pending requests are migrated to new
HTTP2/ downstream connection, so that it can continue without
affecting upstream connection.
2014-12-08 17:30:15 +01:00
|
|
|
// Called when downstream connection is reset. Currently this is
|
2015-01-21 15:30:48 +01:00
|
|
|
// only used by Http2Session. If |no_retry| is true, another
|
|
|
|
// connection attempt using new DownstreamConnection is not allowed.
|
|
|
|
virtual int on_downstream_reset(bool no_retry) = 0;
|
2014-11-18 17:59:09 +01:00
|
|
|
|
2012-11-18 13:23:13 +01:00
|
|
|
virtual void pause_read(IOCtrlReason reason) = 0;
|
2014-08-21 14:22:16 +02:00
|
|
|
virtual int resume_read(IOCtrlReason reason, Downstream *downstream,
|
|
|
|
size_t consumed) = 0;
|
2015-09-03 15:29:16 +02:00
|
|
|
virtual int send_reply(Downstream *downstream, const uint8_t *body,
|
|
|
|
size_t bodylen) = 0;
|
2015-09-05 15:47:07 +02:00
|
|
|
|
2016-04-16 11:52:14 +02:00
|
|
|
// Starts server push. The |downstream| is an associated stream for
|
|
|
|
// the pushed resource. This function returns 0 if it succeeds,
|
|
|
|
// otherwise -1.
|
2016-03-03 16:38:43 +01:00
|
|
|
virtual int initiate_push(Downstream *downstream, const StringRef &uri) = 0;
|
2015-10-01 16:10:53 +02:00
|
|
|
|
2015-10-02 15:42:46 +02:00
|
|
|
// Fills response data in |iov| whose capacity is |iovcnt|. Returns
|
|
|
|
// the number of iovs filled.
|
|
|
|
virtual int response_riovec(struct iovec *iov, int iovcnt) const = 0;
|
|
|
|
virtual void response_drain(size_t n) = 0;
|
|
|
|
virtual bool response_empty() const = 0;
|
2015-11-15 16:12:54 +01:00
|
|
|
|
|
|
|
// Called when PUSH_PROMISE was started in downstream. The
|
|
|
|
// associated downstream is given as |downstream|. The promised
|
|
|
|
// stream ID is given as |promised_stream_id|. If upstream supports
|
|
|
|
// server push for the corresponding upstream connection, it should
|
|
|
|
// return Downstream object for pushed stream. Otherwise, returns
|
|
|
|
// nullptr.
|
|
|
|
virtual Downstream *
|
|
|
|
on_downstream_push_promise(Downstream *downstream,
|
|
|
|
int32_t promised_stream_id) = 0;
|
|
|
|
// Called when PUSH_PROMISE frame was completely received in
|
|
|
|
// downstream. The associated downstream is given as |downstream|.
|
|
|
|
// This function returns 0 if it succeeds, or -1.
|
|
|
|
virtual int
|
|
|
|
on_downstream_push_promise_complete(Downstream *downstream,
|
|
|
|
Downstream *promised_downstream) = 0;
|
|
|
|
// Returns true if server push is enabled in upstream connection.
|
|
|
|
virtual bool push_enabled() const = 0;
|
|
|
|
// Cancels promised downstream. This function is called when
|
|
|
|
// PUSH_PROMISE for |promised_downstream| is not submitted to
|
|
|
|
// upstream session.
|
|
|
|
virtual void cancel_premature_downstream(Downstream *promised_downstream) = 0;
|
2012-06-04 16:48:31 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace shrpx
|
|
|
|
|
|
|
|
#endif // SHRPX_UPSTREAM_H
|