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:
parent
eb39fa3022
commit
67e2927044
2 changed files with 28 additions and 1 deletions
|
@ -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).
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue