diff --git a/src/HttpServer.cc b/src/HttpServer.cc index 000cd168..90fbb170 100644 --- a/src/HttpServer.cc +++ b/src/HttpServer.cc @@ -598,8 +598,7 @@ void Http2Handler::start_settings_timer() { int Http2Handler::fill_wb() { if (!data_pending_.empty()) { - auto n = std::min(wb_.wleft(), data_pending_.size()); - wb_.write(data_pending_.data(), n); + auto n = wb_.write(data_pending_); if (n < data_pending_.size()) { data_pending_ = data_pending_.subspan(n); return 0; @@ -620,9 +619,10 @@ int Http2Handler::fill_wb() { if (datalen == 0) { break; } - auto n = wb_.write(data, as_unsigned(datalen)); - if (n < static_cast(datalen)) { - data_pending_ = {data + n, as_unsigned(datalen) - n}; + auto chunk = std::span{data, as_unsigned(datalen)}; + auto n = wb_.write(chunk); + if (n < chunk.size()) { + data_pending_ = chunk.subspan(n); break; } } diff --git a/src/buffer.h b/src/buffer.h index df42e8c0..b4f1e517 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -41,13 +41,12 @@ template struct Buffer { constexpr size_t wleft() const noexcept { return as_unsigned(&buf[N] - last); } - // Writes up to min(wleft(), |count|) bytes from buffer pointed by - // |src|. Returns number of bytes written. - constexpr size_t write(const void *src, size_t count) { - count = std::min(count, wleft()); - auto p = static_cast(src); - last = std::ranges::copy_n(p, as_signed(count), last).out; - return count; + // Writes up to min(wleft(), |src|.size()) bytes from |src|. + // Returns number of bytes written. + constexpr size_t write(std::span src) { + src = src.first(std::min(src.size(), wleft())); + last = std::ranges::copy(src, last).out; + return src.size(); } constexpr size_t write(size_t count) { count = std::min(count, wleft()); diff --git a/src/buffer_test.cc b/src/buffer_test.cc index 8f2984c8..9d3f66fa 100644 --- a/src/buffer_test.cc +++ b/src/buffer_test.cc @@ -34,6 +34,8 @@ #include "buffer.h" +using namespace std::literals; + namespace nghttp2 { namespace { @@ -52,7 +54,7 @@ void test_buffer_write(void) { assert_size(0, ==, b.rleft()); assert_size(16, ==, b.wleft()); - b.write("012", 3); + b.write(as_uint8_span(std::span{"012"sv})); assert_size(3, ==, b.rleft()); assert_size(13, ==, b.wleft()); @@ -64,7 +66,7 @@ void test_buffer_write(void) { assert_size(13, ==, b.wleft()); assert_ptrdiff(3, ==, b.pos - std::ranges::begin(b.buf)); - auto n = b.write("0123456789ABCDEF", 16); + auto n = b.write(as_uint8_span(std::span{"0123456789ABCDEF"sv})); assert_size(13, ==, n); diff --git a/src/shrpx_memcached_connection.cc b/src/shrpx_memcached_connection.cc index 8fdbcf83..63eddc64 100644 --- a/src/shrpx_memcached_connection.cc +++ b/src/shrpx_memcached_connection.cc @@ -703,7 +703,7 @@ void MemcachedConnection::make_request(MemcachedSendbuf *sendbuf, break; } - headbuf.write(req->key.c_str(), req->key.size()); + headbuf.write(as_uint8_span(std::span{req->key})); sendbuf->send_value_left = req->value.size(); }