nghttpx: Reconnect h1 backend if it lost connection before sending headers
This commit is contained in:
parent
f2fde180cd
commit
8a59ce6d37
|
@ -158,6 +158,16 @@ void backend_retry(Downstream *downstream) {
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
void retry_readcb(struct ev_loop *loop, ev_io *w, int revents) {
|
||||||
|
auto conn = static_cast<Connection *>(w->data);
|
||||||
|
auto dconn = static_cast<HttpDownstreamConnection *>(conn->data);
|
||||||
|
auto downstream = dconn->get_downstream();
|
||||||
|
|
||||||
|
retry_downstream_connection(downstream, 502);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
void writecb(struct ev_loop *loop, ev_io *w, int revents) {
|
void writecb(struct ev_loop *loop, ev_io *w, int revents) {
|
||||||
int rv;
|
int rv;
|
||||||
|
@ -197,7 +207,7 @@ HttpDownstreamConnection::HttpDownstreamConnection(
|
||||||
struct ev_loop *loop, Worker *worker)
|
struct ev_loop *loop, Worker *worker)
|
||||||
: conn_(loop, -1, nullptr, worker->get_mcpool(),
|
: conn_(loop, -1, nullptr, worker->get_mcpool(),
|
||||||
group->shared_addr->timeout.write, group->shared_addr->timeout.read,
|
group->shared_addr->timeout.write, group->shared_addr->timeout.read,
|
||||||
{}, {}, connectcb, readcb, connect_timeoutcb, this,
|
{}, {}, connectcb, retry_readcb, connect_timeoutcb, this,
|
||||||
get_config()->tls.dyn_rec.warmup_threshold,
|
get_config()->tls.dyn_rec.warmup_threshold,
|
||||||
get_config()->tls.dyn_rec.idle_timeout, Proto::HTTP1),
|
get_config()->tls.dyn_rec.idle_timeout, Proto::HTTP1),
|
||||||
on_read_(&HttpDownstreamConnection::noop),
|
on_read_(&HttpDownstreamConnection::noop),
|
||||||
|
@ -433,7 +443,10 @@ int HttpDownstreamConnection::initiate_connection() {
|
||||||
conn_.again_rt(group_->shared_addr->timeout.read);
|
conn_.again_rt(group_->shared_addr->timeout.read);
|
||||||
}
|
}
|
||||||
|
|
||||||
ev_set_cb(&conn_.rev, readcb);
|
// downstream host might close connection while waiting for
|
||||||
|
// request header fields. If it happens, establish new
|
||||||
|
// connection.
|
||||||
|
ev_set_cb(&conn_.rev, retry_readcb);
|
||||||
|
|
||||||
on_write_ = &HttpDownstreamConnection::write_first;
|
on_write_ = &HttpDownstreamConnection::write_first;
|
||||||
first_write_done_ = false;
|
first_write_done_ = false;
|
||||||
|
@ -1166,6 +1179,8 @@ int HttpDownstreamConnection::write_first() {
|
||||||
return SHRPX_ERR_RETRY;
|
return SHRPX_ERR_RETRY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ev_set_cb(&conn_.rev, readcb);
|
||||||
|
|
||||||
if (conn_.tls.ssl) {
|
if (conn_.tls.ssl) {
|
||||||
on_write_ = &HttpDownstreamConnection::write_tls;
|
on_write_ = &HttpDownstreamConnection::write_tls;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue