Fix download resume within a single session
Download resume was effectively broken - when a transfer failed and was retried on another mirror, the partial data was always discarded and the download restarted from scratch. Several issues contributed to this:
Header callback breaks resumed transfers: For HTTP 206 Partial Content responses, Content-Length contains the remaining bytes, not the full file size.
Retry always discards partial data: On transfer failure, truncate_transfer_file() unconditionally truncated back to original_offset (0 for new files). Now, for connection errors (timeout, recv error, etc.) where partial data is likely valid, the file is kept so the next attempt can resume from where it left off. Server errors (bad HTTP status), checksum failures, and header callback interrupts still truncate as before.
File position not set on resume: When resuming a download, the file pointer was left at position 0 after fdopen. Data received from the server (starting at the resume offset) was written at position 0, corrupting the file.
xattr check disables resume for new files
resume_count incremented on non-resume attempts: The resume attempt counter was incremented on every prepare_next_transfer call, even for fresh downloads (offset 0). This meant resume was disabled before any actual resume could happen.
Related: https://github.com/rpm-software-management/librepo/issues/293 Signed-off-by: Marek Blaha mblaha@redhat.com
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802032778号
librepo
librepo - A library providing C and Python (libcURL like) API for downloading linux repository metadata and packages
Building
Build requires:
Fedora/Ubuntu name
or on a DNF-based distribution run:
Build from your checkout dir:
Build with debug flags:
Documentation
Build:
build/doc/c/html/index.htmlbuild/doc/python/index.htmlOnline python bindings documentation:
https://rpm-software-management.github.io/librepo/
Testing
All unit tests run from librepo checkout dir
Run both (C & Python) tests via makefile:
Run (from your checkout dir) - C unittests:
Available params:
-vRun tests verbosely (Show Librepo debug messages)-dRun download tests (This tests need internet connection)To check memoryleaks:
Add this line to your
~/.bashrcfileAnd then run:
Suppress known still_reachable memory:
Note: .valgrindrc file is present in checkoutdir, this file contains the settings:
--memcheck:leak-check=full --suppressions=./valgrind.suppRun (from your checkout dir) - Python 3 unittests:
Contribution
Here’s the most direct way to get your work merged into the project.
Fork the project
Clone down your fork
Implement your feature or bug fix and commit changes
If the change fixes a bug at Red Hat bugzilla, or if it is important to the end user, add the following block to the commit message:
For example::
For your convenience, you can also use git commit template by running the following command in the top-level directory of this project:
In a separate commit, add your name into the authors file as a reward for your generosity
Push the branch to your fork
Send a pull request for your branch
Links
Red Hat Bugzilla
Fedora spec file