Skip to content

Commit 8e8b14e

Browse files
committed
Implementing append and read correctly.
1 parent a1bbace commit 8e8b14e

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

boost/network/protocol/http/request/request_base.ipp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,19 @@ void request_storage_base_pimpl::append(char const *data, size_t size) {
7070
new (std::nothrow) char[chunk_size_], 0));
7171
}
7272
std::pair<char *, size_t> *chunk = &chunks_.back();
73+
BOOST_ASSERT(chunk_size_ >= chunk->second);
7374
size_t remaining = chunk_size_ - chunk->second;
7475
while (remaining < size) {
75-
std::memcpy(chunk->first + chunk->second, data, size - remaining);
76-
chunk->second += size - remaining;
77-
data += remaining;
78-
size -= remaining;
76+
size_t bytes_to_write = std::min(size - remaining, chunk_size_);
77+
std::memcpy(chunk->first + chunk->second, data, bytes_to_write);
78+
chunk->second += bytes_to_write;
79+
BOOST_ASSERT(chunk->second <= chunk_size_);
80+
data += bytes_to_write;
81+
size -= bytes_to_write;
7982
chunks_.push_back(std::make_pair(
8083
new (std::nothrow) char[chunk_size_], 0));
8184
chunk = &chunks_.back();
82-
remaining = chunk_size_ - chunk->second;
85+
remaining = chunk_size_;
8386
}
8487
if (size > 0) {
8588
std::memcpy(chunk->first + chunk->second, data, size);
@@ -92,16 +95,20 @@ size_t request_storage_base_pimpl::read(char *destination, size_t offset, size_t
9295
// First we find which chunk we're going to read from using the provided
9396
// offset and some arithmetic to determine the correct one.
9497
size_t chunk_index = offset / chunk_size_;
98+
offset = offset % chunk_size_;
9599

96100
// Then we start copying up to size data either until we've reached the end
97101
// or we're
98102
size_t chunks_count = chunks_.size();
99103
size_t read_count = 0;
100104
while (size > 0 && chunk_index < chunks_.size()) {
101105
size_t bytes_to_read = std::min(chunks_[chunk_index].second, size);
102-
std::memcpy(destination + read_count, chunks_[chunk_index].first, bytes_to_read);
106+
std::memcpy(destination + read_count,
107+
chunks_[chunk_index].first + offset,
108+
bytes_to_read);
103109
read_count += bytes_to_read;
104110
size -= bytes_to_read;
111+
offset = 0;
105112
++chunk_index;
106113
}
107114
return read_count;

libs/network/test/http/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ if (Boost_FOUND)
1818
${Boost_LIBRARIES}
1919
cppnetlib-message
2020
cppnetlib-http-message)
21+
set_target_properties(cpp-netlib-http-request_base_test
22+
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CPP-NETLIB_BINARY_DIR}/tests)
2123
add_test(cpp-netlib-http-request_base_test
2224
${CPP-NETLIB_BINARY_DIR}/tests/cpp-netlib-http-request_base_test)
2325

0 commit comments

Comments
 (0)