From 83d362c6d21f76599b86e7b94cd1992288a1d43c Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 25 Jun 2019 22:38:43 +0900 Subject: [PATCH] Don't read too greedily --- src/HttpServer.cc | 2 ++ src/shrpx_client_handler.cc | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/HttpServer.cc b/src/HttpServer.cc index c882eb1a..6a627656 100644 --- a/src/HttpServer.cc +++ b/src/HttpServer.cc @@ -650,6 +650,7 @@ int Http2Handler::read_clear() { } return -1; } + break; } return write_(*this); @@ -775,6 +776,7 @@ int Http2Handler::read_tls() { } return -1; } + break; } fin: diff --git a/src/shrpx_client_handler.cc b/src/shrpx_client_handler.cc index 6266c5fa..eda18ecc 100644 --- a/src/shrpx_client_handler.cc +++ b/src/shrpx_client_handler.cc @@ -111,6 +111,7 @@ void writecb(struct ev_loop *loop, ev_io *w, int revents) { int ClientHandler::noop() { return 0; } int ClientHandler::read_clear() { + auto should_break = false; rb_.ensure_chunk(); for (;;) { if (rb_.rleft() && on_read() != 0) { @@ -123,7 +124,7 @@ int ClientHandler::read_clear() { return 0; } - if (!ev_is_active(&conn_.rev)) { + if (!ev_is_active(&conn_.rev) || should_break) { return 0; } @@ -141,6 +142,7 @@ int ClientHandler::read_clear() { } rb_.write(nread); + should_break = true; } } @@ -205,6 +207,8 @@ int ClientHandler::tls_handshake() { } int ClientHandler::read_tls() { + auto should_break = false; + ERR_clear_error(); rb_.ensure_chunk(); @@ -221,7 +225,7 @@ int ClientHandler::read_tls() { return 0; } - if (!ev_is_active(&conn_.rev)) { + if (!ev_is_active(&conn_.rev) || should_break) { return 0; } @@ -239,6 +243,7 @@ int ClientHandler::read_tls() { } rb_.write(nread); + should_break = true; } }