timeout_timer& timeout;
yield_context yield;
parse_buffer& buffer;
+ boost::system::error_code fatal_ec;
public:
StreamIO(CephContext *cct, Stream& stream, timeout_timer& timeout,
rgw::asio::parser_type& parser, yield_context yield,
buffer(buffer)
{}
+ boost::system::error_code get_fatal_error_code() const { return fatal_ec; }
+
size_t write_data(const char* buf, size_t len) override {
boost::system::error_code ec;
timeout.start();
boost::system::error_code ec_ignored;
stream.lowest_layer().shutdown(tcp_socket::shutdown_both, ec_ignored);
}
+ if (!fatal_ec) {
+ fatal_ec = ec;
+ }
throw rgw::io::Exception(ec.value(), std::system_category());
}
return bytes;
}
if (ec) {
ldout(cct, 4) << "failed to read body: " << ec.message() << dendl;
+ if (!fatal_ec) {
+ fatal_ec = ec;
+ }
throw rgw::io::Exception(ec.value(), std::system_category());
}
}
<< latency << dendl;
}
+ // process_request() can't distinguish between connection errors and
+ // http/s3 errors, so check StreamIO for fatal connection errors
+ ec = real_client.get_fatal_error_code();
+ if (ec) {
+ return;
+ }
+
if (real_client.sent_100_continue()) {
expect_continue = false;
}