Blob Blame History Raw
diff --git a/src/HttpServer.cc b/src/HttpServer.cc
index ee07845..4545922 100644
--- a/src/HttpServer.cc
+++ b/src/HttpServer.cc
@@ -614,6 +614,7 @@ int Http2Handler::read_clear() {
       }
       return -1;
     }
+    break;
   }
 
   return write_(*this);
@@ -739,6 +740,7 @@ int Http2Handler::read_tls() {
       }
       return -1;
     }
+    break;
   }
 
 fin:
diff --git a/src/shrpx_client_handler.cc b/src/shrpx_client_handler.cc
index ed161db..b8dbd3c 100644
--- a/src/shrpx_client_handler.cc
+++ b/src/shrpx_client_handler.cc
@@ -114,6 +114,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;
   ev_timer_again(conn_.loop, &conn_.rt);
 
   for (;;) {
@@ -126,6 +127,10 @@ int ClientHandler::read_clear() {
       conn_.rlimit.stopw();
       return 0;
     }
+    
+    if (should_break) {
+      return 0;
+    }
 
     auto nread = conn_.read_clear(rb_.last, rb_.wleft());
 
@@ -138,6 +143,7 @@ int ClientHandler::read_clear() {
     }
 
     rb_.write(nread);
+    should_break = true;
   }
 }
 
@@ -204,6 +210,7 @@ int ClientHandler::tls_handshake() {
 }
 
 int ClientHandler::read_tls() {
+  auto should_break = false;
   ev_timer_again(conn_.loop, &conn_.rt);
 
   ERR_clear_error();
@@ -219,6 +226,10 @@ int ClientHandler::read_tls() {
       conn_.rlimit.stopw();
       return 0;
     }
+    
+    if (should_break) {
+      return 0;
+    }
 
     auto nread = conn_.read_tls(rb_.last, rb_.wleft());
 
@@ -231,6 +242,7 @@ int ClientHandler::read_tls() {
     }
 
     rb_.write(nread);
+    should_break = true;
   }
 }