forked from premiere/premiere-libtorrent
fix http restart-piece bug whose fix apparently failed to merge from RC_1_0 a long time ago. Also improve logging of restart pieces
This commit is contained in:
parent
8589a7b01c
commit
290260054d
|
@ -133,11 +133,10 @@ void web_peer_connection::disconnect(error_code const& ec
|
|||
if (!m_requests.empty() && !m_file_requests.empty()
|
||||
&& !m_piece.empty() && m_web)
|
||||
{
|
||||
#if 0
|
||||
std::cerr << this << " SAVE-RESTART-DATA: data: " << m_piece.size()
|
||||
<< " req: " << m_requests.front().piece
|
||||
<< " off: " << m_requests.front().start
|
||||
<< std::endl;
|
||||
#ifdef TORRENT_LOGGING
|
||||
peer_log("*** SAVE-RESTART-DATA: [ data: %d req: %d off: %d ]"
|
||||
, int(m_piece.size()), int(m_requests.front().piece)
|
||||
, int(m_requests.front().start));
|
||||
#endif
|
||||
m_web->restart_request = m_requests.front();
|
||||
if (!m_web->restart_piece.empty())
|
||||
|
@ -254,6 +253,11 @@ void web_peer_connection::write_request(peer_request const& r)
|
|||
pr.piece = r.piece + request_offset / piece_size;
|
||||
m_requests.push_back(pr);
|
||||
|
||||
#ifdef TORRENT_LOGGING
|
||||
peer_log("==> REQUESTING [ piece: %d start: %d len: %d ]"
|
||||
, pr.piece, pr.start, pr.length);
|
||||
#endif
|
||||
|
||||
if (m_web->restart_request == m_requests.front())
|
||||
{
|
||||
m_piece.swap(m_web->restart_piece);
|
||||
|
@ -261,11 +265,10 @@ void web_peer_connection::write_request(peer_request const& r)
|
|||
peer_request& front = m_requests.front();
|
||||
TORRENT_ASSERT(front.length > int(m_piece.size()));
|
||||
|
||||
#if 0
|
||||
std::cerr << this << " RESTART-DATA: data: " << m_piece.size()
|
||||
<< " req: ( " << front.piece << ", " << front.start
|
||||
<< ", " << (front.start + front.length - 1) << ")"
|
||||
<< std::endl;
|
||||
#ifdef TORRENT_LOGGING
|
||||
peer_log("*** RESTART-DATA: [ data: %d req: (%d, %d) ]"
|
||||
, int(m_piece.size()), int(front.piece), int(front.start)
|
||||
, int (front.start + front.length - 1));
|
||||
#endif
|
||||
|
||||
req.start += m_piece.size();
|
||||
|
@ -313,8 +316,8 @@ void web_peer_connection::write_request(peer_request const& r)
|
|||
return;
|
||||
}
|
||||
|
||||
std::vector<file_slice> files = info.orig_files().map_block(r.piece, r.start
|
||||
, r.length);
|
||||
std::vector<file_slice> files = info.orig_files().map_block(req.piece, req.start
|
||||
, req.length);
|
||||
|
||||
for (std::vector<file_slice>::iterator i = files.begin();
|
||||
i != files.end(); ++i)
|
||||
|
@ -415,6 +418,10 @@ bool web_peer_connection::maybe_harvest_block()
|
|||
buffer::const_interval recv_buffer = m_recv_buffer.get();
|
||||
|
||||
incoming_piece(front_request, &m_piece[0]);
|
||||
#ifdef TORRENT_LOGGING
|
||||
peer_log("<== POP REQUEST [ piece: %d start: %d len: %d ]"
|
||||
, front_request.piece, front_request.start, front_request.length);
|
||||
#endif
|
||||
m_requests.pop_front();
|
||||
if (associated_torrent().expired()) return false;
|
||||
TORRENT_ASSERT(m_block_pos >= front_request.length);
|
||||
|
@ -878,11 +885,21 @@ void web_peer_connection::on_receive(error_code const& error
|
|||
|
||||
if (!range_overlaps_request)
|
||||
{
|
||||
// this means the end of the incoming request ends _before_ the
|
||||
// first expected byte (fs + m_piece.size())
|
||||
|
||||
incoming_piece_fragment((std::min)(payload_transferred
|
||||
, front_request.length - m_block_pos));
|
||||
received_bytes(0, bytes_transferred);
|
||||
// this means the end of the incoming request ends _before_ the
|
||||
// first expected byte (fs + m_piece.size())
|
||||
|
||||
#ifdef TORRENT_LOGGING
|
||||
std::vector<file_slice> sl = info.orig_files().map_block(
|
||||
front_request.piece, front_request.start, front_request.start
|
||||
+ front_request.length);
|
||||
peer_log("INVALID HTTP RESPONSE [ in=(%d, %d-%d) expected=(%d, %d-%d) piece: %d ]"
|
||||
, file_index, range_start, range_end, sl[0].file_index
|
||||
, sl[0].offset, sl[0].offset + sl[0].size, front_request.piece);
|
||||
#endif
|
||||
disconnect(errors::invalid_range, op_bittorrent, 2);
|
||||
return;
|
||||
}
|
||||
|
@ -940,6 +957,10 @@ void web_peer_connection::on_receive(error_code const& error
|
|||
incoming_piece_fragment(r.length);
|
||||
incoming_piece(r, recv_buffer.begin);
|
||||
|
||||
#ifdef TORRENT_LOGGING
|
||||
peer_log("<== POP REQUEST [ piece: %d start: %d len: %d ]"
|
||||
, r.piece, r.start, r.length);
|
||||
#endif
|
||||
m_requests.pop_front();
|
||||
if (associated_torrent().expired()) return;
|
||||
TORRENT_ASSERT(m_block_pos >= r.length);
|
||||
|
|
|
@ -390,14 +390,12 @@ int EXPORT run_http_suite(int proxy, char const* protocol, bool test_url_seed
|
|||
}
|
||||
*/
|
||||
{
|
||||
libtorrent::session ses(fingerprint(" ", 0,0,0,0), 0);
|
||||
|
||||
settings_pack pack;
|
||||
pack.set_int(settings_pack::max_queued_disk_bytes, 256 * 1024);
|
||||
pack.set_str(settings_pack::listen_interfaces, "0.0.0.0:51000");
|
||||
pack.set_int(settings_pack::max_retry_port_bind, 1000);
|
||||
pack.set_int(settings_pack::alert_mask, ~(alert::progress_notification | alert::stats_notification));
|
||||
ses.apply_settings(pack);
|
||||
libtorrent::session ses(pack, 0);
|
||||
|
||||
test_transfer(ses, torrent_file, proxy, port, protocol, test_url_seed
|
||||
, chunked_encoding, test_ban, keepalive);
|
||||
|
|
|
@ -28,7 +28,9 @@ class http_handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
|||
|
||||
def do_GET(s):
|
||||
|
||||
#print s.requestline
|
||||
print 'INCOMING-REQUEST: ', s.requestline
|
||||
print s.headers
|
||||
|
||||
global chunked_encoding
|
||||
global keepalive
|
||||
|
||||
|
@ -99,7 +101,6 @@ class http_handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
|||
end_range = size
|
||||
if 'Range' in s.headers:
|
||||
s.send_response(206)
|
||||
s.send_header('Content-Range', 'bytes ' + str(start_range) + '-' + str(end_range - 1) + '/' + str(size))
|
||||
st, e = s.headers['range'][6:].split('-', 1)
|
||||
sl = len(st)
|
||||
el = len(e)
|
||||
|
@ -111,6 +112,8 @@ class http_handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
|||
ei = int(e)
|
||||
if ei < size:
|
||||
start_range = size - ei
|
||||
s.send_header('Content-Range', 'bytes ' + str(start_range) \
|
||||
+ '-' + str(end_range - 1) + '/' + str(size))
|
||||
else:
|
||||
s.send_response(200)
|
||||
s.send_header('Accept-Ranges', 'bytes')
|
||||
|
|
Loading…
Reference in New Issue