Network_asio: split upload buffer to 4kB chunks

This allows Boost.Asio to track upload progress, and cancel uploading of
all chunks that haven't been sent yet.

Fixes #1439, #2591.
This commit is contained in:
Jyrki Vesterinen 2018-03-06 20:52:26 +02:00
parent eb39fa3022
commit 67e2927044
2 changed files with 28 additions and 1 deletions

View file

@ -1,4 +1,7 @@
Version 1.13.11+dev:
* Add-ons client:
* Addon upload progress bar now works also on Windows (bug #1439).
* Fixed inability to cancel addon upload (bug #2591).
* Add-ons server:
* Added support for adding free-form comma-separated tags to add-ons in
their publishing info (bug #2565).

View file

@ -18,6 +18,7 @@
#include "serialization/parser.hpp"
#include "utils/functional.hpp"
#include <algorithm>
#include <cstdint>
#include <deque>
@ -27,6 +28,29 @@ static lg::log_domain log_network("network");
#define WRN_NW LOG_STREAM(warn, log_network)
#define ERR_NW LOG_STREAM(err, log_network)
namespace
{
std::deque<boost::asio::const_buffer> split_buffers(boost::asio::streambuf::const_buffers_type source_buffers)
{
const unsigned int chunk_size = 4096;
std::deque<boost::asio::const_buffer> buffers;
for(boost::asio::const_buffer b : source_buffers) {
unsigned int remaining_size = boost::asio::buffer_size(b);
const uint8_t* data = boost::asio::buffer_cast<const uint8_t*>(b);
while(remaining_size > 0u) {
unsigned int size = std::min(remaining_size, chunk_size);
buffers.emplace_back(data, size);
data += size;
remaining_size -= size;
}
}
return buffers;
}
}
namespace network_asio
{
using boost::system::system_error;
@ -119,7 +143,7 @@ void connection::transfer(const config& request, config& response)
payload_size_ = htonl(bytes_to_write_ - 4);
boost::asio::streambuf::const_buffers_type gzipped_data = write_buf_->data();
std::deque<boost::asio::const_buffer> bufs(gzipped_data.begin(), gzipped_data.end());
auto bufs = split_buffers(gzipped_data);
bufs.push_front(boost::asio::buffer(reinterpret_cast<const char*>(&payload_size_), 4));