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 {
|
||||
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 {
|
||||
void writecb(struct ev_loop *loop, ev_io *w, int revents) {
|
||||
int rv;
|
||||
|
@ -197,7 +207,7 @@ HttpDownstreamConnection::HttpDownstreamConnection(
|
|||
struct ev_loop *loop, Worker *worker)
|
||||
: conn_(loop, -1, nullptr, worker->get_mcpool(),
|
||||
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.idle_timeout, Proto::HTTP1),
|
||||
on_read_(&HttpDownstreamConnection::noop),
|
||||
|
@ -433,7 +443,10 @@ int HttpDownstreamConnection::initiate_connection() {
|
|||
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;
|
||||
first_write_done_ = false;
|
||||
|
@ -1166,6 +1179,8 @@ int HttpDownstreamConnection::write_first() {
|
|||
return SHRPX_ERR_RETRY;
|
||||
}
|
||||
|
||||
ev_set_cb(&conn_.rev, readcb);
|
||||
|
||||
if (conn_.tls.ssl) {
|
||||
on_write_ = &HttpDownstreamConnection::write_tls;
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue