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

This is the second attempt.  The first attempt was
8a59ce6d37 and it failed.
This commit is contained in:
Tatsuhiro Tsujikawa 2019-09-07 18:20:24 +09:00
parent 89c33d690f
commit f8933fe504
3 changed files with 22 additions and 9 deletions

View File

@ -1262,7 +1262,10 @@ int Http2Upstream::downstream_read(DownstreamConnection *dconn) {
} else { } else {
auto rv = downstream->on_read(); auto rv = downstream->on_read();
if (rv == SHRPX_ERR_EOF) { if (rv == SHRPX_ERR_EOF) {
return downstream_eof(dconn); if (downstream->get_request_header_sent()) {
return downstream_eof(dconn);
}
return SHRPX_ERR_RETRY;
} }
if (rv == SHRPX_ERR_DCONN_CANCELED) { if (rv == SHRPX_ERR_DCONN_CANCELED) {
downstream->pop_downstream_connection(); downstream->pop_downstream_connection();

View File

@ -138,26 +138,33 @@ void connect_timeoutcb(struct ev_loop *loop, ev_timer *w, int revents) {
} }
} // namespace } // namespace
namespace {
void backend_retry(Downstream *downstream) {
retry_downstream_connection(downstream, 502);
}
} // namespace
namespace { namespace {
void readcb(struct ev_loop *loop, ev_io *w, int revents) { void readcb(struct ev_loop *loop, ev_io *w, int revents) {
int rv;
auto conn = static_cast<Connection *>(w->data); auto conn = static_cast<Connection *>(w->data);
auto dconn = static_cast<HttpDownstreamConnection *>(conn->data); auto dconn = static_cast<HttpDownstreamConnection *>(conn->data);
auto downstream = dconn->get_downstream(); auto downstream = dconn->get_downstream();
auto upstream = downstream->get_upstream(); auto upstream = downstream->get_upstream();
auto handler = upstream->get_client_handler(); auto handler = upstream->get_client_handler();
if (upstream->downstream_read(dconn) != 0) { rv = upstream->downstream_read(dconn);
if (rv != 0) {
if (rv == SHRPX_ERR_RETRY) {
backend_retry(downstream);
return;
}
delete handler; delete handler;
} }
} }
} // namespace } // namespace
namespace {
void backend_retry(Downstream *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;

View File

@ -788,7 +788,10 @@ int HttpsUpstream::downstream_read(DownstreamConnection *dconn) {
rv = downstream->on_read(); rv = downstream->on_read();
if (rv == SHRPX_ERR_EOF) { if (rv == SHRPX_ERR_EOF) {
return downstream_eof(dconn); if (downstream->get_request_header_sent()) {
return downstream_eof(dconn);
}
return SHRPX_ERR_RETRY;
} }
if (rv == SHRPX_ERR_DCONN_CANCELED) { if (rv == SHRPX_ERR_DCONN_CANCELED) {