* refactor: use libevent public accessors in `handle_request()`
* chore: housekeeping in `handle_request()`
* refactor: use libevent public accessors in `make_response()`
* refactor: use libevent public accessors in `serve_file()`
* refactor: use libevent public accessors in `handle_web_client()`
* refactor: use libevent public accessors in `handle_rpc_from_json()`
* refactor: use libevent public accessors in `handle_rpc()`
* refactor: use libevent public accessors in `isHostnameAllowed()`
* refactor: use libevent public accessors in `test_session_id()`
* test: new `tr_variant` API in `json-test.cc`
* test: new `tr_variant` API in `variant-test.cc`
* chore: housekeeping
* test: new `tr_variant` API in `dht-test.cc`
* fix: use `reinterpret_cast` in `tr_variant::make_raw()`
* fix: add missing `typename` in `tr_variant::make_raw()`
* test: new `tr_variant` API in `settings-test.cc`
* test: new `tr_variant` API in `move-test.cc`
* test: new `tr_variant` API in `rpc-test.cc`
* test: new `tr_variant` API in `makemeta-test.cc`
* test: new `tr_variant` API in `session-test.cc`
* Revert "fix: possible heap-use-after-free with magnet links (#6815)"
This reverts commit 09b67c84b1.
* fix: check if torrent still exists before verifying
* refactor: queue `on_have_all_metainfo()` in session thread instead
* fix: warning: deleted member function should be public [modernize-use-equals-delete]
* fix: warning: variable has inline specifier but is implicitly inlined [readability-redundant-inline-specifier]
* fix: warning: enum uses a larger base type than necessary for its value set [performance-enum-size]
* fix: warning: initializer for member is redundant [readability-redundant-member-init]
* warning: parameter is const-qualified in the function declaration; const-qualification of parameters only has an effect in function definitions [readability-avoid-const-params-in-decls]
* chore: housekeeping
* perf: short circuit peer has block check
* refactor: track active requests in each respective peer
* refactor: swap `ActiveRequests` with new request tracking method
* refactor: use bitfield to store active requests per peer
* perf: check active request numbers first
* refactor: initialise candidate values in constructor
* refactor: better naming
* refactor: use `find_by_block()` more
* refactor: store wishlist mediator in swarm object
* test: make it compile
* test: update endgame test
* test: new test for choke event
* test: remove redundant lines
* test: new test for request event
* test: new test for reject event
* refactor: cache block have state in wishlist
* test: fix `gotBlockResortsPiece`
* fixup! refactor: track active requests in each respective peer
* fixup! test: fix `gotBlockResortsPiece`
* fix: count webseeds when calculating active requests
* build: update xcode project
* fix: add missing `candidates_dirty_` checks
* chore: remove old `depends-on` comments
* fixup! refactor: use bitfield to store active requests per peer
* refactor: extract block peer event to separate function
* perf: reorder conditions by overhead
* perf: check for completed block instead of completed piece
* chore: remove duplicated "unrequested piece" check
* refactor: merge similar block size sanity check
* refactor: use map to store number of requests in wishlist
* refactor: add asserts
* refactor: flush write buffer as soon as there is new data
* refactor: more accurate function naming
* fix: account for corrupt pieces in wishlist
* fix: account for unaligned blocks in wishlist
* Revert "fix: account for unaligned blocks in wishlist"
This reverts commit c3fce93cbae49c11d62e26caccedf55c1987aa95.
* fixup! refactor: use map to store number of requests in wishlist
* fix: account for unaligned blocks in wishlist v2
* chore: add `[[nodiscard]]`
* fixup! fix: account for unaligned blocks in wishlist v2
* fix: crash when handshake finishes in the middle of function
`tr_peer_info::reconnect_interval_has_passed()` contains logic to increase the reconnect interval for unreachable peers, but it has no effect at all currently because they wouldn't be tried in the first place.
* refactor: add log warning for ut metadata in private torrent
* refactor: add log warning for ut pex in private torrent
* refactor: add log warning for ltep handshake without advertised support
* refactor: unify ltep handshake log format
* refactor: removed redundant ltep logs
* refactor: add back log for ut pex
* fix: readability-math-missing-parentheses clang-tidy warnings
* chore: remove unused function tr_ctorGetSession()
* chore: remove unused function tr_ctorGetIncompleteDir()
* chore: make generatePublicKey() a lambda
* fix: readability-container-contains warnings
* fix: misc-use-internal-linkage warnings
* chore: inline generate_public_key() since it was only used once
* fix: update `date_done_` as long as the torrent is done
* fix: `mark_change()` should be called as long as torrent state changes
* chore: remove redundant completeness update in `tr_torrent::start_in_session_thread()`
* fix: log whenever torrent state changes
* chore: add comment to explain `recent_change`
* chore: housekeeping
* fix: recover torrents with missing date done
* fix: only consider peers with listening ports interesting
It's a waste of space to store peers we cannot connect to (because we don't know what their listening port is).
* fix: don't consider peer as interesting just because we are currently connected to it
For example, it's possible for a peer to be "in-use" and "banned" at the same time, albeit just for a very short while.
* code review: assert that peer port is not empty
* fix: allow connection between seeds when pex is enabled
* chore: add comment to explain `tr_peerMsgs::on_torrent_got_metainfo()`
* refactor: remove `tr_swarm::mark_peer_as_seed()`
* fix: update seed flag in response to BT msgs
Regression from 81a42c6bb6
* chore: remove redundant code to update peer seed flag
* refactor: inc failure count if there were no piece data exchanged
* fix: save information from ltep handshake
* refactor: rename `tr_peerIo::is_seed_` to disambiguate
* fix: add instead of set pex flags when adding non-pex and non-resume peers
* fix: don't mark peer as connectable on getting ltep port msg
By BEP-11's definition, this flag is only set for peers whom we successfully initiated an outgoing connection with.
* refactor: set holepunch flag when we get it from ltep handshake
* fix: only accept positive `reqq` in ltep handshake
* refactor: handle encryption preference in `tr_peer_info`
* refactor: prefer own value for utp support
* refactor: make `tr_peer_info::from_first_` const
* refactor: handle holepunch support in `tr_peer_info`
* fix: parse metadata size only if we have a valid extention id for metadata xfer
* refactor: remove `tr_peer_info::add_pex_flags()` as it's no longer needed
* fix: correctly handle holepunch support when there is no `m` key in ltep handshake
* fix: distinguish between upload only and seed
Say we just connected to a partial seed, the peer sends an ltep handshake that has the `upload_only` key, then a BT `Bitfield` message:
Without this change, the pex seed flag would be set when parsing the ltep handshake, then immediately unset when parsing the `Bitfield` message.
We don't want that.
* fix: don't update `tr_peer_info::is_seed_` when merging peer info objects
* perf: priority in peer candidate score need 2 bits only
* fix: prefer to connect to downloading peers
Regression from c867f00153
* chore: add TODO for C++20 opportunity
* refactor: don't filter out peers without `ADDED_F_CONNECTABLE`
revert change from a2849219f7
* refactor: move peer state updates out of peermgr code
---------
Co-authored-by: Charles Kerr <charles@charleskerr.com>
* refactor: don't loop in `tr_handshake::can_read()`
* fix: return `READ_NOW` after handshake success
* code review: more accurate comment wording
* Revert "refactor: don't loop in `tr_handshake::can_read()`"
This reverts commit 4f33520cba6a38171ed203a071158aa37ddcd325.
* refactor: convert `ReadState` to enum class
* refactor: use new `ReadState` value to break out of loop
* refactor: tidy up variables in `tr_handshake::read_crypto_provide()`
* fix: make sure to send out `crypto_select`
* chore: fix comment
---------
Co-authored-by: Charles Kerr <charles@charleskerr.com>
* perf: initialise blame bitfield by piece count
* refactor: set blame for all peers
* refactor: make `tr_swarm::add_strike()` work for all peers
* refactor: move `tr_peer::do_purge` to `tr_peerMsgs`
* fix: limit number of bad pieces to accept from a webseed
* refactor: remove last byte special case in `tr_block_info::byte_loc()`
* fix: handle 0-byte file at the end of torrent in fpm
* test: modify test for 0-byte file at the end of torrent
* fix: handle 0-byte file at the end of torrent in `block_span_for_file`
* fix: accurate timestamp in daemon logs
* fix: gtk build errors
* fixup! fix: gtk build errors
* code review: use system_clock typedefs
* code review: use the full buffer for string view
* fixup! fix: accurate timestamp in daemon logs
* code review: limit exposure of `using`
* feat: log timestamps in local ISO8601 format
* code review: avoid repeated arguments
* code review: locale-independent decimal point character
* fix: pad sub-second part
* Remove `tr_file_move_strict()`, add param to `tr_file_move()` instead
Also restores proper `local_error` logic to handle null error param.
* Remove unused `moved_files` logic
* Rename the callback type and params to match rename decls
* Add torrent ID param to torrent removal callback
* Remove mutex from torrent removal callback
Torrent IDs aren't reused during the lifetime of the session.
* Move main removal callback logic into a separate method
* Do not remove torrent if trashing files failed.
Instead, stop the torrent and sets an error.
* Fixing GTK interface with new file removal behavior.
* C++17 compliant.
* Reverting unrelated change.
* Avoiding allocating unecessary objects.
* Easy review fixes.
* Fixing merge error.
* Adding result callback to tr_torrentRemove().
Using the new callback in Gtk GUI to decide when to remove it from the
interface.
* Reducing indentation level and making the function more readable.
* Using existing Session RefPtr.
* Notifying the client before freeing the torrent in the session.
* Addressing comments and synchronizing callback.
* Moving include.
* Fix constness issue reported by clang-tidy