There are some changes to the API in this version. They are documented here. The headline features for this release are:
webtorrent support
Thanks to Paul-Louis Ageneau https://github.com/paullouisageneau, and apologies for this feature having been unreleased for so long.
This feature is now enabled by default. The last push to get this ready has been to add fuzz targets for WebRTC specific features, rtc_parse_endpoint, rtc_peer_conn, rtc_tracker_offer and sdp_offer. The dependencies for webtorrent support are pulled in as submodules in the repository. webtorrent also adds a new dependency on boost-json.
Note that the webtorrent support significantly widens the attack surface of libtorrent, if you don't need this feature, it's probably best disabled (webtorrent=off / -Dwebtorrent=OFF)
pread_disk_io
A new disk I/O backend that uses pwritev and preadv (and windows counterparts). This is hopefully addressing the misstep of transitioning all disk I/O over to memory mapped files. The mmap disk backend is still available and is probably more efficient for local NVMe drives. But for spinning disks, network mounts or FUSE drives, regular I/O calls should be a lot more efficient. pread_disk_io is now the default.
One of the main challenges with the new disk I/O has been to get the multi-threading right. It computes piece hashes on dedicated threads, separate from those making the I/O calls. This lets us advertise and upload pieces before they're flushed to disk, maintaining high throughput.
Other highlights are:
- add max_directory_depth limit to load_torrent_limits to bound file path depth when loading torrents
- fix race in wait_for_alert(), and update its return value
- optimize torrent_handle::torrent_file()
- add option to not validate v1 hashes for hybrid torrents
- add post_file_status() to query them asynchronously
- add post_file_priorities() to query them asynchronously
- fix local service discovery not being correctly staggered
- make the save path for part files configurable
- retry failed SAM connection (for i2p)
- deprecated remap_files(), and prevent it from breaking v2 torrents
- fix peer_info holding an i2p destination
- implement i2p_pex, peer exchange support for i2p torrents
- deprecate torrent_alert::torrent_name()
- requires OpenSSL minimum version 1.1.0 with SNI support
- try harder to bind TCP and UDP sockets to the same port
- made disk_interface's status_t type a flags type
- optimize resume data format to use less space
- add a simpler overload to bencode() returning a vector
- introduced a new API for creating torrents, enabling file_storage optimizations
- default build to not include functions deprecated in libtorrent 1.1 and earlier
- add comment, created_by and creation_date to add_torrent_params
- move session_flags to session_params
- the entry class is now a standard variant type
- use std::string_view instead of boost counterpart
- libtorrent now requires C++17 to build
- removed support for BEP 17 web seeds (in favor of BEP 19)
- fix bug where torrent_status::total was not set for seeds
full commit log
- bump C++ version to 17 by @arvidn in #4167
- Use time_duration instead of int for predictive pieces by @vktr in #4707
- remove some noexcept-movable hacks that are no longer necessary by @arvidn in #4708
- [clang-tidy] use bool literals by @neheb in #4757
- [clang-tidy] remove bad const by @neheb in #4759
- [clang-tidy] use using instead of typedef by @neheb in #4756
- [clang-tidy] use make-unique by @neheb in #4751
- Test merge by @arvidn in #4765
- WebTorrent support by @paullouisageneau in #4123
- add readability-redundant-member-init clang_tidy checker by @arvidn in #4792
- apply (most of) readability-qualified-auto changes by @arvidn in #4789
- enable redundant preprocessor directive check in travis by @FranciscoPombal in #4790
- Test merge by @arvidn in #4862
- fix test_transfer on appveyor by @arvidn in #4865
- use standard string_view by @arvidn in #4704
- minor formatting update to netlink types by @arvidn in #4834
- Fix Jamfile in libdatachannel by @paullouisageneau in #4867
- Fix Jamfile libjuice crypto dependencies by @paullouisageneau in #4882
- moved torrent and choker to aux by @aldenml in #4488
- moved bloom_filter.hpp and bt_peer_connection.hpp to aux by @aldenml in #4885
- moved hash_picker.hpp and http_parser.hpp to aux by @aldenml in #4887
- moved crc32c.hpp and xml_parse.hpp to aux by @aldenml in #4888
- fixup C-binding by @arvidn in #4869
- Test merge by @arvidn in #4894
- moved http_connection.hpp to aux by @aldenml in #4895
- Test merge by @arvidn in #4905
- moved ip_voter.hpp and io.hpp to aux by @aldenml in #4902
- Update libdatachannel to fix usrsctp callback crash by @paullouisageneau in #4907
- moved peer_list.hpp and stack_allocator.hpp to aux by @aldenml in #4908
- Test merge by @arvidn in #4915
- moved web_connection_base.hpp, web_peer_connection.hpp and http_seed_connection.hpp to aux by @aldenml in #4920
- fixing warnings of tests and logging=off by @aldenml in #4935
- setup of travis tests for s390x architecture by @aldenml in #4937
- mounting /sys when chroot to be able to use lscpu by @aldenml in #4941
- Test merge by @arvidn in #4950
- Test merge by @arvidn in #4997
- Test merge by @arvidn in #5002
- Test merge by @arvidn in #5023
- moved torrent_peer.hpp and torrent_peer_allocator.hpp to aux by @aldenml in #4938
- Opt wcslen(L"\DEVICE\TCPIP_") by @pavel-pimenov in #5032
- Update C++ compile features list for C++17 by @FranciscoPombal in #5003
- moved stat.hpp and stat_cache.hpp to aux by @aldenml in #5041
- remove old work-around by @arvidn in #5080
- Cleanup license header by @arvidn in #5088
- remove support for BEP 17 web seeds by @arvidn in #5071
- Test merge by @arvidn in #5101
- Test merge by @arvidn in #5106
- moved udp_socket.hpp and udp_tracker_connection.hpp to aux by @aldenml in #5107
- Test merge by @arvidn in #5136
- moved http_tracker_connection.hpp to aux by @aldenml in #5145
- Test merge by @arvidn in #5169
- clang-tidy updates by @arvidn in #5177
- fix calculation in tracker_manager::num_requests when webtorrent is enable by @aldenml in #5146
- replaced boost::optional with std::optional by @aldenml in #5185
- WebTorrent: Update libdatachannel by @paullouisageneau in #5188
- WebTorrent: Fix peer list sorting by @paullouisageneau in #5184
- Test merge by @arvidn in #5191
- using structured binding by @aldenml in #5196
- modernize entry type to use std::variant by @arvidn in #5089
- Aligned union by @arvidn in #5090
- WebTorrent: Prevent protocol encryption over WebRTC by @paullouisageneau in #5200
- Test merge by @arvidn in #5213
- Test merge by @arvidn in #5238
- Test merge by @arvidn in #5267
- Test merge by @arvidn in #5282
- Test merge by @arvidn in #5328
- fix compilation when using boost >= 1.75 and json by @aldenml in #5738
- Test merge by @arvidn in #5740
- fix python binding build with deprecated functions by @arvidn in #5744
- move session flags into the session_params object by @arvidn in #5742
- Test merge by @arvidn in #5775
- using std::clamp from standard by @aldenml in #5779
- moved string_util.hpp to aux by @aldenml in #5795
- moved vector_utils.hpp to aux by @aldenml in #5800
- moved request_blocks.hpp to aux by @aldenml in #5802
- added vector utils unit tests by @aldenml in #5803
- failing libatomic test is not a fatal error by @arvidn in #5806
- Test merge by @arvidn in #5807
- moved peer_connection.hpp to aux by @aldenml in #5809
- moved piece_block_progress.hpp to aux by @aldenml in #5815
- moved utf8.hpp to aux by @aldenml in #5820
- Test merge by @arvidn in #5824
- moved tracker_manager.hpp to aux by @aldenml in #5822
- moved sliding_average.hpp and tailqueue.hpp to aux by @aldenml in #5826
- moved mmap_storage.hpp and part_file.hpp to aux by @aldenml in #5828
- Test merge by @arvidn in #5834
- moved http_stream.hpp and ssl_stream.hpp to aux by @aldenml in #5833
- fail loading torrents with too many duplicate file names (as that's a… by @arvidn in #5835
- moved peer.hpp and resolve_links.hpp to aux by @aldenml in #5837
- moved platform_util.hpp, puff.hpp and union_endpoint.hpp to aux by @aldenml in #5838
- moved copy_ptr.hpp, file.hpp and parse_url.hpp to aux by @aldenml in #5841
- moved piece_picker.hpp to aux by @aldenml in #5844
- Test merge by @arvidn in #5847
- moved link.hpp and pe_crypto.hpp to aux by @aldenml in #5845
- moved random.hpp to aux by @aldenml in #5850
- moved socket_io.hpp to aux by @aldenml in #5853
- Test merge by @arvidn in #5855
- remove Jamfile picking up CXXFLAGS and LDFLAGS automatically. Move it… by @arvidn in #5856
- moved deadline_timer.hpp and debug.hpp to aux by @aldenml in #5857
- moved sha1.hpp and sha256.hpp to aux by @aldenml in #5859
- moved enum_net.hpp, peer_class_set.hpp and proxy_base.hpp to aux by @aldenml in #5864
- Fix Boost.JSON submodule by @paullouisageneau in #5869
- moved netlink.hpp and ssl.hpp to aux by @aldenml in #5871
- moved lsd.hpp to aux by @aldenml in #5875
- WebTorrent: Add keepalive with ping on WebSocket by @paullouisageneau in #5882
- WebTorrent: Update libdatachannel by @paullouisageneau in #5884
- WebTorrent: Remove leftover compilation flag for g++ by @paullouisageneau in #5890
- WebTorrent: Fix assert "p->connection == &c" by @paullouisageneau in #5915
- add CI test for the C binding by @arvidn in #5922
- deprecate volatile_read_cache by @arvidn in #5927
- Test merge by @arvidn in #5929
- [1/?] Add pre-commit config. by @AllSeeingEyeTolledEweSew in #5901
- use the built-in hidden-feature in b2 by @arvidn in #5931
- don't announce stopped-event to websocket trackers. by @arvidn in #5933
- Ensure we don't attempt to make outgoing connections to RTC peers by @arvidn in #5942
- Test merge by @arvidn in #5946
- Test merge by @arvidn in #5953
- Test merge by @arvidn in #5965
- Test merge by @arvidn in #5976
- All seeing eye tolled ewe sew asetes setup.py cleanup final by @arvidn in #5966
- Remove msvc toolset default, and libtool support by @AllSeeingEyeTolledEweSew in #5969
- Default setup.py to do static linking on all platforms by @AllSeeingEyeTolledEweSew in #5970
- Add code-generation scripts to pre-commit by @AllSeeingEyeTolledEweSew in #5997
- fix-gen-fwd script to remove the existing fwd.hpp as best-effort, and… by @arvidn in #6003
- fix issue in parsing invalid webtorrent tracker responses by @arvidn in #6005
- [5.1.1/?] Apply python formatting and linting to a selection of tools by @AllSeeingEyeTolledEweSew in #5956
- WebTorrent: Update libdatachannel by @paullouisageneau in #5998
- remove unused code in piece picker by @arvidn in #6006
- [6/?] Rework python include/library detection. Use tox for running tests by @AllSeeingEyeTolledEweSew in #5905
- Test merge by @arvidn in #6041
- add size_on_disk() to file_storage and torrent_info by @arvidn in #6042
- deprecate sha-1 file hashes (torrent file extension field) by @arvidn in #6044
- WebTorrent: Update libdatachannel by @paullouisageneau in #6046
- fix gen_convenience_header by @arvidn in #6052
- build android arm 32 bits with webtorrent enabled by @aldenml in #6051
- Test merge by @arvidn in #6059
- Test merge by @arvidn in #6072
- fix size_on_disk patch by @arvidn in #6065
- Test merge by @arvidn in #6097
- fix makefile to work when CXXFLAGS or LDFLAGS are empty by @arvidn in #6100
- update copyright and license headers (of a few new files merged from … by @arvidn in #6101
- Test merge by @arvidn in #6111
- Adding sequential_start to piece_picker to speed up sequential downloads by @markmdscott in #5996
- Add unit tests for WebSocket tracker parsing by @paullouisageneau in #6120
- WebTorrent: Update libdatachannel by @paullouisageneau in #6121
- Test merge by @arvidn in #6143
- WebTorrent: Update libdatachannel by @paullouisageneau in #6144
- expand use of std::variant in disk job to simplify logic by @arvidn in #6139
- Test merge by @arvidn in #6189
- bump libdatachannel submodule to fix warning by @arvidn in #6190
- Test merge by @arvidn in #6224
- [7/?] Expand test coverage of the python bindings by @AllSeeingEyeTolledEweSew in #5990
- Test merge by @arvidn in #6230
- Fix C compilation with CMake by @paullouisageneau in #6231
- Test merge by @arvidn in #6240
- Test merge by @arvidn in #6255
- WebTorrent: Update libdatachannel to v0.13.3 by @paullouisageneau in #6233
- Test merge by @arvidn in #6258
- Restrict some github actions by path by @AllSeeingEyeTolledEweSew in #6191
- update copyright headers in source files by @arvidn in #6261
- [8/?] Add type stubs to the python bindings by @AllSeeingEyeTolledEweSew in #6187
- WebTorrent: Update libdatachannel to v0.13.4 by @paullouisageneau in #6264
- Test merge by @arvidn in #6267
- Add type stubs and tests for sha256_hash by @AllSeeingEyeTolledEweSew in #6298
- hash(info_hash_t) is stable now, enable test by @AllSeeingEyeTolledEweSew in #6299
- Fix seed rank calculation when we're the only known seed by @thrnz in #6311
- use braille for client_test piece matrix by @arvidn in #6332
- Test merge by @arvidn in #6333
- More python deprecations by @AllSeeingEyeTolledEweSew in #6335
- Deprecate bencode('str') by @AllSeeingEyeTolledEweSew in #6334
- Check bounds on file_storage and create_torrent by @AllSeeingEyeTolledEweSew in #6352
- Enable some more dht_put_alert tests by @AllSeeingEyeTolledEweSew in #6362
- Add binding for announce_flags_t by @AllSeeingEyeTolledEweSew in #6367
- Enable tests of ip_filter.export() by @AllSeeingEyeTolledEweSew in #6359
- Fix some tests after d9807b6 by @AllSeeingEyeTolledEweSew in #6354
- Fix binding for file_progress_flags_t by @AllSeeingEyeTolledEweSew in #6369
- Remove unused set_root_cert(bytes) test by @AllSeeingEyeTolledEweSew in #6357
- Fix torrent_info.add_url_seed support by @AllSeeingEyeTolledEweSew in #6360
- Deprecate add_piece(i, 'str') by @AllSeeingEyeTolledEweSew in #6365
- Add binding for close_reason_t by @AllSeeingEyeTolledEweSew in #6370
- Deprecate rename_file(bytes) by @AllSeeingEyeTolledEweSew in #6364
- Enable tests for add_torrent_params fields and session_status.active_… by @AllSeeingEyeTolledEweSew in #6361
- Re-enable the add_collection python test by @AllSeeingEyeTolledEweSew in #6356
- Check against various bad reads by @AllSeeingEyeTolledEweSew in #6355
- Make dht mutable item keys be bytes-only by @AllSeeingEyeTolledEweSew in #6363
- Add binding to fix session.add_port_mapping by @AllSeeingEyeTolledEweSew in #6368
- Make dht_put_alert.salt and dht_immutable_item_alert.salt be bytes by @AllSeeingEyeTolledEweSew in #6351
- Add generate_fingerprint_bytes by @AllSeeingEyeTolledEweSew in #6349
- Add binding for dht_module_t by @AllSeeingEyeTolledEweSew in #6372
- Deprecate session.add_torrent(dict) and parse_magnet_uri_dict() by @AllSeeingEyeTolledEweSew in #6353
- Deprecate sha1_hash('str') by @AllSeeingEyeTolledEweSew in #6373
- Fixup fingerprint and its deprecations by @AllSeeingEyeTolledEweSew in #6358
- Deprecate use of bytes with paths in file_storage by @AllSeeingEyeTolledEweSew in #6366
- Remove binding for session_params.ext_state by @AllSeeingEyeTolledEweSew in #6379
- Add sha256 bounds/type checking similar to sha1 by @AllSeeingEyeTolledEweSew in #6383
- Enable tests after #6162 was merged to master by @AllSeeingEyeTolledEweSew in #6382
- Fix bindings for members of picker_log_alert by @AllSeeingEyeTolledEweSew in #6371
- Fix deprecated session.add_torrent form to prevent crash by @AllSeeingEyeTolledEweSew in #6377
- Removed some unused tests by @AllSeeingEyeTolledEweSew in #6384
- Python DHT alert test improvements by @AllSeeingEyeTolledEweSew in #6391
- Ensure write_session_params always returns a dict entry by @AllSeeingEyeTolledEweSew in #6380
- Test merge by @arvidn in #6434
- Make TorrentDeleteFailedAlertTest work in more environments by @AllSeeingEyeTolledEweSew in #6445
- Add session.session_state() by @AllSeeingEyeTolledEweSew in #6381
- Deprecate some classes by @AllSeeingEyeTolledEweSew in #6378
- Loosen restrictions on error categories by @AllSeeingEyeTolledEweSew in #6446
- Clean up tests for python demo scripts by @AllSeeingEyeTolledEweSew in #6441
- AppVeyor: switch the CMake build to Ninja Multi-Config generators for easier build parallelization by @FranciscoPombal in #6195
- Migrate to OpenSSL EVP interface for hashing by @Chocobo1 in #6455
- Add pre-commit hooks to filter-rst.py by @AllSeeingEyeTolledEweSew in #6474
- Run pre-commit hooks on gen_settings_doc.py by @AllSeeingEyeTolledEweSew in #6475
- bump boost version to use on appveyor by @arvidn in #6491
- Test merge by @arvidn in #6501
- Test merge by @arvidn in #6506
- Default python bindings to crypto=openssl (master) by @AllSeeingEyeTolledEweSew in #6497
- Guard against self assignment by @Chocobo1 in #6514
- Test merge by @arvidn in #6550
- Test merge by @arvidn in #6565
- Test merge by @arvidn in #6582
- Update copyright by @arvidn in #6587
- WebTorrent: Update libdatachannel to v0.16.1 by @paullouisageneau in #6602
- Test merge by @arvidn in #6605
- Test merge by @arvidn in #6621
- Test merge by @arvidn in #6664
- Use UTF-8 encoding for messages coming from boost on Windows by @Chocobo1 in #6665
- remove redundant calls to convert_from_native() by @arvidn in #6669
- use github's native cancel previous jobs by @arvidn in #6693
- Test merge by @arvidn in #6704
- minor cleanup and lint oriented refactor by @aldenml in #6713
- Test merge by @arvidn in #6727
- Exporting SYSTEM_VERSION_COMPAT to fix tox failing on macOS by @Samfun75 in #6729
- Test merge by @arvidn in #6778
- Test merge by @arvidn in #6804
- WebTorrent: Update libdatachannel to v0.17.1 by @paullouisageneau in #6826
- removed unused variable in torrent.cpp by @aldenml in #6840
- V560 A part of conditional expression is always true: !found_on_disk. by @pavel-pimenov in #6854
- fix skipping of client_test python test on non-linux by @arvidn in #6876
- Test merge by @arvidn in #6879
- removed unused file, minor namespace refactor by @aldenml in #6900
- Test merge by @arvidn in #6909
- Test merge by @arvidn in #6926
- move the protocol version field for tracker alerts by @arvidn in #6921
- make some member functions on session_impl const by @arvidn in #6927
- Test merge by @arvidn in #6929
- Unique trackers by @arvidn in #6873
- Test merge by @arvidn in #6933
- Test merge by @arvidn in #6947
- factor out storage_array from mmap_disk_io by @arvidn in #6949
- Test merge by @arvidn in #6954
- Simplify thread pool by @arvidn in #6956
- use boost static_vector in disk_completed_queue by @arvidn in #6957
- Test merge by @arvidn in #6962
- Test merge by @arvidn in #6974
- Test merge by @arvidn in #6998
- Test merge by @arvidn in #7004
- refactor file_view_pool by @arvidn in #7005
- fix run_benchmark.py by @arvidn in #7008
- remove some unused includes by @arvidn in #7009
- Test merge by @arvidn in #7012
- Test merge by @arvidn in #7020
- bump version to 2.1 by @arvidn in #7021
- remove unused variable in torrent::recalc_share_mode by @aldenml in #7022
- Test merge by @arvidn in #7064
- Test merge by @arvidn in #7079
- Test merge by @arvidn in #7085
- add upgrade_to_2.1 document by @arvidn in #7086
- add comment, created_by and creation_date to add_torrent_params by @arvidn in #7090
- Test merge by @arvidn in #7095
- Test merge by @arvidn in #7106
- Test merge by @arvidn in #7111
- move python binding for file_storage to its own file by @arvidn in #7116
- make python binding build without deprecated functions by @arvidn in #7115
- Path typesafe flags by @arvidn in #7118
- improve round-trip test in test_create_torrent by @arvidn in #7120
- use new create_torrent functions in tests and examples by @arvidn in #7121
- make fuzzers build without deprecated functions by @arvidn in #7124
- Test merge by @arvidn in #7127
- clean-up settings_pack default values by @arvidn in #7128
- Change the default to disable functions deprecated in 1.1 and earlier by @arvidn in #7129
- introduce new API for create_torrent by @arvidn in #7122
- Test merge by @arvidn in #7147
- Test merge by @arvidn in #7164
- some typos and minor refactor by @aldenml in #7199
- add a simpler overload to bencode() returning a vector by @arvidn in #7210
- optimize resume data format to use less space by @arvidn in #7211
- fix printing of piece-matrix in client_test by @arvidn in #7220
- Test merge by @arvidn in #7223
- Test merge by @arvidn in #7224
- create_torrent does not need fileroots to be a member to create_torrent by @arvidn in #7227
- Test merge by @arvidn in #7233
- update documentation for metadata_received_alert by @arvidn in #7253
- Fix WebSocket tracker peer id changing in answer by @paullouisageneau in #7249
- Make WebTorrent offer_id length consistent with the reference implementation by @paullouisageneau in #7250
- optimize create_torrent::generate_buf() by @arvidn in #7230
- move towards an immutable torrent_info by @arvidn in #7255
- Test merge by @arvidn in #7263
- make status_t a proper flag type by @arvidn in #7266
- fix recently introduced create_torrent::generate_buf() by @arvidn in #7268
- WebTorrent: update libdatachannel to v0.18 (re-licensed to MPL 2.0) by @paullouisageneau in #7251
- Test merge by @arvidn in #7276
- Test merge by @arvidn in #7280
- deprecate storing web seeds and trackers in torrent_info by @arvidn in #7271
- Expression 'size_left > 0' is always true. by @pavel-pimenov in #7319
- Test merge by @arvidn in #7320
- Test merge by @arvidn in #7347
- add need_save_resume field to torrent_status by @arvidn in #7348
- Test merge by @arvidn in #7366
- minor lint guided refactor and cleanup by @aldenml in #7369
- Test merge by @arvidn in #7382
- Test merge by @arvidn in #7393
- Test merge by @arvidn in #7423
- fix printing of (large) pieces by @arvidn in #7428
- Test merge by @arvidn in #7434
- client_test print fixes by @arvidn in #7448
- torrent invariant check debug output by @arvidn in #7450
- Test merge by @arvidn in #7505
- Test merge by @arvidn in #7550
- Test merge by @arvidn in #7580
- Test merge by @arvidn in #7613
- fix user defined literal warning by @arvidn in #7614
- don't include libdatachannel examples in tarball by @arvidn in #7617
- fix warnings in new versions of clang by @arvidn in #7600
- Test merge by @arvidn in #7620
- support allocating 0 items in an alloca array by @arvidn in #7624
- various minor updates to tests by @arvidn in #7627
- expose field to configure disk I/O backend to python by @arvidn in #7623
- when debug iterators are enabled enable them in boost-multi-index by @arvidn in #7622
- pass in whether a torrent has v1 and/or v2 hashes in storage_params by @arvidn in #7625
- add feature to enable interruption of disk I/O worker threads by @arvidn in #7626
- try harder to bind TCP and UDP sockets to the same port by @arvidn in #7632
- Test merge by @arvidn in #7633
- add option to select disk I/O back-end in disk_io_stress_test by @arvidn in #7637
- add option to select disk I/O backend to client_test by @arvidn in #7638
- attempt to disable auto-update of homebrew packages on CI by @arvidn in #7645
- improve const correctness of disk I/O code by @arvidn in #7644
- bump github actions windows image to 2022 by @arvidn in #7661
- try encode web seed redirect location by @ajax16384 in #7640
- Test merge by @arvidn in #7671
- Test merge by @arvidn in #7686
- Various CI fixes by @qstokkink in #7688
- Moved type stubs into libtorrent directory by @qstokkink in #7691
- Update libdatachannel to v0.21.2 by @paullouisageneau in #7701
- Test merge by @arvidn in #7713
- Test merge by @arvidn in #7744
- extend the disk-io stress test to ensure more invariants by @arvidn in #7756
- slight improvement to disk I/O debug logging by @arvidn in #7755
- add new example program, to organize a fuzzing corpus of .torrent files by @arvidn in #7751
- DHT scrape by @arvidn in #7757
- Test merge by @arvidn in #7760
- make file_pool_impl have the open_unmap_lock mutex type configurable by @arvidn in #7761
- fix a few shadowing variable warnings under Apple clang 16.0.0 by @aldenml in #7762
- fix printing of piece-bar in client-test by @arvidn in #7766
- improve printing of file progress in client_test by @arvidn in #7767
- Test merge by @arvidn in #7770
- extend test_transfer to cover the posix disk I/O as well as large pieces by @arvidn in #7774
- requires openssl minimum version 1.1.0 by @aldenml in #7775
- Test merge by @arvidn in #7783
- add build option debug-disk-pool to log disk buffers allocated by category by @arvidn in #7792
- Test merge by @arvidn in #7797
- Test merge by @arvidn in #7819
- bump ubuntu CI runner to 24.04 by @arvidn in #7823
- pkg-config file generation: resolve CMAKE_INSTALL_PREFIX at install time by @Piraty in #7822
- Test merge by @arvidn in #7834
- make message output for torrent_alert more concise by @arvidn in #7838
- implement i2p_pex, peer exchange support for i2p torrents by @arvidn in #7831
- move binding for tracker_alert::version to where it belongs by @arvidn in #7845
- update peer_info to hold a proper variant for i2p destination by @arvidn in #7841
- Peer log by @arvidn in #7842
- read_resume() hack by @arvidn in #7848
- make info_section immutable in torrent_info by @arvidn in #7847
- move file loading to load_torrent_file(), towards making it independent by @arvidn in #7849
- transition tests to use load_torrent_buffer() and load_torrent_file() by @arvidn in #7850
- fix load_torrent_*() to not set piece layers for files smaller or equ… by @arvidn in #7851
- round-trip torrent via session without relying on torrent_info storin… by @arvidn in #7853
- is_i2p_url() can take a string view, no need to copy the string by @arvidn in #7852
- Test merge by @arvidn in #7860
- move the code loading torrents by @arvidn in #7856
generate_torrent()by @arvidn in #7865- deprecate creator, comment and creation-date by @arvidn in #7864
- transition more tests to use
add_torrent_paramsby @arvidn in #7867 - deprecate storing piece layers in
torrent_infoby @arvidn in #7866 - deprecate torrent_info constructors that load torrents by @arvidn in #7868
- deprecate
make_magnet_uri()overloads by @arvidn in #7871 - deprecate keeping DHT nodes in
torrent_infoby @arvidn in #7872 - Test merge by @arvidn in #7922
- Test merge by @arvidn in #7967
- Some optimizations by @bolshoytoster in #7950
- Immutable
torrent_infoby @arvidn in #7933 - Test merge by @arvidn in #7979
- simplify resolve links by just using paths directly by @arvidn in #7980
- deprecated remap_files() by @arvidn in #7981
- Test merge by @arvidn in #7985
- more immutable
file_storageby @arvidn in #7983 - Fix arguments of dispatched functions cannot be actually moved by @glassez in #7903
- add load torrent api that no throw exceptions by @aldenml in #7992
- Test merge by @arvidn in #8001
- Test merge by @arvidn in #8033
- Test merge by @arvidn in #8089
- I2p reconnect by @arvidn in #8055
- Test merge by @arvidn in #8104
- Test merge by @arvidn in #8108
- fix test_transfer to build with mmap support disabled by @arvidn in #8124
- Test merge by @arvidn in #8123
- Disk fixes by @arvidn in #8125
- make the save path for part files configurable by @arvidn in #8119
- address cmake compatibility by @arvidn in #8131
- Test merge by @arvidn in #8133
- Fix webtorrent CMake & Appveyor builds by @jasminsehic in #8128
- improve print pieces in client_test by @arvidn in #8145
- Json by @arvidn in #8150
- Test merge by @arvidn in #8151
- fix potential overflow in sliding_average by @arvidn in #8152
- fixup printing piece by @arvidn in #8153
- fix some clang warnings by @arvidn in #8132
- suppress asan leak reports from openssl by @arvidn in #8161
- more debug logging in torrent.cpp and some defensive programming by @arvidn in #8162
- bump libdatachannel to 0.24.1 by @arvidn in #8090
- factor out back-pressure logic from disk_buffer_pool by @arvidn in #8166
- add root_certificate to add_torrent_params by @arvidn in #8165
- Fixup back pressure by @arvidn in #8169
- pread-disk-io by @arvidn in #7013
- Update documentation on building fuzzers by @ademuri in #8173
- attempt to address issue where the UDP socket and TCP sockets may be … by @arvidn in #8174
- fix torrent_info round-trip test by @arvidn in #8178
- add missing session settings to python type stubs by @arvidn in #8179
- remove the bottled feature from http_connection. It's always enabled. by @arvidn in #8177
- fix peer invariant check by @arvidn in #8183
- fix issue where v2 torrents could pass the same piece twice by @arvidn in #8182
- fix issue when saving resume data on a magnet link without metadata by @arvidn in #8181
- improve disk I/O stress test by @arvidn in #8184
- optimize disk_cache. only allocate v2 block hashes for v2 torrents by @arvidn in #8185
- V2 hash cursor by @arvidn in #8189
- improve disk_io_stress_test by @arvidn in #8192
- use flags instead of C bitfields in cached_piece_entry by @arvidn in #8191
- drop appveyor by @arvidn in #8190
- Pread 0 threads by @arvidn in #8195
- Optimize kick hasher by @arvidn in #8194
- Fixup piece_hash race by @arvidn in #8196
- fix up bitfield to be more MS compatible by @arvidn in #8199
- deprecate torrent_info::info() by @arvidn in #8201
- make sure LSD announcements are staggered, even when adding a lot of … by @arvidn in #8205
- Reject invalid tracker url (port to master branch) by @vafada in #8206
- Test merge by @arvidn in #8207
- Release workflow by @arvidn in #8208
- use string_view in string_begins_no_case by @arvidn in #8209
- expose the current upload- and download rate limits per torrent by @arvidn in #8210
- expose a new function to query renamed files in a torrent by @arvidn in #8212
- fix roundtrip of renamed_files by @arvidn in #8216
- C++ 17 updates by @arvidn in #8222
- make disk cache more independent from the disk job by @arvidn in #8224
- add unit tests of disk cache by @arvidn in #8225
- free disk buffers in bulk by @arvidn in #8226
- add debug range checks to aux::unique_ptr by @arvidn in #8228
- Test merge by @arvidn in #8234
- decrease disk cache overhead by @arvidn in #8227
- deduce block-per-piece rather than storing it, in cached_piece_entry by @arvidn in #8237
- make the cached_block_entry smaller by @arvidn in #8238
- add post_file_priorities() to query them asynchronously by @arvidn in #8242
- add post_file_status() as an asynchronous alternative to file_status() by @arvidn in #8244
- address clang/msvc warnings by @arvidn in #8241
- add feature to only validate the v2 hashes for hybrid torrents by @arvidn in #8217
- Retry hash job by @arvidn in #8245
- Test filesystems by @arvidn in #8246
- optimize torrent_handle::torrent_file() by @arvidn in #8247
- Fix crash when build with MSVC2026 by @glassez in #8250
- update test output to integrate better with github actions by @arvidn in #8251
- tweak filesystem test script by @arvidn in #8249
- Fix 'i2p not found' not breaking ABI by @gtumanyan in #8235
- fix issue where the flushing flag could be left set by flush_piece_impl by @arvidn in #8252
- fix race in flush_piece_impl() by @arvidn in #8253
- fix flush piece while hashing by @arvidn in #8248
- fix test_natpmp and build it on CI by @arvidn in #8256
- require at least boost-1.75.0 by @arvidn in #8258
- add cppcheck to CI by @arvidn in #8259
- run cppcheck on simulations. suppress false positives by @arvidn in #8262
- local_connection is deprecated, use outgoing_connection by @arvidn in #8267
- unify the simulate-slow features in the Jamfile by @arvidn in #8266
- fix issue when retrying blocked hash_jobs hung on a piece by @arvidn in #8269
- update clang-tidy by @arvidn in #8263
- build and test python bindings on CI unconditionally by @arvidn in #8273
- explicitly flush the error message in TORRENT_ASSERT_PRECOND by @arvidn in #8276
- Test merge2 by @arvidn in #8277
- add CLAUDE.md by @arvidn in #8278
- build against boost.json as header only. This makes it easier to chan… by @arvidn in #8279
- fix recent merge typo in torrent::force_tracker_request() by @arvidn in #8283
- new fuzzers by @arvidn in #8197
- document that support for BEP17 web seeds were removed by @arvidn in #8289
- Header only boost by @arvidn in #8291
- address python tests using deprecated functions by @arvidn in #8296
- fix support for multi-buffer writes in pread_storage by @arvidn in #8292
- address a data race in pread_disk_io by @arvidn in #8294
- Test merge by @arvidn in #8298
- fix flaky python test by @arvidn in #8295
- Clang tidy by @arvidn in #8301
- post peer_disconnected_alert even if the peer never completed the han… by @arvidn in #8302
- add clang-format configuration and a pre-commit rule for migration by @arvidn in #8303
- fix issue in filtered piece accounting in the piece_picker by @arvidn in #8304
- Use Boost.JSON as header-only via cmake by @Chocobo1 in #8280
- add feature to tick_interval setting to allow all work to run every m… by @arvidn in #8307
- update clang-tidy config by @arvidn in https://github.com/arvidn/libtorrent/pull/8311
- fix race in session_handle::wait_for_alert() by @arvidn in https://github.com/arvidn/libtorrent/pull/8312
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8315
- disable python's and pytest's faulthandler by @arvidn in https://github.com/arvidn/libtorrent/pull/8314
- make web seed connections fail earlier on invalid data by @arvidn in https://github.com/arvidn/libtorrent/pull/8308
- update claude instructions by @arvidn in https://github.com/arvidn/libtorrent/pull/8309
- Use header-only boost in Windows cmake workflow by @Chocobo1 in https://github.com/arvidn/libtorrent/pull/8310
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8329
- authenticate webtorrent tracker certificates by default by @arvidn in https://github.com/arvidn/libtorrent/pull/8330
- optimizations to avoid unnecessary calls to piece_size_for_req() by @arvidn in https://github.com/arvidn/libtorrent/pull/8335
- web seed fixes by @arvidn in https://github.com/arvidn/libtorrent/pull/8337
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8338
- fix clang warnings by @arvidn in https://github.com/arvidn/libtorrent/pull/8339
- add max_directory_depth limit to load_torrent_limits by @arvidn in https://github.com/arvidn/libtorrent/pull/8340
- script to measure fuzzer code coverage by @arvidn in https://github.com/arvidn/libtorrent/pull/8342
- Add torrent fuzzer by @arvidn in https://github.com/arvidn/libtorrent/pull/8343
- fuzzer for parse_piece_layers by @arvidn in https://github.com/arvidn/libtorrent/pull/8346
- improve sanitization of filenames, and symlinks in particular by @arvidn in https://github.com/arvidn/libtorrent/pull/8344
- pe_crypto_state fuzzer by @arvidn in https://github.com/arvidn/libtorrent/pull/8347
- fuzzer for identify_client by @arvidn in https://github.com/arvidn/libtorrent/pull/8348
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8351
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8360
- add another phase to flushing blocks from the disk cache by @arvidn in https://github.com/arvidn/libtorrent/pull/8359
- address data race in pread_disk_io by @arvidn in https://github.com/arvidn/libtorrent/pull/8361
- utp_stream fuzzer by @arvidn in https://github.com/arvidn/libtorrent/pull/8364
- fuzzer for local service discovery by @arvidn in https://github.com/arvidn/libtorrent/pull/8363
- add fuzzer for udp tracker by @arvidn in https://github.com/arvidn/libtorrent/pull/8362
- extend the UPnP fuzzer to actaually exercise the port mapping logic by @arvidn in https://github.com/arvidn/libtorrent/pull/8365
- add NAT-PMP fuzzer by @arvidn in https://github.com/arvidn/libtorrent/pull/8375
- fix connection_tester with allow-fast by @arvidn in https://github.com/arvidn/libtorrent/pull/8379
- add fuzzer for socks5 udp associate by @arvidn in https://github.com/arvidn/libtorrent/pull/8378
- Connection tester by @arvidn in https://github.com/arvidn/libtorrent/pull/8382
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8387
- add python binding alert.timestamp() by @milahu in https://github.com/arvidn/libtorrent/pull/8368
- update run_benchmark.py by @arvidn in https://github.com/arvidn/libtorrent/pull/8390
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8392
- add feature to connection_tester to generate resume data by @arvidn in https://github.com/arvidn/libtorrent/pull/8394
- Improve benchmark by @arvidn in https://github.com/arvidn/libtorrent/pull/8396
- fix generating v2 resume data in connection_tester by @arvidn in https://github.com/arvidn/libtorrent/pull/8397
- factor out shared code in portmap fuzzers by @arvidn in https://github.com/arvidn/libtorrent/pull/8400
- fix v2 piece hash generation in connection_tester by @arvidn in https://github.com/arvidn/libtorrent/pull/8401
- More fuzzers by @arvidn in https://github.com/arvidn/libtorrent/pull/8402
- optimize count_jobs() in disk_cache.cpp by @arvidn in https://github.com/arvidn/libtorrent/pull/8404
- add gen_corpus script by @arvidn in https://github.com/arvidn/libtorrent/pull/8405
- Complete docs by @arvidn in https://github.com/arvidn/libtorrent/pull/8403
- description of the documentation generation process by @arvidn in https://github.com/arvidn/libtorrent/pull/8406
- address flakiness of webtorrent test by @arvidn in https://github.com/arvidn/libtorrent/pull/8407
- claude fuzzers by @arvidn in https://github.com/arvidn/libtorrent/pull/8408
- move the comma outside of the METRIC macro by @arvidn in https://github.com/arvidn/libtorrent/pull/8411
- add build option to collect disk read latency statistics by @arvidn in https://github.com/arvidn/libtorrent/pull/8412
- fix connection_tester output by @arvidn in https://github.com/arvidn/libtorrent/pull/8416
- improve tools/run_benchmark.py by @arvidn in https://github.com/arvidn/libtorrent/pull/8417
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8421
- optimize flushing of disk cache in pread_disk_io by @arvidn in https://github.com/arvidn/libtorrent/pull/8422
- add documentation by @arvidn in https://github.com/arvidn/libtorrent/pull/8409
- Tighten HTTP tracker peer parsing by @M-Hassan-Raza in https://github.com/arvidn/libtorrent/pull/8423
- fix race on aborting disk jobs on shutdown by @arvidn in https://github.com/arvidn/libtorrent/pull/8424
- improve try_cache_flush() call by @arvidn in https://github.com/arvidn/libtorrent/pull/8425
- connection_tester: save merkle trees to separate file by @arvidn in https://github.com/arvidn/libtorrent/pull/8427
- Improve benchmark scripts by @arvidn in https://github.com/arvidn/libtorrent/pull/8429
- Mmap v2 block hashes by @arvidn in https://github.com/arvidn/libtorrent/pull/8426
- add missing file and extend CI to detect it by @arvidn in https://github.com/arvidn/libtorrent/pull/8433
- simplify disk_buffer_holder by @arvidn in https://github.com/arvidn/libtorrent/pull/8431
- optimize parsing v2 torrent files (file_tree) by @arvidn in https://github.com/arvidn/libtorrent/pull/8437
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8438
- fix test_resume.cpp when (old) deprecated functions are enabled by @arvidn in https://github.com/arvidn/libtorrent/pull/8439
- remove invalid assert in disk_cache by @arvidn in https://github.com/arvidn/libtorrent/pull/8440
- Benchmark load torrent by @arvidn in https://github.com/arvidn/libtorrent/pull/8443
- extend load_torrent benchmark with more cases by @arvidn in https://github.com/arvidn/libtorrent/pull/8444
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8445
- run tests in 32 bit mode on CI by @arvidn in https://github.com/arvidn/libtorrent/pull/8447
- simplify file_piece_range_inclusive() and file_piece_range_exclusive() by @arvidn in https://github.com/arvidn/libtorrent/pull/8453
- v2 block hashes can be computed concurrently by @arvidn in https://github.com/arvidn/libtorrent/pull/8449
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8457
- fix a concurrency bug in kick_hasher by @arvidn in https://github.com/arvidn/libtorrent/pull/8459
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8464
- update tests in test_checking.cpp to use the new API by @arvidn in https://github.com/arvidn/libtorrent/pull/8468
- fix async_hash bug in pread_disk_io by @arvidn in https://github.com/arvidn/libtorrent/pull/8469
- harden merkle_tree proof validation by @arvidn in https://github.com/arvidn/libtorrent/pull/8466
- Fix web seed Host header ports by @hussainarslan in https://github.com/arvidn/libtorrent/pull/8460
- use the new host_header functions in more places by @arvidn in https://github.com/arvidn/libtorrent/pull/8471
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8472
- Parameterize disk io by @arvidn in https://github.com/arvidn/libtorrent/pull/8470
- test magnet links where the info-hash is updated by @arvidn in https://github.com/arvidn/libtorrent/pull/8473
- use strong flag type in test_metadata_extension.cpp by @arvidn in https://github.com/arvidn/libtorrent/pull/8475
- fix data race in disk_cache::flush_storage() by @arvidn in https://github.com/arvidn/libtorrent/pull/8476
- fix issue counting disk I/O thread in pread_disk_io by @arvidn in https://github.com/arvidn/libtorrent/pull/8477
- improve run_http_suite() by @arvidn in https://github.com/arvidn/libtorrent/pull/8474
- fixup and simplify threads in add_fence_job() by @arvidn in https://github.com/arvidn/libtorrent/pull/8478
- simplify flush_storage() by not making it erase the piece by @arvidn in https://github.com/arvidn/libtorrent/pull/8479
- fix flaky test_flag by @arvidn in https://github.com/arvidn/libtorrent/pull/8480
- increase timeout for expensive (thread-sanitizer) test run by @arvidn in https://github.com/arvidn/libtorrent/pull/8482
- smoke test disk I/O on CI by @arvidn in https://github.com/arvidn/libtorrent/pull/8481
- Pread write fence by @arvidn in https://github.com/arvidn/libtorrent/pull/8467
- fix dead-lock in deferred clear_piece by @arvidn in https://github.com/arvidn/libtorrent/pull/8485
- Parameterize test error handling by @arvidn in https://github.com/arvidn/libtorrent/pull/8484
- Fix unaligned reads by @arvidn in https://github.com/arvidn/libtorrent/pull/8483
- enable pread diskio as the default disk I/O backend by @arvidn in https://github.com/arvidn/libtorrent/pull/8465
- cut 2.1 rc2 by @arvidn in https://github.com/arvidn/libtorrent/pull/8486
- Add Linux CA certificate probing in start_session() by @trim21 in https://github.com/arvidn/libtorrent/pull/8488
- fix race in updating blocked_disk_jobs counter, in disk_job_fence by @arvidn in https://github.com/arvidn/libtorrent/pull/8495
- improve some torrent_alert message strings by @arvidn in https://github.com/arvidn/libtorrent/pull/8506
- address false positive warning with -Wms-bitfield-padding by @arvidn in https://github.com/arvidn/libtorrent/pull/8509
- add fuzzer for SDP offer by @arvidn in https://github.com/arvidn/libtorrent/pull/8510
- fuzzers for parse RTC endpoint and RTC tracker offer by @arvidn in https://github.com/arvidn/libtorrent/pull/8514
- torrent_status::total by @arvidn in https://github.com/arvidn/libtorrent/pull/8524
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8525
- fix use-after-free in uTP failure socket shutdown path by @arvidn in https://github.com/arvidn/libtorrent/pull/8528
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8529
- fix TORRENT_DISK_LATENCY_STATS in cmake file and config.hpp by @arvidn in https://github.com/arvidn/libtorrent/pull/8535
- fix bug in tracker stop request for webRTC by @arvidn in https://github.com/arvidn/libtorrent/pull/8534
- fix clang-tidy warnings, and disable for dependencies by @arvidn in https://github.com/arvidn/libtorrent/pull/8533
- Release CI workflow by @arvidn in https://github.com/arvidn/libtorrent/pull/8536
- handle exception from libdatachannel sendBuffer() by @arvidn in https://github.com/arvidn/libtorrent/pull/8537
- fix edge case causing memory leak in rtc_stream_impl::write_data() by @arvidn in https://github.com/arvidn/libtorrent/pull/8539
- enable webtorrent by default by @arvidn in https://github.com/arvidn/libtorrent/pull/8532
- fix incorrect hint in mmap_storage::write that could cause corruption by @arvidn in https://github.com/arvidn/libtorrent/pull/8542
- upload tarballs for release candidates too by @arvidn in https://github.com/arvidn/libtorrent/pull/8543
- disk_write_mode setting by @arvidn in https://github.com/arvidn/libtorrent/pull/8546
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8547
- fixes related to force-reannounce and priority announce by @arvidn in https://github.com/arvidn/libtorrent/pull/8540
- fix CMake test_rtc.cpp by @arvidn in https://github.com/arvidn/libtorrent/pull/8545
- fix duplicate filenames in magnet links by @arvidn in https://github.com/arvidn/libtorrent/pull/8553
- fix blocking UDP socket in UPnP by @arvidn in https://github.com/arvidn/libtorrent/pull/8555
- improve the minimize script by @arvidn in https://github.com/arvidn/libtorrent/pull/8554
- backport: fix duplicate filenames in magnet links by @arvidn in https://github.com/arvidn/libtorrent/pull/8556
- fix web seed requests for single-file torrents in multi-file mode by @arvidn in https://github.com/arvidn/libtorrent/pull/8559
- fix web seed requests for single-file torrents in multi-file mode by @arvidn in https://github.com/arvidn/libtorrent/pull/8558
- persist BEP-21 upload_only on peer_list entry by @reardonia in https://github.com/arvidn/libtorrent/pull/8519
- fix integer overflow in download_queue_time() by @arvidn in https://github.com/arvidn/libtorrent/pull/8560
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8563
- add test coverage for webtorrent transfer by @arvidn in https://github.com/arvidn/libtorrent/pull/8561
- fix release workflow, to upload the binary by @arvidn in https://github.com/arvidn/libtorrent/pull/8551
- non-blocking UDP socket in LSD and NAT-PMP by @arvidn in https://github.com/arvidn/libtorrent/pull/8566
- Test merge by @arvidn in https://github.com/arvidn/libtorrent/pull/8569
- make sure the peer list is allocated by @arvidn in https://github.com/arvidn/libtorrent/pull/8568
New Contributors
- @neheb made their first contribution in #4757
- @markmdscott made their first contribution in #5996
- @Piraty made their first contribution in #7822
- @bolshoytoster made their first contribution in #7950
- @jasminsehic made their first contribution in #8128
- @ademuri made their first contribution in #8173
- @gtumanyan made their first contribution in #8235
- @milahu made their first contribution in https://github.com/arvidn/libtorrent/pull/8368
- @trim21 made their first contribution in https://github.com/arvidn/libtorrent/pull/8488
- @reardonia made their first contribution in https://github.com/arvidn/libtorrent/pull/8519
Full Changelog: v2.0.13...v2.1.0