nghttpx: Reconnect h1 backend if it lost connection before sending headers

This commit is contained in:
Tatsuhiro Tsujikawa 2019-09-03 00:28:21 +09:00
parent f2fde180cd
commit 8a59ce6d37
1 changed files with 17 additions and 2 deletions

View File

@ -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 {