Skip to content

Commit 5f5fe10

Browse files
committed
LibHTTP: Don't copy payload slices in flush_received_buffers()
Instead of using ByteBuffer::slice() to carve off the remaining part of the payload every time we flush a part of it, we now keep a sliding span (ReadonlyBytes) over it.
1 parent ba5bbde commit 5f5fe10

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

Userland/Libraries/LibHTTP/Job.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ void Job::flush_received_buffers()
110110
return;
111111
dbgln_if(JOB_DEBUG, "Job: Flushing received buffers: have {} bytes in {} buffers for {}", m_buffered_size, m_received_buffers.size(), m_request.url());
112112
for (size_t i = 0; i < m_received_buffers.size(); ++i) {
113-
auto& payload = m_received_buffers[i];
113+
auto& payload = m_received_buffers[i].pending_flush;
114114
auto result = do_write(payload);
115115
if (result.is_error()) {
116116
if (!result.error().is_errno()) {
@@ -127,7 +127,7 @@ void Job::flush_received_buffers()
127127
m_buffered_size -= written;
128128
if (written == payload.size()) {
129129
// FIXME: Make this a take-first-friendly object?
130-
m_received_buffers.take_first();
130+
(void)m_received_buffers.take_first();
131131
--i;
132132
continue;
133133
}
@@ -506,7 +506,7 @@ void Job::on_socket_connected()
506506
}
507507
}
508508

509-
m_received_buffers.append(payload);
509+
m_received_buffers.append(make<ReceivedBuffer>(payload));
510510
m_buffered_size += payload.size();
511511
m_received_size += payload.size();
512512
flush_received_buffers();
@@ -579,8 +579,8 @@ void Job::finish_up()
579579

580580
u8* flat_ptr = flattened_buffer.data();
581581
for (auto& received_buffer : m_received_buffers) {
582-
memcpy(flat_ptr, received_buffer.data(), received_buffer.size());
583-
flat_ptr += received_buffer.size();
582+
memcpy(flat_ptr, received_buffer.pending_flush.data(), received_buffer.pending_flush.size());
583+
flat_ptr += received_buffer.pending_flush.size();
584584
}
585585
m_received_buffers.clear();
586586

@@ -595,7 +595,7 @@ void Job::finish_up()
595595
}
596596

597597
m_buffered_size = flattened_buffer.size();
598-
m_received_buffers.append(move(flattened_buffer));
598+
m_received_buffers.append(make<ReceivedBuffer>(move(flattened_buffer)));
599599
m_can_stream_response = true;
600600
}
601601

Userland/Libraries/LibHTTP/Job.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <AK/FileStream.h>
1010
#include <AK/HashMap.h>
11+
#include <AK/NonnullOwnPtrVector.h>
1112
#include <AK/Optional.h>
1213
#include <LibCore/NetworkJob.h>
1314
#include <LibHTTP/HttpRequest.h>
@@ -54,7 +55,23 @@ class Job : public Core::NetworkJob {
5455
int m_code { -1 };
5556
HashMap<String, String, CaseInsensitiveStringTraits> m_headers;
5657
Vector<String> m_set_cookie_headers;
57-
Vector<ByteBuffer, 2> m_received_buffers;
58+
59+
struct ReceivedBuffer {
60+
ReceivedBuffer(ByteBuffer d)
61+
: data(move(d))
62+
, pending_flush(data.bytes())
63+
{
64+
}
65+
66+
// The entire received buffer.
67+
ByteBuffer data;
68+
69+
// The bytes we have yet to flush. (This is a slice of `data`)
70+
ReadonlyBytes pending_flush;
71+
};
72+
73+
NonnullOwnPtrVector<ReceivedBuffer> m_received_buffers;
74+
5875
size_t m_buffered_size { 0 };
5976
size_t m_received_size { 0 };
6077
Optional<u32> m_content_length;

0 commit comments

Comments
 (0)