* An FTP --update resumed a complete mirror with REST and spliced the old file into the new body FTP sent REST whenever the mirrored file merely existed, and on an --update pass every previously mirrored file exists, so a complete copy was treated as an interrupted download. The server resumed at its length and the mirror ended up part old body, part new tail, at exactly the remote size, so nothing downstream noticed. Resuming now follows the decision back_add() already makes for HTTP, which only marks a copy partial when the cache does not hold it, and r.size is seeded from the resume offset so a genuine resume is no longer reported "FTP file incomplete". Closes #798 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> * Format the two comment lines the earlier pass missed git-clang-format only sees the diff present when it runs; the comments were translated after it, so those lines never went through it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> * An FTP resume spliced a changed remote when there was no cache entry With no cache entry to tell a partial from a stale copy, back_add() took range_req_size from the file size and the transfer resumed with REST, so a remote that had changed since had its tail appended to the old head at exactly the remote length. FTP has no conditional retrieval, so the client has to decide. Resuming now needs SIZE to report a remote strictly longer than the local copy and MDTM to report it no newer than that copy. The mirror is stamped from MDTM as the HTTP path is stamped from Last-Modified, so later passes compare two server-clock times; a server that does not answer MDTM proves nothing and is re-fetched whole. Closes #823 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> * Clear r.lastmodified before an FTP attempt run_launch_ftp() already resets msg, statuscode and size for a retry; without lastmodified in that list a retry whose MDTM fails stamps the mirror with the previous attempt's date. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> * Require the copy's date to match MDTM, not merely to lead it "Remote no newer than the local copy" is one-sided, and it lets through exactly the mirrors #823 is about: nothing stamped an FTP file before this branch, so every existing one carries a client-clock mtime ahead of any MDTM, as does a copy restored from an archive or moved without preserving times. The first pass over such a tree resumed and spliced. The date now has to match, which is what the HTTP path gets from the server via If-Unmodified-Since. A partial written here is stamped from the same MDTM, so the resume it exists for still compares equal. Pass 6 plants a stale copy dated by the local clock over a larger changed remote; it splices under the old comparison. Pass 5 now dates its copy as the remote so the missing MDTM is the only thing refusing it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> * tests: fix TESTS list order and backslash after the union merge Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> --------- Signed-off-by: Xavier Roche <roche@httrack.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
HTTrack Website Copier - Development Repository
About
Copy websites to your computer (Offline browser)
HTTrack is an offline browser utility, allowing you to download a World Wide website from the Internet to a local directory, building recursively all directories, getting html, images, and other files from the server to your computer.
HTTrack arranges the original site's relative link-structure. Simply open a page of the "mirrored" website in your browser, and you can browse the site from link to link, as if you were viewing it online.
HTTrack can also update an existing mirrored site, and resume interrupted downloads. HTTrack is fully configurable, and has an integrated help system.
WinHTTrack is the Windows 2000/XP/Vista/Seven release of HTTrack, and WebHTTrack the Linux/Unix/BSD release.
Website
Main Website: http://www.httrack.com/
Compile trunk release
A git checkout ships only the autotools sources, so ./bootstrap (which runs
autoreconf) regenerates configure first; this needs autoconf, automake and
libtool. Released tarballs already include configure, so building from a
tarball skips ./bootstrap.
git clone https://github.com/xroche/httrack.git --recurse-submodules
cd httrack
./bootstrap
./configure --prefix=$HOME/usr && make -j8 && make install
Or use the one-shot wrapper (bootstrap + configure + make), which forwards its
arguments to configure:
./build.sh --prefix=$HOME/usr