Compare commits
136 Commits
3.49.14
...
fix-915-st
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e559a608b9 | ||
|
|
f3c3bf9aec | ||
|
|
2d041866ed | ||
|
|
36de4ca77f | ||
|
|
b673de16ac | ||
|
|
62a5ee7f2e | ||
|
|
cbcafb8e34 | ||
|
|
0b97f9632d | ||
|
|
82fe2b5008 | ||
|
|
819e609dbe | ||
|
|
5f52c3d942 | ||
|
|
d07839201c | ||
|
|
218403ed81 | ||
|
|
592f3dd154 | ||
|
|
6cc4f704f1 | ||
|
|
620418a9c6 | ||
|
|
0ed5c6b4ea | ||
|
|
150ddde375 | ||
|
|
f3fa3a8b98 | ||
|
|
311b99afd4 | ||
|
|
ef81f5b488 | ||
|
|
22c506944d | ||
|
|
b127323a68 | ||
|
|
fac60dff4a | ||
|
|
264478c846 | ||
|
|
8f383f4caf | ||
|
|
46294200ed | ||
|
|
3414596efe | ||
|
|
3c96b0f209 | ||
|
|
f1ace40d47 | ||
|
|
6b9740dbc2 | ||
|
|
3e480bf990 | ||
|
|
401323ff7e | ||
|
|
a21f84ee37 | ||
|
|
8d51e11c6e | ||
|
|
51b0142599 | ||
|
|
dc28c80ad8 | ||
|
|
21de744be6 | ||
|
|
3e4b131456 | ||
|
|
3dac180aac | ||
|
|
21d9289945 | ||
|
|
c4879cd25c | ||
|
|
cd3051ca1a | ||
|
|
16bbf2ad27 | ||
|
|
ed0906a4d4 | ||
|
|
b3cba2ba5a | ||
|
|
90b98e740e | ||
|
|
836c630f34 | ||
|
|
f0cd4b5089 | ||
|
|
22e9520636 | ||
|
|
a0a2bee019 | ||
|
|
457682b5df | ||
|
|
91d12d4040 | ||
|
|
5c0918f328 | ||
|
|
be9d9927a6 | ||
|
|
97d7da5f19 | ||
|
|
15c66557b9 | ||
|
|
db4d429468 | ||
|
|
1b53b43176 | ||
|
|
2e67587ec7 | ||
|
|
45557b3dd6 | ||
|
|
63af0dc4a2 | ||
|
|
e5c0918d5d | ||
|
|
55dbca8beb | ||
|
|
8c5b208fac | ||
|
|
b7cff7aeee | ||
|
|
bc8b6cfa00 | ||
|
|
260cef25fe | ||
|
|
bd60dac914 | ||
|
|
0984aa2530 | ||
|
|
bc6c53598c | ||
|
|
809d5b6ffc | ||
|
|
536d7515ed | ||
|
|
374087a81c | ||
|
|
83079b788d | ||
|
|
1fa3cb4e74 | ||
|
|
bab4b70a71 | ||
|
|
dcdcc8745c | ||
|
|
c65d1c43c7 | ||
|
|
95f8ebaa44 | ||
|
|
3a096c589a | ||
|
|
1a4a5082b7 | ||
|
|
4fd6767a8f | ||
|
|
56389103bf | ||
|
|
a4db58f7b7 | ||
|
|
1f9728d816 | ||
|
|
99bd9bb674 | ||
|
|
29dfd2df59 | ||
|
|
55765815f5 | ||
|
|
869b8479e9 | ||
|
|
9fe47c3986 | ||
|
|
37fa549ac5 | ||
|
|
de8c0eebfc | ||
|
|
9e29c1e159 | ||
|
|
9571fb9a6a | ||
|
|
3e8595c46f | ||
|
|
0774d47d2f | ||
|
|
7e2209d4cc | ||
|
|
9484b32ecd | ||
|
|
1d647bfecd | ||
|
|
b2dc012263 | ||
|
|
aa1131982b | ||
|
|
f72e7ebe96 | ||
|
|
3b53bf85f2 | ||
|
|
ce7dcfa9de | ||
|
|
069573edc3 | ||
|
|
a75f437df9 | ||
|
|
783f6ee1f5 | ||
|
|
913caf68be | ||
|
|
59660102d6 | ||
|
|
e96399910b | ||
|
|
52d0ab2356 | ||
|
|
ca533abefd | ||
|
|
dc6819b7b7 | ||
|
|
3247e5b183 | ||
|
|
bef7120423 | ||
|
|
7cf54af485 | ||
|
|
c32a47110e | ||
|
|
1027a9f392 | ||
|
|
d0a1573a04 | ||
|
|
4362ac34cb | ||
|
|
6579436607 | ||
|
|
cb98b1b197 | ||
|
|
da8fbfff49 | ||
|
|
a7fbd3f739 | ||
|
|
c4b803eb33 | ||
|
|
408316db99 | ||
|
|
450db10d92 | ||
|
|
dfdf10e7fd | ||
|
|
7fe073e9fb | ||
|
|
f47359247d | ||
|
|
dfc72fdbc6 | ||
|
|
8ed607b078 | ||
|
|
0708bf9f98 | ||
|
|
301d7717be | ||
|
|
e13f0f10c9 |
3
.gitattributes
vendored
@@ -6,3 +6,6 @@
|
||||
# bash die on $'\r' on every line of them.
|
||||
*.test text eol=lf
|
||||
*.sh text eol=lf
|
||||
|
||||
# Scoped to this file so a union can never touch build logic.
|
||||
tests/tests-list.mk merge=union
|
||||
|
||||
12
.github/dependabot.yml
vendored
@@ -6,3 +6,15 @@ updates:
|
||||
directory: /src
|
||||
schedule:
|
||||
interval: weekly
|
||||
|
||||
# Keep the workflow action pins current (they only rot manually otherwise).
|
||||
- package-ecosystem: github-actions
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
|
||||
# src/coucal is a hard build dependency, and nothing else notices when it moves.
|
||||
- package-ecosystem: gitsubmodule
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
|
||||
215
.github/workflows/ci.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
env:
|
||||
CC: ${{ matrix.cc }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -46,10 +46,32 @@ jobs:
|
||||
- name: Configure
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Regenerate from configure.ac/Makefile.am to validate them; the
|
||||
# committed generated files already let a plain checkout build.
|
||||
# Regenerate: configure and the Makefile.in's are not tracked.
|
||||
autoreconf -fi
|
||||
# Disabling zlib must fail here rather than at link with a pile of
|
||||
# undefined minizip references (#735). Both spellings, so a rewrite
|
||||
# cannot keep one and lose the other. Probed out-of-tree to leave
|
||||
# nothing behind.
|
||||
nozlib="$RUNNER_TEMP/nozlib"
|
||||
for arg in --without-zlib --with-zlib=no; do
|
||||
rm -rf "$nozlib" && mkdir -p "$nozlib"
|
||||
if (cd "$nozlib" && "$GITHUB_WORKSPACE/configure" "$arg" >out.log 2>&1); then
|
||||
echo "::error::configure $arg succeeded; it must be rejected"
|
||||
exit 1
|
||||
fi
|
||||
# ... and for the stated reason, not an unrelated configure failure.
|
||||
grep -q "zlib cannot be disabled" "$nozlib/out.log" \
|
||||
|| { cat "$nozlib/out.log"; exit 1; }
|
||||
done
|
||||
./configure
|
||||
# Same dead end from the compile side. The bare compile is the
|
||||
# control: without it a broken probe would pass vacuously.
|
||||
hdr='#include "htsglobal.h"'
|
||||
echo "$hdr" | $CC -I. -Isrc -fsyntax-only -xc -
|
||||
if echo "$hdr" | $CC -DHTS_USEZLIB=0 -I. -Isrc -fsyntax-only -xc - 2>/dev/null; then
|
||||
echo "::error::-DHTS_USEZLIB=0 compiled; htsglobal.h must reject it"
|
||||
exit 1
|
||||
fi
|
||||
# a missing decoder would silently drop the coding from Accept-Encoding
|
||||
grep -q "define HTS_USEBROTLI 1" config.h
|
||||
grep -q "define HTS_USEZSTD 1" config.h
|
||||
@@ -57,7 +79,10 @@ jobs:
|
||||
- name: Build
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
# A backstop only: tests/test-timeout.sh bounds each test, and a healthy run
|
||||
# is a minute here, two on macOS. Without it a stall ran to the job's 6h default.
|
||||
- name: Test
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
make check -j"$jobs"
|
||||
@@ -75,7 +100,7 @@ jobs:
|
||||
name: build (no python3, Debian buildd)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -97,6 +122,7 @@ jobs:
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
- name: Test without python3
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Hide every python3* so `command -v python3` fails like it does in the
|
||||
@@ -117,9 +143,9 @@ jobs:
|
||||
# so point configure at it; everything else is in the SDK or default paths.
|
||||
macos:
|
||||
name: build (macOS arm64, clang)
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -151,6 +177,7 @@ jobs:
|
||||
sudo ifconfig lo0 alias 127.0.0.3 up
|
||||
|
||||
- name: Test
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
jobs=$(( $(sysctl -n hw.ncpu) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
make check -j"$jobs"
|
||||
@@ -164,9 +191,9 @@ jobs:
|
||||
# temp prefix, then check webhttrack brings up htsserver and serves the UI.
|
||||
webhttrack-macos:
|
||||
name: webhttrack smoke (macOS arm64)
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -190,6 +217,95 @@ jobs:
|
||||
- name: Smoke-test webhttrack
|
||||
run: bash tests/webhttrack-smoke.sh "$RUNNER_TEMP/inst"
|
||||
|
||||
# Same smoke on the platform that ships webhttrack as a package: the install layout
|
||||
# it asserts (a relative data symlink, #885) is what Debian consumes, and the macOS
|
||||
# job alone left that untested on Linux.
|
||||
webhttrack-linux:
|
||||
name: webhttrack smoke (Linux x86-64)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Build and install into a temp prefix
|
||||
run: |
|
||||
set -euo pipefail
|
||||
./bootstrap
|
||||
./configure --prefix="$RUNNER_TEMP/inst"
|
||||
make -j"$(nproc)"
|
||||
make install
|
||||
|
||||
- name: Smoke-test webhttrack
|
||||
run: bash tests/webhttrack-smoke.sh "$RUNNER_TEMP/inst"
|
||||
|
||||
# The macOS app bundle (#886): assemble it, then prove it still works after being
|
||||
# moved, which is the only thing a .app has to survive that a prefix install does not.
|
||||
macos-app:
|
||||
name: macOS app bundle (arm64)
|
||||
runs-on: macos-15
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
brew install autoconf automake libtool autoconf-archive brotli zstd
|
||||
|
||||
# --disable-shared keeps libhttrack inside the binaries, so the bundle carries no
|
||||
# absolute dylib path back to the staging prefix.
|
||||
- name: Build and install into a temp prefix
|
||||
run: |
|
||||
set -euo pipefail
|
||||
ssl="$(brew --prefix openssl@3)"
|
||||
brewp="$(brew --prefix)"
|
||||
./bootstrap
|
||||
./configure CPPFLAGS="-I${ssl}/include -I${brewp}/include" \
|
||||
LDFLAGS="-L${ssl}/lib -L${brewp}/lib" \
|
||||
--prefix="$RUNNER_TEMP/inst" --disable-shared
|
||||
make -j"$(sysctl -n hw.ncpu)"
|
||||
make install
|
||||
|
||||
- name: Assemble HTTrack.app
|
||||
run: |
|
||||
set -euo pipefail
|
||||
make macos-app APP_FLAGS="--prefix $RUNNER_TEMP/inst --out $RUNNER_TEMP"
|
||||
plutil -lint "$RUNNER_TEMP/HTTrack.app/Contents/Info.plist"
|
||||
|
||||
- name: Run it through the bundle stub
|
||||
run: |
|
||||
set -euo pipefail
|
||||
app="$RUNNER_TEMP/HTTrack.app"
|
||||
bash tests/webhttrack-smoke.sh "$app/Contents/Resources" "$app/Contents/MacOS/HTTrack"
|
||||
|
||||
- name: Run it again after moving it
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mkdir -p "$RUNNER_TEMP/moved"
|
||||
mv "$RUNNER_TEMP/HTTrack.app" "$RUNNER_TEMP/moved/"
|
||||
rm -rf "$RUNNER_TEMP/inst"
|
||||
app="$RUNNER_TEMP/moved/HTTrack.app"
|
||||
bash tests/webhttrack-smoke.sh "$app/Contents/Resources" "$app/Contents/MacOS/HTTrack"
|
||||
|
||||
# No Developer ID here, so Gatekeeper cannot be exercised; an ad-hoc signature
|
||||
# still proves the bundle is well formed enough to sign.
|
||||
- name: Check the bundle is signable
|
||||
run: |
|
||||
set -euo pipefail
|
||||
app="$RUNNER_TEMP/moved/HTTrack.app"
|
||||
codesign -s - --force --deep "$app"
|
||||
codesign --verify --strict --verbose=2 "$app"
|
||||
|
||||
# Portability/hardening: 32-bit (i386) build on the x86-64 runner via multilib
|
||||
# -- no extra hardware. Exercises the 32-bit size_t/pointer ABI, where size
|
||||
# and bounds math can truncate or wrap in ways 64-bit never reveals (the axis
|
||||
@@ -199,7 +315,7 @@ jobs:
|
||||
name: build (linux i386, gcc -m32)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -223,6 +339,7 @@ jobs:
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
- name: Test
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
make check -j"$jobs"
|
||||
@@ -242,7 +359,7 @@ jobs:
|
||||
name: sanitize (ASan+UBSan, gcc)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -280,6 +397,7 @@ jobs:
|
||||
env:
|
||||
ASAN_OPTIONS: detect_leaks=0:abort_on_error=1:halt_on_error=1:strict_string_checks=1:malloc_fill_byte=202:max_malloc_fill_size=2147483647:free_fill_byte=203:max_free_fill_size=2147483647
|
||||
UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
make check -j"$jobs"
|
||||
@@ -296,7 +414,7 @@ jobs:
|
||||
name: msan (MemorySanitizer, clang)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -323,6 +441,7 @@ jobs:
|
||||
- name: Test (offline self-tests under MSan)
|
||||
env:
|
||||
MSAN_OPTIONS: abort_on_error=1:halt_on_error=1
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# 01_engine-* only; zlib-dependent self-tests are named 01_zlib-* and
|
||||
@@ -344,7 +463,7 @@ jobs:
|
||||
name: fuzz (libFuzzer corpus replay, clang)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -383,7 +502,7 @@ jobs:
|
||||
name: build (no openssl, --disable-https)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -404,6 +523,7 @@ jobs:
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
- name: Test
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
make check -j"$jobs"
|
||||
@@ -412,6 +532,36 @@ jobs:
|
||||
if: failure()
|
||||
run: cat tests/test-suite.log 2>/dev/null || true
|
||||
|
||||
# OpenSSL 4.0 removes the API 3.x deprecated. Building with that set hidden
|
||||
# keeps the engine ready for it: a deprecated call fails here rather than the
|
||||
# day a distro moves. Compile-only, since the headers are what is under test.
|
||||
openssl-no-deprecated:
|
||||
name: build (OpenSSL, no deprecated API)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Configure (deprecated OpenSSL API hidden)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
autoreconf -fi
|
||||
./configure CPPFLAGS=-DOPENSSL_NO_DEPRECATED
|
||||
# A build with https off would pass this job vacuously.
|
||||
grep -q "define HTS_USEOPENSSL 1" config.h
|
||||
|
||||
- name: Build
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
# Validate the Debian packaging via the same script maintainers release with.
|
||||
# One amd64/gcc run is enough: packaging (control/rules/manifest/lintian/quilt
|
||||
# source build) is arch- and compiler-independent, and the build matrix above
|
||||
@@ -437,7 +587,7 @@ jobs:
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
|
||||
debhelper devscripts lintian fakeroot
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -468,7 +618,7 @@ jobs:
|
||||
name: distcheck (release tarball)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
@@ -493,7 +643,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request'
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -532,12 +682,13 @@ jobs:
|
||||
man/makeman.sh
|
||||
src/htsbasiccharsets.sh
|
||||
src/htsentities.sh
|
||||
src/webhttrack
|
||||
src/webhttrack.in
|
||||
tests/*.sh
|
||||
tests/*.test
|
||||
tools/macos-app.sh
|
||||
tools/mkdeb.sh
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
|
||||
- name: Install linters
|
||||
run: |
|
||||
@@ -572,7 +723,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request'
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -596,7 +747,12 @@ jobs:
|
||||
set -euo pipefail
|
||||
git fetch --no-tags origin \
|
||||
"+refs/heads/${{ github.base_ref }}:refs/remotes/origin/${{ github.base_ref }}"
|
||||
base="origin/${{ github.base_ref }}"
|
||||
# Merge base, not the branch tip: master moves during a run, and a
|
||||
# tip-relative diff blames its new C on this PR.
|
||||
if ! base="$(git merge-base "origin/${{ github.base_ref }}" HEAD)"; then
|
||||
echo "::error::no merge base with origin/${{ github.base_ref }}; cannot scope the check."
|
||||
exit 1
|
||||
fi
|
||||
set +e
|
||||
diff="$(git clang-format --binary clang-format-19 --style=file \
|
||||
--diff --extensions c,h "$base")"
|
||||
@@ -619,12 +775,27 @@ jobs:
|
||||
exit 1 ;;
|
||||
esac
|
||||
|
||||
docs:
|
||||
name: documentation (chrome in sync, links resolve)
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
|
||||
# The pages carry their navigation as real markup, because they are read from
|
||||
# disk as often as over http and file:// has no includes. Regenerating has to
|
||||
# be a no-op, or a page has drifted from tools/doc-chrome.py.
|
||||
- name: Shared chrome is in sync
|
||||
run: python3 tools/doc-chrome.py --check
|
||||
|
||||
- name: Relative links and anchors resolve
|
||||
run: python3 tools/doc-links.py html
|
||||
|
||||
man-page-sync:
|
||||
name: man page / html in sync
|
||||
if: github.event_name == 'pull_request'
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -638,6 +809,8 @@ jobs:
|
||||
git fetch --no-tags origin \
|
||||
"+refs/heads/${{ github.base_ref }}:refs/remotes/origin/${{ github.base_ref }}"
|
||||
base="origin/${{ github.base_ref }}"
|
||||
# Three dots: merge-base scoped, so commits landing on master mid-run
|
||||
# are not counted as this PR's.
|
||||
changed="$(git diff --name-only "$base"...HEAD)"
|
||||
has() { printf '%s\n' "$changed" | grep -qx "$1"; }
|
||||
if has man/httrack.1 && ! has html/httrack.man.html; then
|
||||
|
||||
2
.github/workflows/codeql.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
# Upload findings to the repo's code-scanning dashboard.
|
||||
security-events: write
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
|
||||
72
.github/workflows/screenshots.yml
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
# Documentation screenshots: drive the WebHTTrack UI and capture every screen.
|
||||
# Manual, and deliberately not part of the build gate -- run it after adding or
|
||||
# changing a UI page, and the artifact is the new set of shots.
|
||||
name: screenshots
|
||||
|
||||
on:
|
||||
# A push trigger as well as the button: workflow_dispatch is only offered for
|
||||
# workflows that already exist on the default branch.
|
||||
push:
|
||||
paths:
|
||||
- '.github/workflows/screenshots.yml'
|
||||
- 'tools/screenshot-walk.py'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
lang:
|
||||
description: 'lang.indexes number to render the UI in (1 = English)'
|
||||
default: '1'
|
||||
scale:
|
||||
description: 'device pixel ratio'
|
||||
default: '2'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
capture:
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 20
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
set -euo pipefail
|
||||
autoreconf -fi
|
||||
./configure
|
||||
make -j"$(nproc)" -C src htsserver
|
||||
|
||||
- name: Install the browser
|
||||
run: |
|
||||
set -euo pipefail
|
||||
pip install --quiet playwright
|
||||
playwright install --with-deps chromium
|
||||
|
||||
- name: Capture
|
||||
env:
|
||||
LANGN: ${{ inputs.lang || '1' }}
|
||||
SCALE: ${{ inputs.scale || '2' }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# --root is the dist root; the source tree already holds every piece
|
||||
# htsserver reads, so this needs no install.
|
||||
python3 tools/screenshot-walk.py --htsserver src/htsserver --root . \
|
||||
--lang "$LANGN" --scale "$SCALE" --out shots
|
||||
|
||||
- name: Upload the screens
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: screenshots
|
||||
path: shots
|
||||
if-no-files-found: error
|
||||
125
.github/workflows/windows-build.yml
vendored
@@ -23,8 +23,13 @@ jobs:
|
||||
matrix:
|
||||
platform: [x64, Win32]
|
||||
configuration: [Release]
|
||||
# Redirect vcpkg's default `files` binary cache into the workspace so
|
||||
# actions/cache can persist it. vcpkg builds openssl/brotli/zlib/zstd from
|
||||
# source otherwise, several minutes every run.
|
||||
env:
|
||||
VCPKG_DEFAULT_BINARY_CACHE: ${{ github.workspace }}\vcpkg_cache
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive # coucal lives in src/coucal
|
||||
|
||||
@@ -44,6 +49,24 @@ jobs:
|
||||
shell: pwsh
|
||||
run: vcpkg integrate install
|
||||
|
||||
# vcpkg errors if VCPKG_DEFAULT_BINARY_CACHE points at a missing dir, and
|
||||
# actions/cache does not create it on a miss.
|
||||
- name: Create the vcpkg binary cache directory
|
||||
shell: pwsh
|
||||
run: New-Item -ItemType Directory -Force -Path $env:VCPKG_DEFAULT_BINARY_CACHE | Out-Null
|
||||
|
||||
# x-gha is gone (vcpkg-tool #1662 dropped it after GitHub changed the cache
|
||||
# API), so cache the binary archives directly. Keyed on the manifest, which
|
||||
# carries the builtin-baseline, so a Dependabot bump busts it; restore-keys
|
||||
# still seeds the unchanged ports' archives, so only the bumped one rebuilds.
|
||||
- name: Cache vcpkg binary archives
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: ${{ github.workspace }}\vcpkg_cache
|
||||
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}
|
||||
restore-keys: |
|
||||
vcpkg-${{ matrix.platform }}-
|
||||
|
||||
# The runner image's vcpkg checkout is pinned to some commit; our manifest's
|
||||
# builtin-baseline is usually newer, so `git show <baseline>:versions/...`
|
||||
# fails until that commit is local. Fetch exactly the pinned baseline (read
|
||||
@@ -166,25 +189,55 @@ jobs:
|
||||
# A wedged crawl must not eat the job's timeout budget. timeout(1)'s
|
||||
# signals can't reap a native httrack.exe (MSYS signals don't reach it),
|
||||
# so a hang orphaned processes that starved the runner; run_with_timeout
|
||||
# TerminateProcess-es the whole tree. 600s clears the slowest multi-pass
|
||||
# crawl (a few passes at --max-time=120 each).
|
||||
# TerminateProcess-es the whole tree. 600s is unchanged: it clears the
|
||||
# 540s a three-pass crawl may legitimately take under local-crawl.sh's
|
||||
# own watchdogs, against a slowest healthy test here of 39s.
|
||||
. ./testlib.sh
|
||||
per_test=600
|
||||
|
||||
pass=0 fail=0 skip=0 failed="" skipped=""
|
||||
for t in 00_runnable.test 01_engine-*.test 01_zlib-*.test \
|
||||
*_local-*.test 13_crawl_proxy_https.test 58_watchdog.test \
|
||||
60_crawl-log-salvage.test; do
|
||||
# The whole suite must give up before the step timeout above. A cancelled
|
||||
# step keeps neither its log nor the artifacts the later if:always()
|
||||
# steps would upload, so an overrun that ends in a cancel tells us
|
||||
# nothing; failing on our own terms keeps both. Healthy runs take 8-9
|
||||
# min. The check sits between tests, so the step can still reach 25 min
|
||||
# plus one per-test budget, and that worst case stays inside the 45.
|
||||
suite_deadline=1500
|
||||
started=$SECONDS
|
||||
|
||||
# Survives into the artifact even if the tail of the step log does not.
|
||||
progress=suite-progress.log
|
||||
: >"$progress"
|
||||
|
||||
pass=0 fail=0 skip=0 failed="" skipped="" deadline=0
|
||||
# Globbed, not enumerated: a new NNN_engine-*.test or NNN_local-*.test
|
||||
# is picked up automatically instead of silently getting zero coverage.
|
||||
for t in 00_runnable.test *_engine-*.test *_zlib-*.test \
|
||||
*_local-*.test *_watchdog*.test *_crawl_proxy_https.test \
|
||||
*_crawl-log-salvage.test; do
|
||||
elapsed=$((SECONDS - started))
|
||||
if [ "$elapsed" -ge "$suite_deadline" ]; then
|
||||
echo "::error::suite deadline: ${elapsed}s elapsed, stopping before $t"
|
||||
echo "DEADLINE before $t after ${elapsed}s" >>"$progress"
|
||||
# Per-test start times, so the slow ones are named rather than guessed.
|
||||
sed 's/^/ /' "$progress"
|
||||
deadline=1
|
||||
break
|
||||
fi
|
||||
echo "RUN $t at ${elapsed}s" >>"$progress"
|
||||
rc=0
|
||||
run_with_timeout 600 bash "$t" >"$t.log" 2>&1 || rc=$?
|
||||
# Same guard "make check" uses on POSIX, so a wedge is diagnosed the
|
||||
# same way on every platform. It dumps before it kills, which a bare
|
||||
# run_with_timeout cannot: by the time that returns, the tree whose
|
||||
# stack we wanted is already gone.
|
||||
HTTRACK_TEST_TIMEOUT=$per_test bash ./test-timeout.sh "$t" >"$t.log" 2>&1 || rc=$?
|
||||
case "$rc" in
|
||||
0) pass=$((pass + 1)); echo "PASS $t" ;;
|
||||
77) skip=$((skip + 1)) skipped="$skipped $t"; echo "SKIP $t" ;;
|
||||
124)
|
||||
fail=$((fail + 1)) failed="$failed $t"
|
||||
# test-timeout.sh has already written the process list, the stacks
|
||||
# and the killed crawl's own logs into $t.log.
|
||||
echo "FAIL $t (timed out, tree killed)"
|
||||
# Re-running a wedge traced would just hang again: salvage the
|
||||
# killed crawl's own logs into the artifact instead.
|
||||
dump_crawl_logs >>"$t.log"
|
||||
tail -n 25 "$t.log" | sed 's/^/ /'
|
||||
;;
|
||||
*)
|
||||
@@ -192,25 +245,63 @@ jobs:
|
||||
echo "FAIL $t (exit $rc)"
|
||||
# These assert with `test "$(...)" == "..." || exit 1`, which
|
||||
# says nothing at all on failure. Re-run traced, still bounded.
|
||||
run_with_timeout 600 bash -x "$t" >>"$t.log" 2>&1 || true
|
||||
run_with_timeout "$per_test" bash -x "$t" >>"$t.log" 2>&1 || true
|
||||
tail -n 25 "$t.log" | sed 's/^/ /'
|
||||
;;
|
||||
esac
|
||||
echo "$rc $t" >>"$progress"
|
||||
# An orphaned native httrack.exe spins and starves the runner, which
|
||||
# is how this job dies with "lost communication" rather than a plain
|
||||
# timeout. Clear them between tests and name whoever leaked them.
|
||||
reap_leftover_processes "$t" | tee -a "$progress"
|
||||
done
|
||||
echo "ran=$((pass + fail + skip)) pass=$pass fail=$fail skip=$skip" |
|
||||
tee -a "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
# Every gate here exits 77, so an all-skipped suite would report green having
|
||||
# tested nothing: pin the skips, and floor the passes in case the glob empties.
|
||||
# footer-overflow skips on Windows (needs a path past MAX_PATH); crange pending #581.
|
||||
expected_skips=" 01_engine-footer-overflow.test 48_local-crange-memresume.test 71_local-crange-repaircache.test"
|
||||
# One name per line, so two branches each appending one don't collide on the
|
||||
# same line; compared as a sorted set below, so glob discovery order can't
|
||||
# cause a false mismatch either.
|
||||
# footer-overflow and purge-longpath skip on Windows (need a path past MAX_PATH);
|
||||
# crange pending #581;
|
||||
# webdav-default, webdav-mime and webdav-overflow need a reapable background listener, which MSYS cannot give them;
|
||||
# badmtime needs a filesystem that stores an mtime past gmtime's range;
|
||||
# single-file ends on a GUI half needing htsserver, which this job does not build;
|
||||
# update-304-leak needs a LeakSanitizer build, which MSVC has no equivalent of;
|
||||
# crash-symbolize and backtrace-empty need backtrace(), which Windows has no
|
||||
# equivalent of;
|
||||
# string-oom drives a helper binary that only the automake build produces.
|
||||
expected_skips="01_engine-footer-overflow.test
|
||||
100_local-purge-longpath.test
|
||||
114_local-update-304-leak.test
|
||||
120_local-proxytrack-webdav-default.test
|
||||
143_engine-backtrace-empty.test
|
||||
147_local-proxytrack-webdav-overflow.test
|
||||
152_engine-string-oom.test
|
||||
48_local-crange-memresume.test
|
||||
71_local-crange-repaircache.test
|
||||
79_local-proxytrack-webdav-mime.test
|
||||
80_engine-crash-symbolize.test
|
||||
88_local-proxytrack-badmtime.test
|
||||
94_local-single-file.test"
|
||||
# First, or the deadline reads as an unexplained shortfall in the gates below.
|
||||
[ "$deadline" -eq 0 ] || { echo "::error::suite did not finish within ${suite_deadline}s"; exit 1; }
|
||||
[ "$pass" -ge 90 ] || { echo "::error::only $pass tests passed ($skip skipped)"; exit 1; }
|
||||
[ "$skipped" = "$expected_skips" ] || { echo "::error::unexpected skips:$skipped"; exit 1; }
|
||||
# Word-split on whitespace (space-joined $skipped, newline-joined
|
||||
# expected_skips both work) and sort, so the compare is a set, not a string.
|
||||
got=$(printf '%s\n' $skipped | sort)
|
||||
want=$(printf '%s\n' $expected_skips | sort)
|
||||
if [ "$got" != "$want" ]; then
|
||||
echo "::error::skip set changed from expected; - missing, + newly skipped"
|
||||
diff -u <(echo "$want") <(echo "$got") | tail -n +3 | sed 's/^/ /'
|
||||
exit 1
|
||||
fi
|
||||
[ "$fail" -eq 0 ] || { echo "::error::failing:$failed"; exit 1; }
|
||||
|
||||
- name: Upload the test logs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: engine-tests-${{ matrix.platform }}-${{ matrix.configuration }}
|
||||
path: tests/*.log
|
||||
@@ -218,7 +309,7 @@ jobs:
|
||||
|
||||
- name: Upload MSBuild logs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: msbuild-${{ matrix.platform }}-${{ matrix.configuration }}
|
||||
path: msbuild-*.log
|
||||
|
||||
2
.gitignore
vendored
@@ -24,6 +24,8 @@ Makefile.in
|
||||
/config.log
|
||||
/config.status
|
||||
/stamp-h1
|
||||
# src/webhttrack.in is the source; an in-tree build generates this one (#887).
|
||||
/src/webhttrack
|
||||
Makefile
|
||||
.deps/
|
||||
.libs/
|
||||
|
||||
35
AGENTS.md
@@ -19,13 +19,25 @@ the operational checklist: toolchain, invariants, and how to ship a change.
|
||||
(`request_queue_size`) so macOS/BSD don't drop connections under a parallel
|
||||
`-c16` bigcrawl the way Python's default backlog of 5 did.
|
||||
Or run `sh build.sh` to do bootstrap + configure + make in one shot.
|
||||
- A `tests/NN_*.test` runs only if listed in `tests/Makefile.am`'s `TESTS`; an
|
||||
- A `tests/NN_*.test` runs only if listed in `tests/tests-list.mk`; an
|
||||
unregistered file is silently skipped.
|
||||
- `make check` prepends the build's `src/` to `PATH`, but a hand-run `.test` does
|
||||
not — an installed `/usr/bin/httrack` then shadows your build. Run via `make
|
||||
check`, or `PATH="<bld>/src:$PATH"` for a manual run.
|
||||
- Give new `.test` scripts `set -e`: the older ones predate the rule, so several
|
||||
`local-crawl.sh` calls with no `set -e` report PASS on any non-last failure.
|
||||
- Run teardown with errexit off: `trap 'set +e; cleanup' EXIT`. Under `set -e` a
|
||||
failing cleanup command becomes the test's exit status (#773). Keep the other
|
||||
signals on their own `trap` line, or errexit stays off for the rest of the run.
|
||||
The guard also resets `$?`, so save it first if teardown reads it.
|
||||
- Never pipe into `grep -q`: it exits on the first match, so whatever the
|
||||
producer had left to write takes SIGPIPE, and under `pipefail` that becomes
|
||||
the pipeline's status. `cmd | grep -q M && fail` then never fires and a probe
|
||||
that proved nothing reads as "marker absent"; `cmd | grep -q M || fail` fails
|
||||
a test whose marker was present. bash issues one `write()` per line, so any
|
||||
match that is not on the last line is exposed. Capture the reply, assert the
|
||||
status line it must carry (an empty, truncated or redirected one is
|
||||
marker-free too), then match with a here-string: `grep -q M <<<"$reply"`.
|
||||
|
||||
## Hard invariants
|
||||
- **Generated autotools files are NOT in git.** `configure`, every
|
||||
@@ -48,6 +60,16 @@ the operational checklist: toolchain, invariants, and how to ship a change.
|
||||
- Bounds-check every copy. Overflow-safe form: put the untrusted value alone,
|
||||
`untrusted < limit - controlled` — never `controlled + untrusted < limit`,
|
||||
which can wrap and pass.
|
||||
- **Abort or clip is a decision, not a default.** The `*_safe_` helpers
|
||||
(`strcpybuff`, `strlcpybuff`, `strcatbuff`) **abort** on overflow. Right for
|
||||
our own data, wrong for anything read back from a cache, a header or the
|
||||
wire, where it trades a memory smash for a crash on malformed input. Clip
|
||||
with `dst[0] = '\0'; strlncatbuff(dst, src, size, size - 1)`.
|
||||
- **A warning class is not the unsafe set.** `-Wformat-truncation` fires only on
|
||||
a *bounded* `snprintf` whose return is discarded, so an unbounded `sprintf`
|
||||
into the same buffer never appears on it. Before scoping a hardening pass off
|
||||
compiler output, grep the unguarded forms yourself (`\bsprintf\s*\(`,
|
||||
`\bstrcpy\s*\(`, `\bstrcat\s*\(`).
|
||||
|
||||
## C conventions
|
||||
- **Use the `*t` allocator wrappers, never raw libc** (`htssafe.h`):
|
||||
@@ -84,6 +106,17 @@ Before pushing, and when reviewing others, don't skim for bugs:
|
||||
layout/ABI, cache/wire format, or a security path? A static or unit check
|
||||
isn't enough; exercise the wrong behavior at runtime. Claude Code:
|
||||
`/review-recipe`.
|
||||
- **Poison a canary, never compare it against zero.** Checking that a
|
||||
neighbouring field is still `'\0'` cannot see the stray NUL an off-by-one
|
||||
terminator writes — the exact bug the canary is there for. Fill it with a
|
||||
non-zero byte, and prove it by killing both the stray-`'X'` and the
|
||||
stray-NUL mutant. Neither ASan nor `_FORTIFY_SOURCE` sees an overflow that
|
||||
lands inside the same struct.
|
||||
- **Overshoot every destination, not one.** A bounds test that oversizes a
|
||||
single field cannot tell a per-field bound from a one-size-fits-all one, nor
|
||||
from a fix that bounds that field and leaves its neighbours raw. Exercise
|
||||
each destination the path touches, spanning at least two capacities, and
|
||||
check what the code actually emits before writing the expected values.
|
||||
|
||||
## Commits
|
||||
- **Sign-off is mandatory.** Every commit carries a `Signed-off-by` trailer:
|
||||
|
||||
12
Makefile.am
@@ -6,13 +6,21 @@ ACLOCAL_AMFLAGS = -I m4
|
||||
EXTRA_DIST = INSTALL.Linux \
|
||||
gpl-fr.txt license.txt greetings.txt history.txt \
|
||||
httrack-doc.html lang.def README.md tools/mkdeb.sh \
|
||||
tools/macos-app.sh tools/Info.plist.in \
|
||||
bootstrap build.sh
|
||||
|
||||
# Build the signed Debian packages from a clean source export. Pass the signing
|
||||
# key and other options through DEB_FLAGS, e.g.:
|
||||
# make deb DEB_FLAGS="--key BB71C7E6CB1AD8FAF53FE42A60C3AA7180598EFB"
|
||||
# See tools/mkdeb.sh --help for all options.
|
||||
# See tools/mkdeb.sh --help for all options. Not $(SHELL): mkdeb.sh is bash, and dash chokes (#891).
|
||||
DEB_FLAGS =
|
||||
deb:
|
||||
$(SHELL) $(top_srcdir)/tools/mkdeb.sh $(DEB_FLAGS)
|
||||
$(BASH_SHELL) $(top_srcdir)/tools/mkdeb.sh $(DEB_FLAGS)
|
||||
.PHONY: deb
|
||||
|
||||
# Assemble the macOS application bundle from an installed prefix, e.g.
|
||||
# make macos-app APP_FLAGS="--prefix /tmp/inst --out /tmp"
|
||||
APP_FLAGS =
|
||||
macos-app:
|
||||
$(SHELL) $(top_srcdir)/tools/macos-app.sh --plist tools/Info.plist $(APP_FLAGS)
|
||||
.PHONY: macos-app
|
||||
|
||||
75
configure.ac
@@ -1,6 +1,6 @@
|
||||
AC_PREREQ([2.71])
|
||||
|
||||
AC_INIT([httrack], [3.49.14], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
||||
AC_INIT([httrack], [3.49.15], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
||||
AC_COPYRIGHT([
|
||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||
Copyright (C) 1998-2015 Xavier Roche and other contributors
|
||||
@@ -29,12 +29,12 @@ AC_CONFIG_SRCDIR(src/httrack.c)
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
# 3:6:0: 3.49.14 grows two installed structs from the inside (htsoptstate sits mid-
|
||||
# httrackp, htsblk mid-lien_back), so the fields after them shift: httrackp.cookies_file
|
||||
# +8, lien_back.http11 +48. Soname deliberately stays .so.3: the shifted fields are
|
||||
# 3.49-era additions no external consumer reaches, and a libhttrack3 rename isn't worth it.
|
||||
# 3:7:0: htsblk gained a tail field and lien_back embeds it by value, so
|
||||
# lien_back.is_update and everything after it shift +8 (httrackp's own tail growth
|
||||
# moves nothing). Soname stays .so.3: HTTrackQt is the only consumer of the installed
|
||||
# headers, so a libhttrack4 rename isn't worth it.
|
||||
# (3:0:0 was the htsblk mime-buffer widening, the ABI break that moved .so.2 -> .so.3.)
|
||||
VERSION_INFO="3:6:0"
|
||||
VERSION_INFO="3:7:0"
|
||||
AM_MAINTAINER_MODE
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
@@ -48,13 +48,18 @@ m4_warn([obsolete],
|
||||
# script's behavior did not change. They are probably safe to remove.
|
||||
AC_CHECK_INCLUDES_DEFAULT
|
||||
AC_PROG_EGREP
|
||||
# $(SED) substitutes $(datadir) into src/webhttrack
|
||||
AC_PROG_SED
|
||||
|
||||
LT_INIT
|
||||
AC_PROG_LN_S
|
||||
LT_INIT
|
||||
|
||||
# bash, used to run the test scripts (see tests/Makefile.am TEST_LOG_COMPILER)
|
||||
AC_PATH_PROGS([BASH], [bash], [/bin/bash])
|
||||
# A real bash, for "make deb" and the test harness. Not searched into BASH: bash presets
|
||||
# that to its own path, and macOS /bin/sh is a bash, so the macro never searches (#895).
|
||||
# BASH_SHELL isn't preset the way BASH is, so AC_ARG_VAR needs no guard.
|
||||
AC_ARG_VAR([BASH_SHELL], [path to a real (non-POSIX-mode) bash])
|
||||
AC_PATH_PROGS([BASH_SHELL], [bash], [/bin/bash])
|
||||
|
||||
# Export LD_LIBRARY_PATH name or equivalent.
|
||||
AC_SUBST(SHLIBPATH_VAR,$shlibpath_var)
|
||||
@@ -66,10 +71,11 @@ AC_SUBST(LT_CV_OBJDIR,$lt_cv_objdir)
|
||||
AC_SUBST(VERSION_INFO)
|
||||
|
||||
### Default CFLAGS
|
||||
# No -Wdeclaration-after-statement: nothing sets -std=, so this builds as gnu17.
|
||||
DEFAULT_CFLAGS="-Wall -Wformat -Wformat-security \
|
||||
-Wmultichar -Wwrite-strings -Wcast-qual -Wcast-align \
|
||||
-Wstrict-prototypes -Wmissing-prototypes \
|
||||
-Wmissing-declarations -Wdeclaration-after-statement \
|
||||
-Wmissing-declarations \
|
||||
-Wpointer-arith -Wsequence-point -Wnested-externs \
|
||||
-D_REENTRANT"
|
||||
AC_SUBST(DEFAULT_CFLAGS)
|
||||
@@ -77,27 +83,33 @@ DEFAULT_LDFLAGS=""
|
||||
AC_SUBST(DEFAULT_LDFLAGS)
|
||||
|
||||
### Additional flags (if supported)
|
||||
AX_CHECK_COMPILE_FLAG([-Wparentheses], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wparentheses"])
|
||||
AX_CHECK_COMPILE_FLAG([-Winit-self], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Winit-self"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wunused-but-set-parameter], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wunused-but-set-parameter"])
|
||||
AX_CHECK_COMPILE_FLAG([-Waddress], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Waddress"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wuninitialized], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wuninitialized"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wformat=2], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wformat=2"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wformat-nonliteral], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wformat-nonliteral"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wmissing-parameter-type], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wmissing-parameter-type"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wold-style-definition], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wold-style-definition"])
|
||||
AX_CHECK_COMPILE_FLAG([-Wignored-qualifiers], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wignored-qualifiers"])
|
||||
# -Werror on probes: exit-status-only checks let clang's warn-on-unknown-flag through.
|
||||
AX_CHECK_COMPILE_FLAG([-Wparentheses], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wparentheses"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Winit-self], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Winit-self"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wunused-but-set-parameter], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wunused-but-set-parameter"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Waddress], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Waddress"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wuninitialized], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wuninitialized"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wformat=2], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wformat=2"], [], [-Werror])
|
||||
# -Wformat-nonliteral needs -Wformat in the probe or gcc rejects it as ignored.
|
||||
AX_CHECK_COMPILE_FLAG([-Wformat-nonliteral], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wformat-nonliteral"], [], [-Werror -Wformat])
|
||||
AX_CHECK_COMPILE_FLAG([-Wmissing-parameter-type], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wmissing-parameter-type"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wold-style-definition], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wold-style-definition"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Wignored-qualifiers], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Wignored-qualifiers"], [], [-Werror])
|
||||
# Make htssafe.h's pointer-dest 'warning' attribute a hard error in our build
|
||||
# (migration is at zero; a new char* dest is a regression). gcc/clang each take
|
||||
# only their own spelling; downstream keeps the plain warning, not a build break.
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=attribute-warning], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Werror=attribute-warning"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=user-defined-warnings], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Werror=user-defined-warnings"])
|
||||
AX_CHECK_COMPILE_FLAG([-fstrict-aliasing -Wstrict-aliasing], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstrict-aliasing -Wstrict-aliasing"])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=attribute-warning], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Werror=attribute-warning"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-Werror=user-defined-warnings], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -Werror=user-defined-warnings"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-fstrict-aliasing -Wstrict-aliasing], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstrict-aliasing -Wstrict-aliasing"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-fstack-protector-strong], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstack-protector-strong"],
|
||||
[AX_CHECK_COMPILE_FLAG([-fstack-protector], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstack-protector"])])
|
||||
AX_CHECK_COMPILE_FLAG([-fstack-clash-protection], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstack-clash-protection"])
|
||||
AX_CHECK_COMPILE_FLAG([-fcf-protection], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fcf-protection"])
|
||||
AX_CHECK_LINK_FLAG([-Wl,--discard-all], [DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,--discard-all"])
|
||||
[AX_CHECK_COMPILE_FLAG([-fstack-protector], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstack-protector"], [], [-Werror])], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-fstack-clash-protection], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fstack-clash-protection"], [], [-Werror])
|
||||
AX_CHECK_COMPILE_FLAG([-fcf-protection], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fcf-protection"], [], [-Werror])
|
||||
# backtrace() unwinds through these; armhf, unlike amd64/arm64, defaults them off
|
||||
# and printed frameless crash reports.
|
||||
AX_CHECK_COMPILE_FLAG([-fasynchronous-unwind-tables], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -fasynchronous-unwind-tables"], [], [-Werror])
|
||||
# No --discard-all: it drops the local symbols naming every static function, so
|
||||
# a trace misattributes them to the nearest surviving global. Costs 0.6% size.
|
||||
AX_CHECK_LINK_FLAG([-Wl,--no-undefined], [DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,--no-undefined"])
|
||||
AX_CHECK_LINK_FLAG([-Wl,-z,relro,-z,now], [DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,-z,relro,-z,now"])
|
||||
AX_CHECK_LINK_FLAG([-Wl,-z,noexecstack], [DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,-z,noexecstack"])
|
||||
@@ -119,13 +131,13 @@ AC_SUBST([LIBC_FORCE_LINK])
|
||||
### PIE
|
||||
CFLAGS_PIE=""
|
||||
LDFLAGS_PIE=""
|
||||
AX_CHECK_COMPILE_FLAG([-fpie -pie], [CFLAGS_PIE="-fpie -pie"])
|
||||
AX_CHECK_COMPILE_FLAG([-fpie], [CFLAGS_PIE="-fpie"], [], [-Werror])
|
||||
AX_CHECK_LINK_FLAG([-pie], [LDFLAGS_PIE="-pie"])
|
||||
AC_SUBST([CFLAGS_PIE])
|
||||
AC_SUBST([LDFLAGS_PIE])
|
||||
|
||||
## Export all symbols for backtraces
|
||||
AX_CHECK_COMPILE_FLAG([-rdynamic], [DEFAULT_CFLAGS="$DEFAULT_CFLAGS -rdynamic"])
|
||||
# Ties a crash trace from a stripped build back to its separate debug symbols.
|
||||
AX_CHECK_LINK_FLAG([-Wl,--build-id], [DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -Wl,--build-id"])
|
||||
|
||||
### Check for -fvisibility=hidden support
|
||||
gl_VISIBILITY
|
||||
@@ -169,9 +181,9 @@ AC_CHECK_TYPE(sa_family_t, [], [AC_DEFINE([sa_family_t], [uint16_t], [sa_family_
|
||||
AX_CHECK_ALIGNED_ACCESS_REQUIRED
|
||||
|
||||
# check for various headers
|
||||
AC_CHECK_HEADERS([execinfo.h])
|
||||
AC_CHECK_HEADERS([execinfo.h sys/ioctl.h])
|
||||
|
||||
### zlib
|
||||
### zlib (mandatory)
|
||||
CHECK_ZLIB()
|
||||
|
||||
### brotli and zstd content codings (optional)
|
||||
@@ -356,5 +368,6 @@ html/Makefile
|
||||
libtest/Makefile
|
||||
tests/Makefile
|
||||
fuzz/Makefile
|
||||
tools/Info.plist
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
||||
10
debian/changelog
vendored
@@ -1,3 +1,13 @@
|
||||
httrack (3.49.15-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release: single-file mirrors with inlined assets, sitemap
|
||||
ingestion, a change report between crawls, and numerous --update, FTP and
|
||||
parser fixes; full list in history.txt.
|
||||
* httrack-doc grows by roughly 1 MB: the offline guide now ships screenshots
|
||||
of the WinHTTrack, WebHTTrack and Android interfaces.
|
||||
|
||||
-- Xavier Roche <xavier@debian.org> Thu, 30 Jul 2026 10:40:08 +0200
|
||||
|
||||
httrack (3.49.14-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release: WARC/WACZ archive output, Windows long-path support,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if FUZZERS
|
||||
noinst_PROGRAMS = fuzz-charset fuzz-meta fuzz-idna fuzz-entities \
|
||||
fuzz-unescape fuzz-filters fuzz-url fuzz-header fuzz-cachendx \
|
||||
fuzz-htsparse
|
||||
fuzz-htsparse fuzz-singlefile fuzz-sitemap
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
@@ -27,6 +27,8 @@ fuzz_url_SOURCES = fuzz-url.c fuzz.h
|
||||
fuzz_header_SOURCES = fuzz-header.c fuzz.h
|
||||
fuzz_cachendx_SOURCES = fuzz-cachendx.c fuzz.h
|
||||
fuzz_htsparse_SOURCES = fuzz-htsparse.c fuzz.h
|
||||
fuzz_singlefile_SOURCES = fuzz-singlefile.c fuzz.h
|
||||
fuzz_sitemap_SOURCES = fuzz-sitemap.c fuzz.h
|
||||
|
||||
# List corpus files explicitly: automake does not expand EXTRA_DIST globs.
|
||||
EXTRA_DIST = README.md run-fuzzers.sh \
|
||||
@@ -47,4 +49,10 @@ EXTRA_DIST = README.md run-fuzzers.sh \
|
||||
corpus/cachendx/regress-overadvance.bin \
|
||||
corpus/cachendx/regress-truncated-entry.bin \
|
||||
corpus/htsparse/basic.html corpus/htsparse/script-inscript.html \
|
||||
corpus/htsparse/meta-usemap.html corpus/htsparse/malformed.html
|
||||
corpus/htsparse/meta-usemap.html corpus/htsparse/malformed.html \
|
||||
corpus/singlefile/img-src.html corpus/singlefile/link-rel.html \
|
||||
corpus/singlefile/style-block.html corpus/singlefile/style-attr.html \
|
||||
corpus/singlefile/srcset.html corpus/singlefile/rawtext.html \
|
||||
corpus/singlefile/malformed.html corpus/singlefile/many-attrs.html \
|
||||
corpus/sitemap/urlset.xml corpus/sitemap/sitemapindex.xml \
|
||||
corpus/sitemap/truncated.xml corpus/sitemap/urlset.xml.gz
|
||||
|
||||
3
fuzz/corpus/singlefile/img-src.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<img src="a.png">
|
||||
<img src=big.png alt=over-cap>
|
||||
<img src="../escape.png"><img src="/abs.png"><img src="data:,x">
|
||||
4
fuzz/corpus/singlefile/link-rel.html
Normal file
@@ -0,0 +1,4 @@
|
||||
<link rel="stylesheet" href="s.css">
|
||||
<link rel=icon href=a.png>
|
||||
<link rel="next" href="p2.html">
|
||||
<link rel="preload" href="j.js">
|
||||
5
fuzz/corpus/singlefile/malformed.html
Normal file
@@ -0,0 +1,5 @@
|
||||
<img src="unterminated.png
|
||||
<div style="background:url(a.png">
|
||||
<style>@import url(
|
||||
<!-- unterminated comment
|
||||
<a href=
|
||||
1
fuzz/corpus/singlefile/many-attrs.html
Normal file
@@ -0,0 +1 @@
|
||||
<img src="a.png" a0="v" a1="v" a2="v" a3="v" a4="v" a5="v" a6="v" a7="v" a8="v" a9="v" a10="v" a11="v" a12="v" a13="v" a14="v" a15="v" a16="v" a17="v" a18="v" a19="v" a20="v" a21="v" a22="v" a23="v" a24="v" a25="v" a26="v" a27="v" a28="v" a29="v" a30="v" a31="v" a32="v" a33="v" a34="v" a35="v" a36="v" a37="v" a38="v" a39="v" a40="v" a41="v" a42="v" a43="v" a44="v" a45="v" a46="v" a47="v" a48="v" a49="v" a50="v" a51="v" a52="v" a53="v" a54="v" a55="v" a56="v" a57="v" a58="v" a59="v" a60="v" a61="v" a62="v" a63="v" a64="v" a65="v" a66="v" a67="v" a68="v" a69="v">
|
||||
4
fuzz/corpus/singlefile/rawtext.html
Normal file
@@ -0,0 +1,4 @@
|
||||
<script>var s="</scripting>"; if(a</b) x=1;</script>
|
||||
<script src="j.js"></script>
|
||||
<textarea></textareas></textarea>
|
||||
<title></titles></title>
|
||||
2
fuzz/corpus/singlefile/srcset.html
Normal file
@@ -0,0 +1,2 @@
|
||||
<img srcset="a.png 1x, big.png 2x, a.png 100w">
|
||||
<source srcset="a.png,, a.png 2x," src="a.png">
|
||||
2
fuzz/corpus/singlefile/style-attr.html
Normal file
@@ -0,0 +1,2 @@
|
||||
<div style="background:url(a.png);list-style:url('a.png')"></div>
|
||||
<p style='background:url("a.png")'>x</p>
|
||||
5
fuzz/corpus/singlefile/style-block.html
Normal file
@@ -0,0 +1,5 @@
|
||||
<style>@import "s.css";
|
||||
@import url(sub/b.css);
|
||||
div{background:url(a.png)}
|
||||
/* url(a.png) */ p:after{content:"url(a.png)"}
|
||||
</style>
|
||||
1
fuzz/corpus/sitemap/sitemapindex.xml
Normal file
@@ -0,0 +1 @@
|
||||
<sitemapindex><sitemap><loc>http://h.test/s2.xml.gz</loc></sitemap></sitemapindex>
|
||||
1
fuzz/corpus/sitemap/truncated.xml
Normal file
@@ -0,0 +1 @@
|
||||
<urlset><loc>http://h.test/x
|
||||
1
fuzz/corpus/sitemap/urlset.xml
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0"?><urlset><url><loc>http://h.test/a.html</loc></url><url><loc>https://h.test/b?x=1&y=2</loc></url></urlset>
|
||||
BIN
fuzz/corpus/sitemap/urlset.xml.gz
Normal file
131
fuzz/fuzz-singlefile.c
Normal file
@@ -0,0 +1,131 @@
|
||||
/* ------------------------------------------------------------ */
|
||||
/*
|
||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||
Copyright (C) 2026 Xavier Roche and other contributors
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Ethical use: we kindly ask that you NOT use this software to harvest email
|
||||
addresses or to collect any other private information about people. Doing so
|
||||
would dishonor our work and waste the many hours we have spent on it.
|
||||
|
||||
Please visit our Website: http://www.httrack.com
|
||||
*/
|
||||
|
||||
/* Fuzz the --single-file rewriter (htssinglefile.c): hostile HTML walked
|
||||
through the tag, CSS url()/@import and srcset parsers, then re-serialized.
|
||||
The resolver is aimed at a private temp tree, so the inlining half (MIME
|
||||
guess, base64, nested stylesheet) is reached and nothing else on disk is. */
|
||||
#include "fuzz.h"
|
||||
|
||||
#include "httrack-library.h"
|
||||
#include "htssinglefile.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
/* Between a.png and big.png, so one input reaches both the inline path and the
|
||||
over-cap fallback. */
|
||||
#define FUZZ_SF_CAP 64
|
||||
|
||||
static char sf_root[512];
|
||||
static char sf_page[600];
|
||||
|
||||
/* The asset tree, in removal order: the subdirectory comes after its file. */
|
||||
static const char *const sf_files[] = {"a.png", "big.png", "j.js", "s.css",
|
||||
"sub/b.css", "sub", NULL};
|
||||
|
||||
static void sf_cleanup(void) {
|
||||
char path[700];
|
||||
int i;
|
||||
|
||||
for (i = 0; sf_files[i] != NULL; i++) {
|
||||
snprintf(path, sizeof(path), "%s/%s", sf_root, sf_files[i]);
|
||||
(void) remove(path);
|
||||
}
|
||||
(void) remove(sf_root);
|
||||
}
|
||||
|
||||
/* A missing asset would silently reduce the target to its parser half. */
|
||||
static void sf_write(const char *name, const char *data, size_t len) {
|
||||
char path[700];
|
||||
FILE *fp;
|
||||
|
||||
snprintf(path, sizeof(path), "%s/%s", sf_root, name);
|
||||
fp = fopen(path, "wb");
|
||||
if (fp == NULL || fwrite(data, 1, len, fp) != len)
|
||||
abort();
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
static void sf_text(const char *name, const char *data) {
|
||||
sf_write(name, data, strlen(data));
|
||||
}
|
||||
|
||||
static void sf_init(void) {
|
||||
static const char png[] = "\x89PNG\r\n\x1a\n";
|
||||
static const char big[4096] = "\x89PNG";
|
||||
const char *tmp = getenv("TMPDIR");
|
||||
char path[700];
|
||||
|
||||
hts_init();
|
||||
snprintf(sf_root, sizeof(sf_root), "%s/httrack-fuzz-sf-XXXXXX",
|
||||
tmp != NULL && tmp[0] != '\0' ? tmp : "/tmp");
|
||||
if (mkdtemp(sf_root) == NULL)
|
||||
abort();
|
||||
atexit(sf_cleanup);
|
||||
snprintf(sf_page, sizeof(sf_page), "%s/page.html", sf_root);
|
||||
snprintf(path, sizeof(path), "%s/sub", sf_root);
|
||||
if (mkdir(path, 0700) != 0)
|
||||
abort();
|
||||
sf_write("a.png", png, sizeof(png) - 1);
|
||||
sf_write("big.png", big, sizeof(big));
|
||||
sf_text("j.js", "var x=1;\n");
|
||||
/* @import plus a url(), so an inlined stylesheet recurses and its own
|
||||
relative reference is rebased. */
|
||||
sf_text("s.css", "@import url(sub/b.css);\ndiv{background:url(a.png)}\n");
|
||||
sf_text("sub/b.css", "p{background:url(../a.png)}\n");
|
||||
}
|
||||
|
||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
static int inited = 0;
|
||||
|
||||
String out = STRING_EMPTY;
|
||||
httrackp *opt;
|
||||
/* Exact-length, unterminated: the rewriter is span-based, so ASan bounds a
|
||||
read past html_len instead of it landing on a terminator. */
|
||||
char *html = malloct(size != 0 ? size : 1);
|
||||
|
||||
if (!inited) {
|
||||
sf_init();
|
||||
inited = 1;
|
||||
}
|
||||
memcpy(html, data, size);
|
||||
|
||||
opt = hts_create_opt();
|
||||
opt->log = opt->errlog = NULL;
|
||||
opt->single_file_max_size = FUZZ_SF_CAP;
|
||||
|
||||
StringClear(out);
|
||||
(void) singlefile_rewrite_html(opt, sf_root, sf_page, html, size,
|
||||
SINGLEFILE_MAX_PAGE_SIZE, &out);
|
||||
|
||||
StringFree(out);
|
||||
freet(html);
|
||||
hts_free_opt(opt);
|
||||
return 0;
|
||||
}
|
||||
60
fuzz/fuzz-sitemap.c
Normal file
@@ -0,0 +1,60 @@
|
||||
/* ------------------------------------------------------------ */
|
||||
/*
|
||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||
Copyright (C) 2026 Xavier Roche and other contributors
|
||||
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Ethical use: we kindly ask that you NOT use this software to harvest email
|
||||
addresses or to collect any other private information about people. Doing so
|
||||
would dishonor our work and waste the many hours we have spent on it.
|
||||
|
||||
Please visit our Website: http://www.httrack.com
|
||||
*/
|
||||
|
||||
/* Fuzz the sitemap <loc> scanner (htssitemap.c): raw XML, gzip-framed bodies
|
||||
and truncated streams all arrive here straight off the network. */
|
||||
#include "fuzz.h"
|
||||
#include "htssitemap.h"
|
||||
|
||||
static hts_boolean sm_count(void *arg, const char *url) {
|
||||
int *const n = (int *) arg;
|
||||
|
||||
(void) url;
|
||||
(*n)++;
|
||||
return HTS_TRUE;
|
||||
}
|
||||
|
||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
static const int caps[] = {0, 1, 16, HTS_SITEMAP_MAX_URLS_DOC};
|
||||
hts_boolean is_index;
|
||||
char *body;
|
||||
int n = 0, cap;
|
||||
|
||||
if (size == 0)
|
||||
return 0;
|
||||
cap = caps[data[0] % (sizeof(caps) / sizeof(caps[0]))];
|
||||
data++, size--;
|
||||
/* A heap copy of exactly `size` bytes: the scanner must never rely on a
|
||||
terminator, and ASan turns any overread into a report. */
|
||||
body = malloct(size != 0 ? size : 1);
|
||||
memcpy(body, data, size);
|
||||
|
||||
(void) hts_sitemap_scan(body, size, cap, &is_index, sm_count, &n);
|
||||
|
||||
freet(body);
|
||||
return 0;
|
||||
}
|
||||
@@ -5,7 +5,7 @@ Xavier Roche (xroche at httrack.com)
|
||||
project leader
|
||||
core engine, Windows/Linux GUI
|
||||
Yann Philippot (yphilippot at lemel.fr)
|
||||
for the java binary .class parser
|
||||
past contributor (java binary .class parser)
|
||||
|
||||
With the help of:
|
||||
Leto Kauler (molotov at tasmail.com)
|
||||
|
||||
32
history.txt
@@ -4,6 +4,36 @@ HTTrack Website Copier release history:
|
||||
|
||||
This file lists all changes and fixes that have been made for HTTrack
|
||||
|
||||
3.49-15
|
||||
+ New: --single-file rewrites each saved page with its assets inlined as data: URIs (#713)
|
||||
+ New: --changes reports what a crawl added, updated or removed against the previous mirror (#714)
|
||||
+ New: --sitemap and --sitemap-url ingest sitemaps, so pages nothing links to are still found (#712)
|
||||
+ New: webhttrack exposes --warc-cdx, --wacz and --warc-max-size (#862)
|
||||
+ Fixed: --update and --purge-old destroyed a good local copy when the re-fetch got no response, was aborted mid-read, or when the backup meant to protect it failed (#746, #748, #758, #775)
|
||||
+ Fixed: an FTP re-fetch truncated the mirrored file, resumed a complete mirror with REST and spliced the old body into the new one, and a successful transfer was blanked when its backlog slot was swapped out (#771, #797, #798, #823)
|
||||
+ Fixed: a chunked response cut at a chunk boundary was stored and cached as complete (#840)
|
||||
+ Fixed: cache repair deleted the old cache before a rename it never checked, and the unlink-then-rename fallback could lose the destination (#779, #786, #790, #824)
|
||||
+ Fixed: several backward scans from strlen(s) - 1 read before their buffer on an empty string (#730, #768, #770, #814, #821)
|
||||
+ Fixed: a URL could be saved onto the engine's own temporary files, and the final path segment was never clamped (#774, #842, #852)
|
||||
+ Fixed: a query-string character reference the page charset cannot represent was left unescaped, changing how the query parses (#854)
|
||||
+ Fixed: a second --update pass overwrote the previous WARC and regenerated a page-less WACZ (#759)
|
||||
+ Fixed: WARC output dropped URLs of 1005 bytes or more, archived nothing for a 304 revisit, and marked an engine-forced not-modified as one the server sent (#778, #785, #826, #838, #839)
|
||||
+ Fixed: ProxyTrack overflowed its .arc header block, walked past the end of an .ndx buffer, trusted an unparsed offset, and crashed on a PROPFIND or on an entry with no usable Last-Modified (#793, #820, #825, #828)
|
||||
+ Fixed: webhttrack leaked the session id into crawled pages, overflowed its command line so a quoted value could inject flags, let a posted project path repoint the served root, and built its redirect Location in a 256-byte stack buffer (#700, #706, #707, #710)
|
||||
+ Fixed: in the web GUI, options ticked on by default could not be un-ticked, "max site size" set a per-file cap instead of the HTML one, and the mirror link on the finished page could not be followed (#708, #709, #725)
|
||||
+ Fixed: htsserver labelled every PNG as image/gif and offered JPEG as a download, and an unauthenticated GET of a directory spun the server forever (#724, #875)
|
||||
+ Fixed: webhttrack hung at exit when no mirror had been launched (#753)
|
||||
+ Fixed: oversized cache and header fields aborted the engine or overflowed a neighbouring field instead of being clipped (#701, #715, #717, #722, #732)
|
||||
+ Fixed: a -%S rules file of 4 GB or more overran the heap (#702)
|
||||
+ Fixed: the CLI display did not repaint when the terminal was resized (#97)
|
||||
+ Fixed: a document with no declared charset double-encoded the title lifted for the local index (#848)
|
||||
+ Fixed: a fragment on an inlined reference was dropped, losing an SVG sprite selector (#766)
|
||||
+ Fixed: several time helpers handed out libc's shared gmtime/localtime static rather than a reentrant breakdown (#794, #806)
|
||||
+ Changed: fatal-signal backtraces name engine frames instead of a bare module and offset (#705)
|
||||
+ Changed: --without-zlib is rejected at configure time rather than failing at link (#735)
|
||||
+ Changed: the offline documentation gains one GUI guide with screenshots, an Android option reference, and a restructured index
|
||||
+ Changed: multiple internal hardening, test and CI improvements
|
||||
|
||||
3.49-14
|
||||
+ New: WARC/1.1 archive output (--warc), with a sorted CDXJ index (--warc-cdx) and WACZ packaging (--wacz), also available from webhttrack (#668)
|
||||
+ New: -%F takes named footer fields such as {url}, {lastmodified}, {mime}, {charset} and {status} instead of a fixed layout (#667)
|
||||
@@ -98,7 +128,7 @@ This file lists all changes and fixes that have been made for HTTrack
|
||||
+ Fixed: report why a -%L URL list could not be loaded (#49)
|
||||
+ Changed: multiple internal hardening, build and CI improvements
|
||||
|
||||
.49-9
|
||||
3.49-9
|
||||
+ Fixed: file-type detection from the Content-Type header: trust a declared type over a binary URL extension, honor --assume under the delayed type check, and keep a known extension against a bogus or empty Content-Type (#267, #29, #56)
|
||||
+ Fixed: an uninitialized-buffer read when the Content-Type is empty (#411)
|
||||
+ Fixed: restored C++ source-compatibility of the installed headers so reverse dependencies (httraqt) build again (#413)
|
||||
|
||||
@@ -19,7 +19,7 @@ MetaInfodir = $(datadir)/metainfo
|
||||
# Explicit filenames (e.g. ../history.txt, div/search.sh) resolve via VPATH and
|
||||
# need no prefix.
|
||||
HelpHtmlroot_DATA = ../httrack-doc.html ../history.txt
|
||||
HelpHtml_DATA = $(srcdir)/*.html
|
||||
HelpHtml_DATA = $(srcdir)/*.html $(srcdir)/*.js $(srcdir)/*.css
|
||||
HelpHtmldiv_DATA = div/search.sh
|
||||
HelpHtmlimg_DATA = $(srcdir)/img/*
|
||||
HelpHtmlimages_DATA = $(srcdir)/images/*
|
||||
@@ -39,12 +39,4 @@ MetaInfo_DATA = $(srcdir)/server/div/*.metainfo.xml
|
||||
EXTRA_DIST = $(HelpHtml_DATA) $(HelpHtmlimg_DATA) $(HelpHtmlimages_DATA) \
|
||||
$(HelpHtmldiv_DATA) $(WebHtml_DATA) $(WebHtmlimages_DATA) \
|
||||
$(WebPixmap_DATA) $(WebIcon16x16_DATA) $(WebIcon32x32_DATA) $(WebIcon48x48_DATA) \
|
||||
$(VFolderEntry_DATA) $(MetaInfo_DATA) \
|
||||
httrack.css
|
||||
|
||||
install-data-hook:
|
||||
if test ! -L $(DESTDIR)$(prefix)/share/httrack/html ; then \
|
||||
( cd $(DESTDIR)$(prefix)/share/httrack \
|
||||
&& $(LN_S) $(htmldir) html \
|
||||
) \
|
||||
fi
|
||||
$(VFolderEntry_DATA) $(MetaInfo_DATA)
|
||||
|
||||
225
html/abuse.html
@@ -1,111 +1,74 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="How to mirror a site without hammering the server, and what a webmaster can do about crawlers that do.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>Using HTTrack responsibly</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<h3>For HTTrack users:</h3>
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>On this page</h2>
|
||||
<ul>
|
||||
<li><a href="#for-httrack-users">For HTTrack users</a></li>
|
||||
<li><a href="#for-webmasters-having-problems-with-band">For webmasters having problems with bandwidth abuse / other abuses related to HTTrack</a></li>
|
||||
<li><a href="#please-follow-these-common-sense-rules-t">Please follow these common sense rules to avoid any network abuse</a></li>
|
||||
<li><a href="#how-to-limit-network-abuse-httrack-websi">How to limit network abuse HTTrack Website Copier FAQ (updated - DRAFT)</a></li>
|
||||
</ul>
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html" aria-current="page" class="here">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h3 id="for-httrack-users">For HTTrack users:</h3>
|
||||
<ul>
|
||||
<li><a href="#USERS">Advice & what <u>not</u> to do when you are using HTTrack</a></li>
|
||||
</ul>
|
||||
<br>
|
||||
|
||||
<h3>For webmasters having problems with bandwidth abuse / other abuses related to HTTrack:</h3>
|
||||
<h3 id="for-webmasters-having-problems-with-band">For webmasters having problems with bandwidth abuse / other abuses related to HTTrack:</h3>
|
||||
<ul>
|
||||
<li><a href="#WEBMASTERS">Abuse FAQ for <u>webmasters</a></u></li>
|
||||
</ul>
|
||||
@@ -121,9 +84,9 @@ h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
|
||||
|
||||
<h2 align="center"><em>Advice & what <u>not</u> to do</em></h2>
|
||||
<h1>Advice & what <u>not</u> to do</h1>
|
||||
|
||||
<center><h3>Please follow these <i>common sense</i> rules to avoid any network abuse</h3></center>
|
||||
<center><h3 id="please-follow-these-common-sense-rules-t">Please follow these <i>common sense</i> rules to avoid any network abuse</h3></center>
|
||||
|
||||
<br>
|
||||
|
||||
@@ -178,9 +141,9 @@ Downloading a site can overload it, if you have a fast pipe, or if you capture t
|
||||
|
||||
|
||||
|
||||
<h2 align="center"><em>Abuse FAQ for <u>webmasters</u></em></h2>
|
||||
<h2 id="abuse-faq-for-webmasters" align="center"><em>Abuse FAQ for <u>webmasters</u></em></h2>
|
||||
|
||||
<center><h3>How to limit network abuse
|
||||
<center><h3 id="how-to-limit-network-abuse-httrack-websi">How to limit network abuse
|
||||
<br>
|
||||
HTTrack Website Copier FAQ (updated - DRAFT)
|
||||
</h3></center>
|
||||
@@ -338,19 +301,19 @@ Bad: Radical (your site will only be available online for all users), not easy t
|
||||
How to do: Create fake links with "killing" targets<br>
|
||||
Example: Use things like <a href="killme.cgi"><nothing></a>
|
||||
(again an example in php:)<br>
|
||||
<tt>
|
||||
<tt>
|
||||
<pre>
|
||||
<?php
|
||||
// Add IP.
|
||||
add_temp_firewall_rule($REMOTE_ADDR,"30s");
|
||||
?>
|
||||
function add_temp_firewall_rule($addr) {
|
||||
// The chain chhttp is flushed in a cron job to avoid ipchains overflow
|
||||
system("/usr/bin/sudo -u root /sbin/ipchains -I 1 chhttp -p tcp -s ".$addr." --dport 80 -j REJECT");
|
||||
syslog("user rejected due to too many copy attemps : ".$addr);
|
||||
}
|
||||
|
||||
<pre>
|
||||
<?php
|
||||
// Add IP.
|
||||
add_temp_firewall_rule($REMOTE_ADDR,"30s");
|
||||
?>
|
||||
function add_temp_firewall_rule($addr) {
|
||||
// The chain chhttp is flushed in a cron job to avoid ipchains overflow
|
||||
system("/usr/bin/sudo -u root /sbin/ipchains -I 1 chhttp -p tcp -s ".$addr." --dport 80 -j REJECT");
|
||||
syslog("user rejected due to too many copy attemps : ".$addr);
|
||||
}
|
||||
|
||||
<pre>
|
||||
|
||||
</tt>
|
||||
<br>
|
||||
@@ -409,9 +372,9 @@ Example:<br>
|
||||
FOS('mycompany.com','smith?subject=Hi, John','Click here to email me!')<br>
|
||||
// --><br>
|
||||
</script><br>
|
||||
<noscript><br>
|
||||
smith at mycompany dot com<br>
|
||||
</noscript><br>
|
||||
<noscript><br>
|
||||
smith at mycompany dot com<br>
|
||||
</noscript><br>
|
||||
</tt>
|
||||
<br>
|
||||
</li><li>Another one is to create images of emails<br>
|
||||
@@ -566,26 +529,14 @@ And then, put the email address in your pages through:
|
||||
|
||||
<br>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
159
html/addurl.html
@@ -1,155 +1,10 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<title>Moved to the HTTrack interface guide</title>
|
||||
<link rel="canonical" href="guide.html#step-address">
|
||||
<meta http-equiv="refresh" content="0; url=guide.html#step-address">
|
||||
</head>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
|
||||
<h2 align="center"><em>Add a URL</em></h2>
|
||||
|
||||
<br>
|
||||
|
||||
<ol>
|
||||
<li>Enter a typical Web address</li>
|
||||
<br><small>Just type in your address in the field</small><br><br>
|
||||
<center><img src="img/addurl1.gif" border="0"></center>
|
||||
<br><br>OR<br><br>
|
||||
<li>Enter a Web address with authentication</li>
|
||||
<br><small>Useful when you need basic authentication to watch the Web page</small><br><br>
|
||||
<center><img src="img/addurl2.gif" border="0"></center>
|
||||
<br><br>OR<br><br>
|
||||
<li>Capture a link from your Web browser to HTTrack</li>
|
||||
<br><small>Use this tool only for form-based pages (pages delivered after submiting a form) that need some analysis</small><br><br>
|
||||
<center><img src="img/addurl3.gif" border="0"></center>
|
||||
<br>
|
||||
<br>
|
||||
<small>Set, as explained, your Web browser proxy preferences to the values indicated : set the proxy's address, and the proxy's port,
|
||||
then click on the button or link as you usually do in your Web browser.
|
||||
<br>The temporary proxy, installed by HTTrack, will then
|
||||
capture the link and display a confirmation page.
|
||||
<br><br>
|
||||
</small>
|
||||
<center><img src="img/addurl4.gif" border="0"></center>
|
||||
<br>
|
||||
<center><img src="img/addurl5.gif" border="0"></center>
|
||||
</ol>
|
||||
|
||||
<br><br><br><br>
|
||||
<p align="right">Back to <a href="index.html">Home</a></p>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
|
||||
<body><p>Adding a URL is now part of <a href="guide.html#step-address">the HTTrack interface guide</a>.</p></body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
@@ -1,223 +1,11 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="How to mirror a website with HTTrack on Android: install the app, create a project, enter the address, run the mirror, and browse the result on your device." />
|
||||
<meta name="keywords" content="httrack, HTTrack, android, offline browser, web mirror utility, website mirroring, mobile, Google Play" />
|
||||
<title>HTTrack on Android</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<title>Moved to the HTTrack interface guide</title>
|
||||
<link rel="canonical" href="guide.html">
|
||||
<meta http-equiv="refresh" content="0; url=guide.html#droid/">
|
||||
</head>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
|
||||
<h2 align="center"><em>HTTrack on Android</em></h2>
|
||||
|
||||
<br>
|
||||
|
||||
<p>HTTrack downloads a website to your device so you can read it offline. The
|
||||
Android app runs the same mirroring engine as the desktop version behind a touch
|
||||
interface. It needs Android 7.0 or later, and is available on
|
||||
<a href="https://play.google.com/store/apps/details?id=com.httrack.android">Google Play</a>.</p>
|
||||
|
||||
<p>The steps below follow one mirror from start to finish.</p>
|
||||
|
||||
<br>
|
||||
|
||||
<ol>
|
||||
|
||||
<li><b>Grant storage access</b></li>
|
||||
<br><small>On first launch the app asks for permission to store mirrors on your
|
||||
device. The prompt reads <em>"Allow HTTrack Website Copier to access photos,
|
||||
media, and files on your device?"</em>. Tap <b>ALLOW</b>: without it the app
|
||||
cannot save the downloaded files.</small>
|
||||
<br><br><center><img src="img/android_permission.png" width="320" alt="First-run storage permission dialog" border="0"></center>
|
||||
<br><small>If you have used an older release, a second prompt offers to bring its
|
||||
mirrors into the app. Tap <b>Import</b> to move them, or <b>Not now</b> to
|
||||
skip.</small>
|
||||
<br><br><center><img src="img/android_import.png" width="320" alt="Import mirrors from an older version" border="0"></center>
|
||||
<br><br>
|
||||
|
||||
<li><b>Start</b></li>
|
||||
<br><small>The welcome screen shows the engine version at the bottom. Tap
|
||||
<b>Next</b> to create a project, or <b>Browse sites</b> to open a mirror you
|
||||
already made.</small>
|
||||
<br><br><center><img src="img/android_startup.png" width="320" alt="Welcome screen" border="0"></center>
|
||||
<br><br>
|
||||
|
||||
<li><b>Name the project</b></li>
|
||||
<br><small>Give the project a name, and optionally a category to group related
|
||||
mirrors. <b>Base path</b> shows where the files will be written. Tap
|
||||
<b>Next</b>.</small>
|
||||
<br><br><center><img src="img/android_project.png" width="320" alt="Project name, category, and base path" border="0"></center>
|
||||
<br><br>
|
||||
|
||||
<li><b>Enter the address</b></li>
|
||||
<br><small>Type the site address. If a project of the same name already exists,
|
||||
pick <b>Continue interrupted download</b> or <b>Update existing download</b>.
|
||||
Tap <b>Options</b> to adjust the crawl, or <b>Start</b> to begin.</small>
|
||||
<br><br><center><img src="img/android_url.png" width="320" alt="Web address and download action" border="0"></center>
|
||||
<br><br>
|
||||
|
||||
<li><b>Options (optional)</b></li>
|
||||
<br><small>The <b>Options</b> screen holds the crawl settings, grouped into
|
||||
eleven tabs. It uses the same profile format as the desktop version, so a tab you
|
||||
know from WinHTTrack behaves the same way here.</small>
|
||||
<br><br><center><img src="img/android_options.png" width="320" alt="Options tab list" border="0"></center>
|
||||
<br><small>The tabs are:</small>
|
||||
<ul>
|
||||
<li><small><b>Scan Rules</b>: wildcard filters for the addresses to keep or skip.</small></li>
|
||||
<li><small><b>Limits</b>: caps on depth, size, time, speed, and number of connections.</small></li>
|
||||
<li><small><b>Flow Control</b>: simultaneous connections, timeouts, and retries.</small></li>
|
||||
<li><small><b>Links</b>: how far to follow links, and which extra files to fetch.</small></li>
|
||||
<li><small><b>Build</b>: how the saved files and folders are named.</small></li>
|
||||
<li><small><b>Browser ID</b>: the user-agent, language, and headers sent to servers.</small></li>
|
||||
<li><small><b>Spider</b>: cookies, robots.txt handling, and request behavior.</small></li>
|
||||
<li><small><b>Proxy address</b>: proxy host and port.</small></li>
|
||||
<li><small><b>Log, Index, Cache</b>: log files, the search index, and the update cache.</small></li>
|
||||
<li><small><b>Type/MIME associations</b>: map file extensions to MIME types.</small></li>
|
||||
<li><small><b>Experts Only</b>: scan mode, how far the crawl may travel, and link rewriting.</small></li>
|
||||
</ul>
|
||||
<br><center><img src="img/android_scanrules.png" width="320" alt="Scan Rules tab" border="0"></center>
|
||||
<br><center><img src="img/android_experts.png" width="320" alt="Experts Only tab" border="0"></center>
|
||||
<br><small>The <a href="step9.html">desktop option reference</a> describes every
|
||||
setting in full. A few desktop options are missing or fixed on Android: the proxy
|
||||
tab has a host and port but no login and password, the download folder is fixed
|
||||
inside the app's storage so there is no output-path setting, and the MIME table
|
||||
holds up to eight entries.</small>
|
||||
<br><br>
|
||||
|
||||
<li><b>Run the mirror</b></li>
|
||||
<br><small>HTTrack downloads the site and reports live figures: bytes saved,
|
||||
links scanned, transfer rate, and errors. Tap <b>Abort</b> to stop early; a
|
||||
partial mirror can be resumed later.</small>
|
||||
<br><br><center><img src="img/android_progress.png" width="320" alt="Crawl in progress with live statistics" border="0"></center>
|
||||
<br><br>
|
||||
|
||||
<li><b>Browse the result</b></li>
|
||||
<br><small>When the crawl finishes the app reports <b>Success</b> and the mirror
|
||||
location. Tap <b>Browse Mirrored Website</b> to read the copy in your browser,
|
||||
<b>View log</b> to see what happened, or <b>New project</b> to start
|
||||
again.</small>
|
||||
<br><br><center><img src="img/android_finished.png" width="320" alt="Mirror finished, success" border="0"></center>
|
||||
<br><br>
|
||||
|
||||
<li><b>Where the files are</b></li>
|
||||
<br><small>Mirrors are written under <tt>/storage/emulated/0/HTTrack/Websites</tt>,
|
||||
in a folder named after the project. That folder lives in your device's shared
|
||||
storage, so a file manager or a USB connection can reach it. Opening
|
||||
<tt>index.html</tt> there browses a mirror without the app.</small>
|
||||
|
||||
</ol>
|
||||
|
||||
<br><br><br><br>
|
||||
<p align="right">Back to <a href="index.html">Home</a></p>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
|
||||
<body><p>This page is now part of
|
||||
<a href="guide.html#droid/">the HTTrack interface guide</a>.</p></body>
|
||||
</html>
|
||||
|
||||
503
html/cache.html
@@ -1,293 +1,238 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Cache format specification</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="The format of the HTTrack cache in hts-cache, and how to read it.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>HTTrack cache format</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<h2 align="center"><em>Cache format specification</em></h2>
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html" aria-current="page" class="here">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h1>Cache format specification</h1>
|
||||
|
||||
<br />
|
||||
|
||||
For updating purpose, HTTrack stores original (untouched) HTML data,
|
||||
references to downloaded files, and other meta-data (especially parts of the HTTP headers) in a cache,
|
||||
located in the hts-cache directory. Because local html pages are always modified to "fit" the local
|
||||
filesystem structure, and because meta-data such as the last-Modified date and Etag can not be stored
|
||||
with the associated files, the cache is absolutely mandatory for reprocessing (update/continue) phases.
|
||||
|
||||
<br /><br />
|
||||
|
||||
<h3>The (new) cache.zip format</h3>
|
||||
|
||||
The 3.31 release of HTTrack introduces a new cache format, more extensible and efficient than the previous one (ndx/dat format).
|
||||
|
||||
The main advantages of this cache are:
|
||||
|
||||
<ul>
|
||||
<li>One single file for a complete website cache archive</li>
|
||||
<li>Standard <a href="http://www.pkware.com/products/enterprise/white_papers/appnote.txt" target="_new">ZIP</a> format, that can be easily reused on most platforms and languages</li>
|
||||
<li>Compressed data with the efficient and opened <a href="http://www.gzip.org/zlib/" target="_new">zlib</a> format</li>
|
||||
</ul>
|
||||
|
||||
The cache is made of ZIP files entries ; with one ZIP file entry per fetched URL (successfully or not - errors are also stored).<br />
|
||||
For each entry:
|
||||
<ul>
|
||||
<li>The ZIP file name is the original URL [<small><a href="#orig">see notes below</a></small>]</li>
|
||||
<li>The ZIP file contents, <b>if available</b>, is the original (compressed, using the deflate algorythm) data</li>
|
||||
<li>The ZIP file extra field (in the local file header) contains a list of meta-fields, very similar to the <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616" target="new_">HTTP</a> headers fields. See also <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396" target="new_">RFC</a>.</li><br />
|
||||
<li>The ZIP file timestamp follows the "Last-Modified-Since" field given for this URL, if any</li>
|
||||
</ul>
|
||||
|
||||
Example of cache file:
|
||||
<br />
|
||||
|
||||
<pre>
|
||||
$ unzip -l hts-cache/new.zip
|
||||
Archive: hts-cache/new.zip
|
||||
HTTrack Website Copier/3.31-ALPHA-4 mirror complete in 3 seconds : 5 links scanned,
|
||||
3 files written (16109 bytes overall) [17690 bytes received at 5896 bytes/sec]
|
||||
(1 errors, 0 warnings, 0 messages)
|
||||
Length Date Time Name
|
||||
-------- ---- ---- ----
|
||||
94 07-18-03 08:59 http://www.httrack.com/robots.txt
|
||||
9866 01-17-04 01:09 http://www.httrack.com/html/cache.html
|
||||
0 05-11-03 13:31 http://www.httrack.com/html/images/bg_rings.gif
|
||||
207 01-19-04 05:49 http://www.httrack.com/html/fade.gif
|
||||
0 05-11-03 13:31 http://www.httrack.com/html/images/header_title_4.gif
|
||||
-------- -------
|
||||
10167 5 files
|
||||
</pre>
|
||||
|
||||
Example of cache file meta-data:
|
||||
<br />
|
||||
|
||||
<pre>
|
||||
HTTP/1.1 200 OK
|
||||
X-In-Cache: 1
|
||||
X-StatusCode: 200
|
||||
X-StatusMessage: OK
|
||||
X-Size: 94
|
||||
Content-Type: text/plain
|
||||
Last-Modified: Fri, 18 Jul 2003 08:59:11 GMT
|
||||
Etag: "40ebb5-5e-3f17b6df"
|
||||
X-Addr: www.httrack.com
|
||||
X-Fil: /robots.txt
|
||||
</pre>
|
||||
|
||||
There are also specific issues regarding this format:
|
||||
|
||||
<ul>
|
||||
<li>The data in the central directory (such as CD extra field, and CD comments) are not used</li>
|
||||
<li>The ZIP archive is allowed to contains more than 2^16 files (65535) ; in such case the total number of entries in the 32-bit central directory is 65536 (0xffff), but the presence of the 64-bit central directory is not mandatory</li>
|
||||
<li>The ZIP archive is allowed to contains more than 2^32 bytes (4GiB) ; in such case the 64-bit central directory is emitted automatically (a single stored entry of 4GiB or more is not supported)</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<b>Meta-data stored in the "extra field" of the local file headers</b><br />
|
||||
|
||||
The extra field is composed of text data, and this text data is composed of distinct lines of headers.
|
||||
The end of text, <b>or</b> a double CR/LF, mark the end of this zone.
|
||||
This method allows you to optionally store original HTTP headers just after the "meta-data" headers for informational use.<br />
|
||||
|
||||
<br />
|
||||
<b>The status line (the first headers line)</b><br />
|
||||
|
||||
Status-Line = HTTP-Version SP Status-Code SP X-Reason-Phrase CRLF<br />
|
||||
|
||||
<br />
|
||||
<b>Other lines:</b><br />
|
||||
|
||||
<br />
|
||||
<b>Specific fields:</b><br />
|
||||
<ul>
|
||||
<li>X-In-Cache</li><br>
|
||||
Indicates if the data are present (value=1) in the cache (that is, as ZIP data), or in an external file (value=0).
|
||||
This field MUST be the first field.
|
||||
|
||||
<li>X-StatusCode</li><br>
|
||||
The modified (by httrack) status code after processing. 304 error codes ("Not modified"), for example, are transformed into "200" codes after processing.
|
||||
|
||||
<li>X-StatusMessage</li><br>
|
||||
The modified (by httrack) status message.
|
||||
|
||||
<li>X-Size</li><br>
|
||||
The stored (either in cache, or in an external file) data size.
|
||||
|
||||
<li>X-Charset</li><br>
|
||||
The original charset.
|
||||
|
||||
<li>X-Addr</li><br>
|
||||
The original URL address part.
|
||||
|
||||
<li>X-Fil</li><br>
|
||||
The original URL path part.
|
||||
|
||||
<li>X-Save</li><br>
|
||||
The local filename, depending on user's "build structure" preferences.
|
||||
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<b>Standard (RFC 2616) "useful" fields:</b><br />
|
||||
<ul>
|
||||
<li>Content-Type</li>
|
||||
<li>Last-Modified</li>
|
||||
<li>Etag</li>
|
||||
<li>Location</li>
|
||||
<li>Content-Disposition</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<b>Specific fields in "BNF-like" grammar:</b><br />
|
||||
|
||||
<pre>
|
||||
X-In-Cache = "X-In-Cache" ":" 1*DIGIT
|
||||
X-StatusCode = "X-StatusCode" ":" 1*DIGIT
|
||||
X-StatusMessage = "X-StatusMessage" ":" *<TEXT, excluding CR, LF>
|
||||
X-Size = "X-Size" ":" 1*DIGIT
|
||||
X-Charset = "X-Charset" ":" value
|
||||
X-Addr = "X-Addr" ":" scheme ":" "//" authority
|
||||
X-Fil = "X-Fil" ":" rel_path
|
||||
X-Save = "X-Save" ":" rel_path
|
||||
</pre>
|
||||
|
||||
<b>RFC standard fields:</b><br />
|
||||
|
||||
<pre>
|
||||
Content-Type = "Content-Type" ":" media-type
|
||||
Last-Modified = "Last-Modified" ":" HTTP-date
|
||||
Etag = "ETag" ":" entity-tag
|
||||
Location = "Location" ":" absoluteURI
|
||||
Content-Disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )
|
||||
</pre>
|
||||
|
||||
<br />
|
||||
And, for your information,
|
||||
<pre>
|
||||
X-Reason-Phrase = *<TEXT, with a maximum of 32 characters, and excluding CR, LF>
|
||||
</pre>
|
||||
|
||||
|
||||
<a name="orig">Note: Because the URLs may have an unexpected format, especially with double "/" inside, and other reserved characters ("?", "&" ..),
|
||||
various ZIP uncompressors can potentially have troubles accessing or decompressing the data.
|
||||
Libraries should generally handle this peculiar format, however.
|
||||
</a>
|
||||
For updating purpose, HTTrack stores original (untouched) HTML data,
|
||||
references to downloaded files, and other meta-data (especially parts of the HTTP headers) in a cache,
|
||||
located in the hts-cache directory. Because local html pages are always modified to "fit" the local
|
||||
filesystem structure, and because meta-data such as the last-Modified date and Etag can not be stored
|
||||
with the associated files, the cache is absolutely mandatory for reprocessing (update/continue) phases.
|
||||
|
||||
<br /><br />
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3 id="the-new-cache-zip-format">The (new) cache.zip format</h3>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
The 3.31 release of HTTrack introduces a new cache format, more extensible and efficient than the previous one (ndx/dat format).
|
||||
|
||||
The main advantages of this cache are:
|
||||
|
||||
<ul>
|
||||
<li>One single file for a complete website cache archive</li>
|
||||
<li>Standard <a href="http://www.pkware.com/products/enterprise/white_papers/appnote.txt" target="_new">ZIP</a> format, that can be easily reused on most platforms and languages</li>
|
||||
<li>Compressed data with the efficient and opened <a href="http://www.gzip.org/zlib/" target="_new">zlib</a> format</li>
|
||||
</ul>
|
||||
|
||||
The cache is made of ZIP files entries ; with one ZIP file entry per fetched URL (successfully or not - errors are also stored).<br />
|
||||
For each entry:
|
||||
<ul>
|
||||
<li>The ZIP file name is the original URL [<small><a href="#orig">see notes below</a></small>]</li>
|
||||
<li>The ZIP file contents, <b>if available</b>, is the original (compressed, using the deflate algorythm) data</li>
|
||||
<li>The ZIP file extra field (in the local file header) contains a list of meta-fields, very similar to the <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616" target="new_">HTTP</a> headers fields. See also <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396" target="new_">RFC</a>.</li><br />
|
||||
<li>The ZIP file timestamp follows the "Last-Modified-Since" field given for this URL, if any</li>
|
||||
</ul>
|
||||
|
||||
Example of cache file:
|
||||
<br />
|
||||
|
||||
<pre>
|
||||
$ unzip -l hts-cache/new.zip
|
||||
Archive: hts-cache/new.zip
|
||||
HTTrack Website Copier/3.31-ALPHA-4 mirror complete in 3 seconds : 5 links scanned,
|
||||
3 files written (16109 bytes overall) [17690 bytes received at 5896 bytes/sec]
|
||||
(1 errors, 0 warnings, 0 messages)
|
||||
Length Date Time Name
|
||||
-------- ---- ---- ----
|
||||
94 07-18-03 08:59 http://www.httrack.com/robots.txt
|
||||
9866 01-17-04 01:09 http://www.httrack.com/html/cache.html
|
||||
0 05-11-03 13:31 http://www.httrack.com/html/images/bg_rings.gif
|
||||
207 01-19-04 05:49 http://www.httrack.com/html/fade.gif
|
||||
0 05-11-03 13:31 http://www.httrack.com/html/images/header_title_4.gif
|
||||
-------- -------
|
||||
10167 5 files
|
||||
</pre>
|
||||
|
||||
Example of cache file meta-data:
|
||||
<br />
|
||||
|
||||
<pre>
|
||||
HTTP/1.1 200 OK
|
||||
X-In-Cache: 1
|
||||
X-StatusCode: 200
|
||||
X-StatusMessage: OK
|
||||
X-Size: 94
|
||||
Content-Type: text/plain
|
||||
Last-Modified: Fri, 18 Jul 2003 08:59:11 GMT
|
||||
Etag: "40ebb5-5e-3f17b6df"
|
||||
X-Addr: www.httrack.com
|
||||
X-Fil: /robots.txt
|
||||
</pre>
|
||||
|
||||
There are also specific issues regarding this format:
|
||||
|
||||
<ul>
|
||||
<li>The data in the central directory (such as CD extra field, and CD comments) are not used</li>
|
||||
<li>The ZIP archive is allowed to contains more than 2^16 files (65535) ; in such case the total number of entries in the 32-bit central directory is 65536 (0xffff), but the presence of the 64-bit central directory is not mandatory</li>
|
||||
<li>The ZIP archive is allowed to contains more than 2^32 bytes (4GiB) ; in such case the 64-bit central directory is emitted automatically (a single stored entry of 4GiB or more is not supported)</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<b>Meta-data stored in the "extra field" of the local file headers</b><br />
|
||||
|
||||
The extra field is composed of text data, and this text data is composed of distinct lines of headers.
|
||||
The end of text, <b>or</b> a double CR/LF, mark the end of this zone.
|
||||
This method allows you to optionally store original HTTP headers just after the "meta-data" headers for informational use.<br />
|
||||
|
||||
<br />
|
||||
<b>The status line (the first headers line)</b><br />
|
||||
|
||||
Status-Line = HTTP-Version SP Status-Code SP X-Reason-Phrase CRLF<br />
|
||||
|
||||
<br />
|
||||
<b>Other lines:</b><br />
|
||||
|
||||
<br />
|
||||
<b>Specific fields:</b><br />
|
||||
<ul>
|
||||
<li>X-In-Cache</li><br>
|
||||
Indicates if the data are present (value=1) in the cache (that is, as ZIP data), or in an external file (value=0).
|
||||
This field MUST be the first field.
|
||||
|
||||
<li>X-StatusCode</li><br>
|
||||
The modified (by httrack) status code after processing. 304 error codes ("Not modified"), for example, are transformed into "200" codes after processing.
|
||||
|
||||
<li>X-StatusMessage</li><br>
|
||||
The modified (by httrack) status message.
|
||||
|
||||
<li>X-Size</li><br>
|
||||
The stored (either in cache, or in an external file) data size.
|
||||
|
||||
<li>X-Charset</li><br>
|
||||
The original charset.
|
||||
|
||||
<li>X-Addr</li><br>
|
||||
The original URL address part.
|
||||
|
||||
<li>X-Fil</li><br>
|
||||
The original URL path part.
|
||||
|
||||
<li>X-Save</li><br>
|
||||
The local filename, depending on user's "build structure" preferences.
|
||||
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<b>Standard (RFC 2616) "useful" fields:</b><br />
|
||||
<ul>
|
||||
<li>Content-Type</li>
|
||||
<li>Last-Modified</li>
|
||||
<li>Etag</li>
|
||||
<li>Location</li>
|
||||
<li>Content-Disposition</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<b>Specific fields in "BNF-like" grammar:</b><br />
|
||||
|
||||
<pre>
|
||||
X-In-Cache = "X-In-Cache" ":" 1*DIGIT
|
||||
X-StatusCode = "X-StatusCode" ":" 1*DIGIT
|
||||
X-StatusMessage = "X-StatusMessage" ":" *<TEXT, excluding CR, LF>
|
||||
X-Size = "X-Size" ":" 1*DIGIT
|
||||
X-Charset = "X-Charset" ":" value
|
||||
X-Addr = "X-Addr" ":" scheme ":" "//" authority
|
||||
X-Fil = "X-Fil" ":" rel_path
|
||||
X-Save = "X-Save" ":" rel_path
|
||||
</pre>
|
||||
|
||||
<b>RFC standard fields:</b><br />
|
||||
|
||||
<pre>
|
||||
Content-Type = "Content-Type" ":" media-type
|
||||
Last-Modified = "Last-Modified" ":" HTTP-date
|
||||
Etag = "ETag" ":" entity-tag
|
||||
Location = "Location" ":" absoluteURI
|
||||
Content-Disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )
|
||||
</pre>
|
||||
|
||||
<br />
|
||||
And, for your information,
|
||||
<pre>
|
||||
X-Reason-Phrase = *<TEXT, with a maximum of 32 characters, and excluding CR, LF>
|
||||
</pre>
|
||||
|
||||
|
||||
<a name="orig">Note: Because the URLs may have an unexpected format, especially with double "/" inside, and other reserved characters ("?", "&" ..),
|
||||
various ZIP uncompressors can potentially have troubles accessing or decompressing the data.
|
||||
Libraries should generally handle this peculiar format, however.
|
||||
</a>
|
||||
|
||||
<br /><br />
|
||||
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
217
html/changes.html
Normal file
@@ -0,0 +1,217 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="The change report HTTrack writes after an update, field by field.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>HTTrack change report format</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>On this page</h2>
|
||||
<ul>
|
||||
<li><a href="#what-changed-means">What "changed" means</a></li>
|
||||
<li><a href="#with-the-cache-off">With the cache off</a></li>
|
||||
<li><a href="#fields">Fields</a></li>
|
||||
<li><a href="#encoding">Encoding</a></li>
|
||||
<li><a href="#example">Example</a></li>
|
||||
<li><a href="#notes">Notes</a></li>
|
||||
</ul>
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html" aria-current="page" class="here">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h1>Change report format specification</h1>
|
||||
|
||||
<br />
|
||||
|
||||
Run with <tt>--changes</tt> (<tt>-%d</tt>), HTTrack writes <tt>hts-changes.json</tt>
|
||||
in the project directory, next to <tt>hts-log.txt</tt>, describing what the crawl
|
||||
left new, changed, unchanged and gone compared to the previous mirror. The file is
|
||||
rewritten from scratch at the end of every run, and the log carries a one-line
|
||||
summary of the same counts.
|
||||
|
||||
<br /><br />
|
||||
|
||||
<h3 id="what-changed-means">What "changed" means</h3>
|
||||
|
||||
A resource is changed when its bytes differ, not when the server merely re-sent
|
||||
it. HTTrack compares the payload it just received against the copy the previous
|
||||
run left behind: for pages it parses, the previous payload comes from the cache
|
||||
(the file on disk carries the mirror footer and its crawl date, so its bytes
|
||||
differ on every run); for everything else, the mirrored file is the payload
|
||||
verbatim and is compared directly.
|
||||
|
||||
<br /><br />
|
||||
|
||||
Where no digest can be taken on either side, because the cache is disabled or
|
||||
the previous copy is gone, the report falls back to the transfer signal, and a
|
||||
server that answers 200 rather than 304 reads as changed. Keeping the cache on
|
||||
(the default) is what makes the report precise.
|
||||
|
||||
<br /><br />
|
||||
|
||||
<h3 id="with-the-cache-off">With the cache off</h3>
|
||||
|
||||
<tt>--cache=0</tt> costs the report more than the digest of a parsed page. The
|
||||
mirror's file index (<tt>hts-cache/new.lst</tt>) is what records which files a
|
||||
run produced, so without it there is no previous mirror to subtract from: nothing
|
||||
is reported <tt>gone</tt>, and whether the run is a first crawl cannot be decided
|
||||
at all, which <tt>first_crawl</tt> states as <tt>null</tt> rather than guess. What
|
||||
is on disk is still compared byte for byte, so the other three lists stay
|
||||
meaningful, except for the pages HTTrack parses: those have no cached payload to
|
||||
compare against and fall back to the transfer signal.
|
||||
|
||||
<br /><br />
|
||||
|
||||
<h3 id="fields">Fields</h3>
|
||||
|
||||
<ul>
|
||||
<li><tt>schema</tt>: format version, currently <tt>1</tt>. It is bumped only
|
||||
on an incompatible change; new fields may appear without one.</li>
|
||||
<li><tt>generator</tt>: the HTTrack build that wrote the file.</li>
|
||||
<li><tt>date</tt>: when the report was written, UTC, <tt>YYYY-MM-DDThh:mm:ssZ</tt>.</li>
|
||||
<li><tt>first_crawl</tt>: true when no index of a previous mirror
|
||||
(<tt>hts-cache/old.lst</tt>) was found, so there was nothing to compare against and
|
||||
everything is listed as new. Null when the run kept no index at all and the
|
||||
question cannot be answered (see above).</li>
|
||||
<li><tt>partial</tt>: true when the report ran out of memory and lists only
|
||||
part of the mirror.</li>
|
||||
<li><tt>purged</tt>: true when <tt>--purge-old</tt> was in effect, so the
|
||||
files under <tt>gone</tt> were also deleted from disk.</li>
|
||||
<li><tt>counts</tt>: the size of each of the four lists.</li>
|
||||
<li><tt>new</tt>, <tt>changed</tt>, <tt>unchanged</tt>, <tt>gone</tt>: the
|
||||
lists themselves. Every mirrored file appears in exactly one of them.</li>
|
||||
</ul>
|
||||
|
||||
Each entry is an object:
|
||||
|
||||
<ul>
|
||||
<li><tt>url</tt>: the absolute URL the file came from. Empty under
|
||||
<tt>gone</tt>: deletions are computed from the mirror's file index, which records
|
||||
paths, not URLs.</li>
|
||||
<li><tt>file</tt>: the path relative to the mirror root, with forward
|
||||
slashes. This is the entry's identity: a URL and a redirect that resolve to the
|
||||
same local file are one entry, not two.</li>
|
||||
<li><tt>size</tt>: the mirrored file's size in bytes, absent when the file
|
||||
is not on disk.</li>
|
||||
<li><tt>previous_size</tt>: under <tt>changed</tt> only, the size of the
|
||||
copy the previous run left.</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
|
||||
<h3 id="encoding">Encoding</h3>
|
||||
|
||||
The file is JSON, UTF-8. URLs and local paths reach HTTrack as raw bytes and are
|
||||
not guaranteed to be valid UTF-8; any byte sequence that is not becomes
|
||||
U+FFFD (<tt>\ufffd</tt>), so the file always parses. Compare on <tt>file</tt>
|
||||
rather than on <tt>url</tt> when a mirror is known to carry legacy-charset URLs.
|
||||
|
||||
<br /><br />
|
||||
|
||||
<h3 id="example">Example</h3>
|
||||
|
||||
<pre>
|
||||
{
|
||||
"schema": 1,
|
||||
"generator": "HTTrack Website Copier/3.49-14",
|
||||
"date": "2026-07-26T15:29:03Z",
|
||||
"first_crawl": false,
|
||||
"partial": false,
|
||||
"purged": true,
|
||||
"counts": { "new": 1, "changed": 1, "unchanged": 1, "gone": 1 },
|
||||
"new": [
|
||||
{ "url": "http://example.com/d.html", "file": "example.com/d.html", "size": 280 }
|
||||
],
|
||||
"changed": [
|
||||
{ "url": "http://example.com/a.html", "file": "example.com/a.html", "size": 281, "previous_size": 273 }
|
||||
],
|
||||
"unchanged": [
|
||||
{ "url": "http://example.com/b.html", "file": "example.com/b.html", "size": 277 }
|
||||
],
|
||||
"gone": [
|
||||
{ "url": "", "file": "example.com/c.html" }
|
||||
]
|
||||
}
|
||||
</pre>
|
||||
|
||||
<br /><br />
|
||||
|
||||
<h3 id="notes">Notes</h3>
|
||||
|
||||
<ul>
|
||||
<li>A file listed under <tt>gone</tt> is only deleted when <tt>--purge-old</tt> is
|
||||
on. Left in place it drops out of the mirror's index, so it is reported once and
|
||||
not again.</li>
|
||||
<li>A resource whose local file name changed since the previous mirror (a new
|
||||
MIME type, say) is reported as <tt>new</tt> under its new name; the old name is
|
||||
reported as <tt>gone</tt> only if the file is still on disk. The two entries are
|
||||
not paired.</li>
|
||||
<li>A resource this run tried and failed to transfer also drops out of the
|
||||
mirror's index, but its previous copy is untouched, so it is reported
|
||||
<tt>unchanged</tt>. Under <tt>--purge-old</tt> that copy is deleted anyway, and
|
||||
the report says <tt>gone</tt> to match.</li>
|
||||
<li>A run that transfers no data at all is rolled back: HTTrack restores the
|
||||
previous cache generation and leaves the previous report in place, so a lost
|
||||
connection does not overwrite a good report with an empty one.</li>
|
||||
<li>Content diffs, and keeping the previous copy of a changed page, are out of
|
||||
scope: both change what a mirror directory contains.</li>
|
||||
</ul>
|
||||
|
||||
<br /><br />
|
||||
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
10
html/cmddoc.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Moved to the command-line guide</title>
|
||||
<link rel="canonical" href="cmdguide.html">
|
||||
<meta http-equiv="refresh" content="0; url=cmdguide.html">
|
||||
</head>
|
||||
<body><p>This page is now part of <a href="cmdguide.html">the HTTrack command-line guide</a>.</p></body>
|
||||
</html>
|
||||
@@ -1,102 +1,75 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="A task-oriented guide to the httrack command line: scope, filters, limits, logins, proxies, updates and recipes.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>HTTrack command-line guide</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<h2 align="center"><em>Command-Line Guide</em></h2>
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>On this page</h2>
|
||||
<ul>
|
||||
<li><a href="#quickstart">1. Quick start</a></li>
|
||||
<li><a href="#scope">2. Scope: how far the crawl reaches</a></li>
|
||||
<li><a href="#filters">3. Filters and scan rules</a></li>
|
||||
<li><a href="#limits">4. Limits and politeness</a></li>
|
||||
<li><a href="#names">5. File names and types</a></li>
|
||||
<li><a href="#links">6. Links and page building</a></li>
|
||||
<li><a href="#identity">7. Identity, cookies and login</a></li>
|
||||
<li><a href="#proxy">8. Proxy and network</a></li>
|
||||
<li><a href="#update">9. Update and cache</a></li>
|
||||
<li><a href="#experts">10. Experts and scripting</a></li>
|
||||
<li><a href="#recipes">11. Recipes</a></li>
|
||||
</ul>
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html" aria-current="page" class="here">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h1>Command-Line Guide</h1>
|
||||
|
||||
<p>This is a task-oriented guide to the <tt>httrack</tt> command line: how to do the
|
||||
things people actually ask for, and the handful of defaults that surprise
|
||||
@@ -112,21 +85,6 @@ the log. Every project writes <tt>hts-log.txt</tt> (and <tt>hts-err.txt</tt>) in
|
||||
its output directory, and those files name every URL that was refused, redirected,
|
||||
or filtered out. Read them first.</p>
|
||||
|
||||
<h4>On this page</h4>
|
||||
<ul class="tblNoBorder">
|
||||
<li><a href="#quickstart">1. Quick start</a></li>
|
||||
<li><a href="#scope">2. Scope: how far the crawl reaches</a></li>
|
||||
<li><a href="#filters">3. Filters and scan rules</a></li>
|
||||
<li><a href="#limits">4. Limits and politeness</a></li>
|
||||
<li><a href="#names">5. File names and types</a></li>
|
||||
<li><a href="#links">6. Links and page building</a></li>
|
||||
<li><a href="#identity">7. Identity, cookies and login</a></li>
|
||||
<li><a href="#proxy">8. Proxy and network</a></li>
|
||||
<li><a href="#update">9. Update and cache</a></li>
|
||||
<li><a href="#experts">10. Experts and scripting</a></li>
|
||||
<li><a href="#recipes">11. Recipes</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 id="quickstart">1. Quick start</h3>
|
||||
|
||||
<p>A mirror is one command: a start URL and an output directory.</p>
|
||||
@@ -156,15 +114,33 @@ you write. Get this right and most "it downloaded too much" or "it only grabbed
|
||||
the index" problems disappear.</p>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--depth (-r)</tt></td><td>Maximum link depth. <b>The start page is level 1</b>, so one level of links out is <tt>-r2</tt>, not <tt>-r1</tt>.</td></tr>
|
||||
<tr><td><tt>--stay-on-same-address (-a), --stay-on-same-domain (-d), --stay-on-same-tld (-l), --go-everywhere (-e)</tt></td><td>How far off the starting host the crawl may travel: same address (host), same principal domain, same top-level domain (for example .com), or everywhere. The default keeps you on the starting host.</td></tr>
|
||||
<tr><td><tt>--can-go-down (-D), --can-go-up (-U), --stay-on-same-dir (-S), --can-go-up-and-down (-B)</tt></td><td>Directory travel: down into subdirectories only, up to parent directories only, stay in the same directory, or both up and down.</td></tr>
|
||||
<tr><td><tt>--near (-n)</tt></td><td>Also fetch non-HTML files "near" a followed link, such as an image linked from a page you kept but hosted elsewhere.</td></tr>
|
||||
<tr><td><tt>--ext-depth (-%e)</tt></td><td>How many levels of external links to follow once the crawl leaves your scope (default 0).</td></tr>
|
||||
<tr><td><tt>--test (-t)</tt></td><td>Also HEAD-test links that fall outside the scope, which are normally refused, without downloading them: a way to see what scope is excluding.</td></tr>
|
||||
<tr><td><tt>--sitemap (-%m), --sitemap-url URL (-%mu)</tt></td><td>Also take start URLs from the site's sitemap, for pages nothing links to. Off by default.</td></tr>
|
||||
</table>
|
||||
|
||||
<p>Link-following only finds what something links to. Anything a site publishes
|
||||
solely in its sitemap is invisible to HTTrack unless you ask for it.
|
||||
<tt>--sitemap</tt> reads the start host's <tt>robots.txt</tt> for
|
||||
<tt>Sitemap:</tt> lines and falls back to <tt>/sitemap.xml</tt>;
|
||||
<tt>--sitemap-url</tt> names one directly. Nested <tt>sitemapindex</tt> files
|
||||
and gzipped <tt>.xml.gz</tt> sitemaps are followed. The URLs found become start
|
||||
URLs with the full depth budget, but they still go through your filters and
|
||||
scope rules, so a sitemap cannot widen a crawl you deliberately narrowed. It is
|
||||
off by default because a sitemap can list thousands of pages nothing links
|
||||
to.</p>
|
||||
|
||||
<p>One surprise worth knowing: a sitemap you name with <tt>--sitemap-url</tt>,
|
||||
and one the site itself declares in <tt>robots.txt</tt>, are fetched even when
|
||||
<tt>robots.txt</tt> disallows that path, because naming or declaring a sitemap
|
||||
is an invitation to read it. Only the guessed <tt>/sitemap.xml</tt> obeys a
|
||||
<tt>Disallow</tt>. The URLs listed inside are gated normally either way.</p>
|
||||
|
||||
<p>The single most common surprise is "only the home page came down." That is
|
||||
usually not a scope option at all: it is an off-host redirect. A start URL of
|
||||
<tt>http://example.com/</tt> that redirects to <tt>https://www.example.com/</tt>
|
||||
@@ -224,7 +200,7 @@ options will not help there. That is an
|
||||
bracket forms match narrower sets. The full table, with size and mime rules, is on
|
||||
<a href="filters.html">the filters page</a>.</p>
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Wildcard</b></td><td><b>Matches</b></td><td><b>Example</b></td></tr>
|
||||
<tr class="head"><td><b>Wildcard</b></td><td><b>Matches</b></td><td><b>Example</b></td></tr>
|
||||
<tr><td><tt>*</tt></td><td>any run of characters</td><td><tt>+*.pdf</tt> — any URL ending <tt>.pdf</tt></td></tr>
|
||||
<tr><td><tt>*[file]</tt>, <tt>*[name]</tt></td><td>one path segment (any char but <tt>/</tt> and <tt>?</tt>)</td><td><tt>example.com/*[file]/</tt> — a directory-index page</td></tr>
|
||||
<tr><td><tt>*[path]</tt></td><td>a path, slashes allowed (any char but <tt>?</tt>)</td><td><tt>example.com/*[path].zip</tt></td></tr>
|
||||
@@ -243,7 +219,7 @@ accident, and the <a href="abuse.html">abuse page</a> is worth a read. The limit
|
||||
below let you go faster when you own the target, and slower when you do not.</p>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--max-rate (-A)</tt></td><td>Maximum transfer rate in bytes/sec. <b>The default is about 100 KB/s even without this flag.</b> Raise it to go faster.</td></tr>
|
||||
<tr><td><tt>--sockets (-c)</tt></td><td>Number of parallel connections (default 4). <tt>--tiny</tt>, <tt>--wide</tt> and <tt>--ultrawide</tt> are presets.</td></tr>
|
||||
<tr><td><tt>--connection-per-second (-%c)</tt></td><td>New connections opened per second (default 5).</td></tr>
|
||||
@@ -270,7 +246,7 @@ usually about a URL like <tt>/article?id=42</tt> or a <tt>.php</tt> page that is
|
||||
really HTML.</p>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--structure (-N)</tt></td><td>The local path and name layout. Presets are numeric, and you can also give a template such as <tt>--structure "%h%p/%n%q.%t"</tt>.</td></tr>
|
||||
<tr><td><tt>--long-names (-L)</tt></td><td>Long names, 8.3 names, or ISO9660 for CD masters.</td></tr>
|
||||
<tr><td><tt>--assume (-%A)</tt></td><td>Assume a MIME type for an extension, for example <tt>--assume php=text/html</tt>. This also skips the extra HEAD probe HTTrack would otherwise send to learn the type.</td></tr>
|
||||
@@ -294,12 +270,13 @@ naming.</p>
|
||||
ones it kept so the local copy browses offline. These options tune both halves.</p>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--keep-links (-K)</tt></td><td>How links are rewritten in saved pages. The numbering is inverted from what you might guess: bare <tt>-K</tt> keeps <b>absolute</b> URLs, and <tt>-K0</tt> is the <b>relative</b> default. <tt>-K3</tt> keeps absolute URIs, <tt>-K4</tt> keeps the original links.</td></tr>
|
||||
<tr><td><tt>--replace-external (-x), --generate-errors (-o)</tt></td><td>Replace external links with an error page, and generate an error page for links that failed.</td></tr>
|
||||
<tr><td><tt>--preserve (-%p), --disable-passwords (-%x)</tt></td><td>Leave HTML untouched (no rewriting), and strip passwords out of saved links.</td></tr>
|
||||
<tr><td><tt>--extended-parsing (-%P), --parse-java (-j)</tt></td><td>Aggressive link discovery, and how much script content is parsed for links.</td></tr>
|
||||
<tr><td><tt>--mime-html (-%M)</tt></td><td>Save the whole mirror as a single MIME-encapsulated <tt>.mht</tt> archive (<tt>index.mht</tt>).</td></tr>
|
||||
<tr><td><tt>--single-file (-%Z), --single-file-max-size N</tt></td><td>Once the mirror is finished, rewrite every saved page with its stylesheets, scripts, images and fonts embedded as <tt>data:</tt> URIs. Assets over the cap (10 MB by default) keep their link, as do audio, video, and the links from one page to another. A sibling of <tt>-%M</tt>, not a replacement: see the recipe below for which to pick.</td></tr>
|
||||
<tr><td><tt>--index (-I), --build-top-index (-%i), --search-index (-%I)</tt></td><td>Build a per-mirror index, a top index across projects, and a searchable keyword index.</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -319,7 +296,7 @@ server), and obeys robots. Plenty of sites filter exactly that profile. These
|
||||
options control what HTTrack says about itself.</p>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--user-agent (-F)</tt></td><td>The <tt>User-Agent</tt>. Set a browser string to get past crawler blocks; <tt>--user-agent ""</tt> sends none.</td></tr>
|
||||
<tr><td><tt>--referer (-%R), --from (-%E), --language (-%l), --accept (-%a)</tt></td><td>Referer, From, Accept-Language and Accept headers.</td></tr>
|
||||
<tr><td><tt>--headers (-%X)</tt></td><td>Add raw header lines to every request.</td></tr>
|
||||
@@ -350,7 +327,7 @@ across links at the same time.</p>
|
||||
<h3 id="proxy">8. Proxy and network</h3>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--proxy (-P)</tt></td><td>Route through a proxy. HTTP, SOCKS5 and CONNECT are supported: <tt>-P host:8080</tt>, <tt>-P socks5://host:1080</tt>, <tt>-P connect://host:443</tt>, with optional <tt>user:pass@</tt>.</td></tr>
|
||||
<tr><td><tt>--httpproxy-ftp (-%f)</tt></td><td>Send FTP requests through the HTTP proxy.</td></tr>
|
||||
<tr><td><tt>--protocol (-@i)</tt></td><td>Prefer IPv4 or IPv6.</td></tr>
|
||||
@@ -373,7 +350,7 @@ updating possible. It is not a size-limited scratch area you can delete: throw i
|
||||
away and you lose the ability to continue or update the mirror.</p>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--continue</tt></td><td>Carry on an interrupted mirror, trusting the cache: it does not re-check pages already stored.</td></tr>
|
||||
<tr><td><tt>--update</tt></td><td>Re-run the mirror, revalidating each page with the server (If-Modified-Since / If-None-Match) and downloading only what changed.</td></tr>
|
||||
<tr><td><tt>--purge-old=0 (-X0)</tt></td><td>Do not purge. By default an update deletes local files that are no longer part of the mirror; <tt>--purge-old=0</tt> keeps them.</td></tr>
|
||||
@@ -396,7 +373,7 @@ dynamic pages to look "changed" on every run. See the
|
||||
mirror behavior and expose the engine.</p>
|
||||
|
||||
<table class="tblRegular tableWidth" border="0">
|
||||
<tr class="tblHeaderColor"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr class="head"><td><b>Option</b></td><td><b>What it controls</b></td></tr>
|
||||
<tr><td><tt>--get URL</tt></td><td>Fetch a single file and stop. Cache, index, depth, cookies and robots are all off for this mode.</td></tr>
|
||||
<tr><td><tt>--spider --testlinks --skeleton</tt></td><td>Scan without saving, test links at depth 1, or keep HTML only. Handy for checking a site before a real crawl.</td></tr>
|
||||
<tr><td><tt>--userdef-cmd (-V)</tt></td><td>Run a shell command on each downloaded file; <tt>$0</tt> is the file path. Good for on-the-fly processing.</td></tr>
|
||||
@@ -482,6 +459,34 @@ add <tt>--warc-cdx</tt> for a sorted CDXJ index, or <tt>--wacz</tt> to bundle th
|
||||
archive, index and pages into one WACZ for replay tools such as
|
||||
replayweb.page.</small></p>
|
||||
|
||||
<h4>See what a re-crawl changed</h4>
|
||||
<p><tt>httrack https://example.com/ --update --changes --path mydir</tt><br>
|
||||
<small>Writes <tt>hts-changes.json</tt> in the project folder, listing every
|
||||
mirrored file as new, changed, unchanged or gone, plus a one-line summary in the
|
||||
log. "Changed" means the bytes really differ: a server that answers 200
|
||||
with the same content it served last time lands in <tt>unchanged</tt>. Deletions
|
||||
are reported whether or not <tt>--purge-old</tt> is deleting them. The format is
|
||||
documented in <a href="changes.html">the change report specification</a>.</small></p>
|
||||
|
||||
<h4>Pages you can hand to someone as one file</h4>
|
||||
<p><tt>httrack https://example.com/ --single-file --path mydir</tt><br>
|
||||
<small>Rewrites each saved page after the crawl so its stylesheets, scripts,
|
||||
images and fonts are embedded as <tt>data:</tt> URIs. The mirror stays a normal
|
||||
browsable tree, with links between pages relative and the assets still on disk,
|
||||
but any single <tt>.html</tt> file can now be mailed or archived on its own.
|
||||
Raise or lower the 10 MB per-asset limit with
|
||||
<tt>--single-file-max-size N</tt>; anything over it, plus audio and video, keeps
|
||||
its link. One caveat if you raise it: an inlined stylesheet becomes a
|
||||
<tt>data:</tt> URL, whose path is opaque, so an asset it referenced that stayed
|
||||
over the cap no longer resolves from inside it. Raising the cap past that asset
|
||||
embeds it too and the question goes away.<br>
|
||||
Reach for this when the file has to open for someone you cannot make assumptions
|
||||
about: it is plain HTML and needs no add-on. Reach for <tt>--mime-html</tt>
|
||||
instead when a Chromium-family browser is a given and the mirror is large: MIME
|
||||
carries text parts without the base64 tax, keeps each resource's original URL,
|
||||
and stores a shared asset once rather than re-embedding it in every page that
|
||||
uses it.</small></p>
|
||||
|
||||
<h4>HTTrack as a fetch tool</h4>
|
||||
<p><tt>httrack --get https://host/file.bin --path tmp</tt><br>
|
||||
<small><tt>--get</tt> fetches one file with cache, index, depth, cookies and robots
|
||||
@@ -490,26 +495,17 @@ all disabled.</small></p>
|
||||
<p><br>For the complete, always-current option list, see
|
||||
<a href="httrack.man.html">the manual page</a>. For the filter language, see
|
||||
<a href="filters.html">filters</a>; for the cache and updates, see
|
||||
<a href="cache.html">cache</a>.</p>
|
||||
<a href="cache.html">cache</a>; for the change report, see
|
||||
<a href="changes.html">changes</a>.</p>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,120 +1,75 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<script language="javascript">
|
||||
<!--
|
||||
function FOS(host,nom,info) {
|
||||
var s;
|
||||
if (info == "") info=nom+"@"+host;
|
||||
s="mail";
|
||||
document.write("<a href='"+s+"to:"+nom+"@"+host+"'>"+info+"</a>");
|
||||
}
|
||||
// -->
|
||||
</script>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="How to reach the HTTrack project, and who contributed to it.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>Contact and credits</title>
|
||||
<script language="javascript">
|
||||
<!--
|
||||
function FOS(host,nom,info) {
|
||||
var s;
|
||||
if (info == "") info=nom+"@"+host;
|
||||
s="mail";
|
||||
document.write("<a href='"+s+"to:"+nom+"@"+host+"'>"+info+"</a>");
|
||||
}
|
||||
// -->
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<h2 align="center"><em>Contact Us!</em></h2>
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html" aria-current="page" class="here">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h1>Contact Us!</h1>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>
|
||||
<h3 id="please-visit-our-website">
|
||||
<center>
|
||||
<a href="http://www.httrack.com/" target="_blank">Please visit our website!</a>
|
||||
<br>
|
||||
@@ -127,94 +82,94 @@ h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
<pre>
|
||||
Informations on this project:
|
||||
|
||||
This project has been developed by:
|
||||
Xavier Roche (xroche at httrack dot com)
|
||||
for the main engine and Windows interface
|
||||
and maintainer for v2.0 and v3.0
|
||||
Yann Philippot (yphilippot at lemel dot fr)
|
||||
for the java binary dot class parser
|
||||
David Lawrie (dalawrie at lineone dot net)
|
||||
Robert Lagadec (rlagadec at yahoo dot fr)
|
||||
for checking both English & French translations
|
||||
Juan Pablo Barrio Lera (University of León)
|
||||
for Spanish translations
|
||||
Rainer Klueting (rainer at klueting dot de)
|
||||
Bastian Gorke (bastiang at yahoo dot com)
|
||||
Rudi Ferrari (Wyando at netcologne dot de)
|
||||
Marcus Gaza (MarcusGaza at t-online dot de)
|
||||
for German translations
|
||||
Rudi Ferrari (Wyando at netcologne dot de)
|
||||
for Dutch translations
|
||||
Lukasz Jokiel (Opole University of Technology, Lukasz dot Jokiel at po dot opole dot pl)
|
||||
for Polish translations
|
||||
Rui Fernandes (CANTIC, ruiefe at mail dot malhatlantica dot pt)
|
||||
Pedro T dot Pinheiro (Universidade Nova de Lisboa-FCT, ptiago at mail dot iupi dot pt)
|
||||
for Portuguese translations
|
||||
Andrei Iliev (iliev at vitaplus dot ru)
|
||||
for Russian translations
|
||||
Witold Krakowski (wtkrak at netscape dot net )
|
||||
for Italian translations
|
||||
Jozsef Tamas Herczeg (hdodi at freemail dot hu)
|
||||
for Hungarian translation
|
||||
Paulo Neto (company at layout dot com dot br)
|
||||
for Brazilian translation
|
||||
Brook Qin (brookqwr at sina dot com)
|
||||
for simplified Chinese translation
|
||||
David Hing Cheong Hung (DAVEHUNG at mtr dot com dot hk)
|
||||
Addy Lin (addy1975 at pchome dot com dot tw)
|
||||
for traditional Chinese translation
|
||||
Jesper Bramm (bramm at get2net dot dk)
|
||||
for Danish translation
|
||||
Tõnu Virma
|
||||
for Estonian translation
|
||||
Staffan Ström (staffan at fam-strom dot org)
|
||||
for Swedish translation
|
||||
Mehmet Akif Köeoðlu (mak at ttnet dot net dot tr)
|
||||
for Turkish translation
|
||||
Aleksandar Savic (aleks at macedonia dot eu dot org)
|
||||
for Macedonian translation
|
||||
Takayoshi Nakasikiryo
|
||||
for Japanese translation
|
||||
Martin Sereday (sereday at slovanet dot sk)
|
||||
for Slovak translation
|
||||
Antonín Matìjèík (matejcik at volny dot cz)
|
||||
for Czech translation
|
||||
Andrij Shevchuk (http://programy dot com dot ua)
|
||||
for Ukrainian translation
|
||||
Tobias "Spug" Langhoff (spug_enigma at hotmail dot com)
|
||||
for Norwegian translation
|
||||
Jadran Rudeciur (jrudec at email dot si)
|
||||
for Slovenian translation
|
||||
Alin Gheorghe Miron (miron dot alin at personal dot ro)
|
||||
for Romanian translation
|
||||
Michael Papadakis (mikepap at freemail dot gr)
|
||||
for Greek translation
|
||||
|
||||
Thanks to:
|
||||
Leto Kauler (molotov at tasmail dot com)
|
||||
for the site/logos design
|
||||
|
||||
Special Thanks to:
|
||||
Patrick Ducrot & Daniel Carré (ENSI of Caen)
|
||||
for their initial support
|
||||
Fred Cohen (fc at all dot net)
|
||||
for HTTrack user's guide
|
||||
|
||||
Greetings to:
|
||||
Christian Marillat (marillat dot christian at wanadoo dot fr)
|
||||
for autoconf compliance and .deb package
|
||||
Jean-loup Gailly from gzip dot org
|
||||
for the help provided with Zlib
|
||||
Eric A dot Young (eay at cryptsoft dot com)
|
||||
for SSL cryptographic material (OpenSSL)
|
||||
|
||||
Russ Freeman from gipsymedia
|
||||
for hints on DLL dynamic load
|
||||
Paul DiLascia
|
||||
for helping to fix problems with CHtmlView
|
||||
ISMRA/Ensi of Caen
|
||||
for their initial support
|
||||
.. and all users that are using and supporting HTTrack!
|
||||
This project has been developed by:
|
||||
Xavier Roche (xroche at httrack dot com)
|
||||
for the main engine and Windows interface
|
||||
and maintainer for v2.0 and v3.0
|
||||
Yann Philippot (yphilippot at lemel dot fr)
|
||||
past contributor (java binary .class parser)
|
||||
David Lawrie (dalawrie at lineone dot net)
|
||||
Robert Lagadec (rlagadec at yahoo dot fr)
|
||||
for checking both English & French translations
|
||||
Juan Pablo Barrio Lera (University of León)
|
||||
for Spanish translations
|
||||
Rainer Klueting (rainer at klueting dot de)
|
||||
Bastian Gorke (bastiang at yahoo dot com)
|
||||
Rudi Ferrari (Wyando at netcologne dot de)
|
||||
Marcus Gaza (MarcusGaza at t-online dot de)
|
||||
for German translations
|
||||
Rudi Ferrari (Wyando at netcologne dot de)
|
||||
for Dutch translations
|
||||
Lukasz Jokiel (Opole University of Technology, Lukasz dot Jokiel at po dot opole dot pl)
|
||||
for Polish translations
|
||||
Rui Fernandes (CANTIC, ruiefe at mail dot malhatlantica dot pt)
|
||||
Pedro T dot Pinheiro (Universidade Nova de Lisboa-FCT, ptiago at mail dot iupi dot pt)
|
||||
for Portuguese translations
|
||||
Andrei Iliev (iliev at vitaplus dot ru)
|
||||
for Russian translations
|
||||
Witold Krakowski (wtkrak at netscape dot net )
|
||||
for Italian translations
|
||||
Jozsef Tamas Herczeg (hdodi at freemail dot hu)
|
||||
for Hungarian translation
|
||||
Paulo Neto (company at layout dot com dot br)
|
||||
for Brazilian translation
|
||||
Brook Qin (brookqwr at sina dot com)
|
||||
for simplified Chinese translation
|
||||
David Hing Cheong Hung (DAVEHUNG at mtr dot com dot hk)
|
||||
Addy Lin (addy1975 at pchome dot com dot tw)
|
||||
for traditional Chinese translation
|
||||
Jesper Bramm (bramm at get2net dot dk)
|
||||
for Danish translation
|
||||
Tõnu Virma
|
||||
for Estonian translation
|
||||
Staffan Ström (staffan at fam-strom dot org)
|
||||
for Swedish translation
|
||||
Mehmet Akif Köeoðlu (mak at ttnet dot net dot tr)
|
||||
for Turkish translation
|
||||
Aleksandar Savic (aleks at macedonia dot eu dot org)
|
||||
for Macedonian translation
|
||||
Takayoshi Nakasikiryo
|
||||
for Japanese translation
|
||||
Martin Sereday (sereday at slovanet dot sk)
|
||||
for Slovak translation
|
||||
Antonín Matìjèík (matejcik at volny dot cz)
|
||||
for Czech translation
|
||||
Andrij Shevchuk (http://programy dot com dot ua)
|
||||
for Ukrainian translation
|
||||
Tobias "Spug" Langhoff (spug_enigma at hotmail dot com)
|
||||
for Norwegian translation
|
||||
Jadran Rudeciur (jrudec at email dot si)
|
||||
for Slovenian translation
|
||||
Alin Gheorghe Miron (miron dot alin at personal dot ro)
|
||||
for Romanian translation
|
||||
Michael Papadakis (mikepap at freemail dot gr)
|
||||
for Greek translation
|
||||
|
||||
Thanks to:
|
||||
Leto Kauler (molotov at tasmail dot com)
|
||||
for the site/logos design
|
||||
|
||||
Special Thanks to:
|
||||
Patrick Ducrot & Daniel Carré (ENSI of Caen)
|
||||
for their initial support
|
||||
Fred Cohen (fc at all dot net)
|
||||
for HTTrack user's guide
|
||||
|
||||
Greetings to:
|
||||
Christian Marillat (marillat dot christian at wanadoo dot fr)
|
||||
for autoconf compliance and .deb package
|
||||
Jean-loup Gailly from gzip dot org
|
||||
for the help provided with Zlib
|
||||
Eric A dot Young (eay at cryptsoft dot com)
|
||||
for SSL cryptographic material (OpenSSL)
|
||||
|
||||
Russ Freeman from gipsymedia
|
||||
for hints on DLL dynamic load
|
||||
Paul DiLascia
|
||||
for helping to fix problems with CHtmlView
|
||||
ISMRA/Ensi of Caen
|
||||
for their initial support
|
||||
.. and all users that are using and supporting HTTrack!
|
||||
|
||||
</pre>
|
||||
<hr>
|
||||
@@ -225,46 +180,35 @@ ISMRA/Ensi of Caen
|
||||
You can also contact by email, but due to the large volume of messages, it is impossible
|
||||
to always respond (especially for configuration help or other configuration-related
|
||||
questions).
|
||||
<br>
|
||||
|
||||
<script language="javascript">
|
||||
<!--
|
||||
FOS('httrack.com','httrack','httrack at httrack dot com (HTTrack project)');
|
||||
document.write('<br>');
|
||||
FOS('httrack.com','roche','roche at httrack dot com (Xavier ROCHE)');
|
||||
// -->
|
||||
</script>
|
||||
<noscript>
|
||||
httrack at httrack dot com (HTTrack project)<br>
|
||||
roche at httrack dot com (Xavier ROCHE)<br>
|
||||
</noscript>
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
<script language="javascript">
|
||||
<!--
|
||||
FOS('httrack.com','httrack','httrack at httrack dot com (HTTrack project)');
|
||||
document.write('<br>');
|
||||
FOS('httrack.com','roche','roche at httrack dot com (Xavier ROCHE)');
|
||||
// -->
|
||||
</script>
|
||||
<noscript>
|
||||
httrack at httrack dot com (HTTrack project)<br>
|
||||
roche at httrack dot com (Xavier ROCHE)<br>
|
||||
</noscript>
|
||||
|
||||
|
||||
<br><hr><br>
|
||||
<br>
|
||||
This program is covered by the GNU General Public License.<br>
|
||||
HTTrack/HTTrack Website Copier is Copyright (C) 1998-2026 Xavier Roche and other contributors
|
||||
<br>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
231
html/dev.html
@@ -1,158 +1,111 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Using HTTrack from a script, from the callbacks, or through the libhttrack library.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>Programming with HTTrack</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<h2 align="center"><em>HTTrack Programming page</em></h2>
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>On this page</h2>
|
||||
<ul>
|
||||
<li><a href="#programming">Programming</a></li>
|
||||
<li><a href="#technical-references">Technical references</a></li>
|
||||
</ul>
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html" aria-current="page" class="here">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h1>HTTrack Programming page</h1>
|
||||
|
||||
<br>
|
||||
|
||||
HTTrack can be used as a third-party program in batch files, or as library.
|
||||
HTTrack can be used as a third-party program in batch files, or as library.
|
||||
Depending on your needs, you may look:
|
||||
|
||||
<br><br>
|
||||
|
||||
<h3>Programming</h3>
|
||||
|
||||
<ul>
|
||||
<h3 id="programming">Programming</h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="scripting.html">Simple use: scripting examples using the httrack commandline program</a></li><br>
|
||||
You can use tens of options (see <tt>httrack --help</tt>) to control precisely the mirror, and used embedded commands in httrack.
|
||||
<br><br>
|
||||
<li><a href="plug.html">More complex use: plugging external C functions to the httrack library</a></li><br>
|
||||
For advanced functions, you may have to use external C wrappers ; for example when adding advanced crawl features, such as "tuned" filestructure type
|
||||
<br><i>Important note: please read the license information of httrack before developing add-ons</i><br />
|
||||
See also the page <a href="plug_330.html">for versions prior to 3.41</a>
|
||||
<br><br>
|
||||
<li><a href="library.html">Advanced use: using the library</a></li><br>
|
||||
The library can be used to write graphical GUIs for httrack, or to run mirrors from a program.
|
||||
<br><i>Important note: please read the license information of httrack before developing add-ons</i>
|
||||
</ul>
|
||||
|
||||
<h3>Technical references</h3>
|
||||
<ul>
|
||||
<li><a href="cache.html">Cache format</a></li><br>
|
||||
HTTrack stores original HTML data and references to downloaded files in a cache, located in the hts-cache directory.
|
||||
This page describes the HTTrack cache format.
|
||||
</ul>
|
||||
|
||||
You can use tens of options (see <tt>httrack --help</tt>) to control precisely the mirror, and used embedded commands in httrack.
|
||||
<br><br>
|
||||
<li><a href="plug.html">More complex use: plugging external C functions to the httrack library</a></li><br>
|
||||
For advanced functions, you may have to use external C wrappers ; for example when adding advanced crawl features, such as "tuned" filestructure type
|
||||
<br><i>Important note: please read the license information of httrack before developing add-ons</i><br />
|
||||
See also the page <a href="plug_330.html">for versions prior to 3.41</a>
|
||||
<br><br>
|
||||
<li><a href="library.html">Advanced use: using the library</a></li><br>
|
||||
The library can be used to write graphical GUIs for httrack, or to run mirrors from a program.
|
||||
<br><i>Important note: please read the license information of httrack before developing add-ons</i>
|
||||
</ul>
|
||||
|
||||
<h3 id="technical-references">Technical references</h3>
|
||||
<ul>
|
||||
<li><a href="cache.html">Cache format</a></li><br>
|
||||
HTTrack stores original HTML data and references to downloaded files in a cache, located in the hts-cache directory.
|
||||
This page describes the HTTrack cache format.
|
||||
<li><a href="changes.html">Change report format</a></li><br>
|
||||
With --changes, HTTrack writes hts-changes.json describing what the crawl left new, changed, unchanged and gone
|
||||
compared to the previous mirror. This page describes that file.
|
||||
</ul>
|
||||
|
||||
|
||||
<br><br>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
341
html/doc.css
Normal file
@@ -0,0 +1,341 @@
|
||||
/* Shared chrome for the HTTrack documentation pages. Page-specific rules live
|
||||
beside the page (guide.css). Read from disk as often as over http, so
|
||||
everything here has to work from a file:// URL. */
|
||||
|
||||
:root {
|
||||
--field: #77b;
|
||||
--panel: #ccd;
|
||||
--accent: #99c;
|
||||
--ink: #111;
|
||||
--ink-soft: #444;
|
||||
--rule: #aab;
|
||||
--link: #00c;
|
||||
--link-hover: #c00;
|
||||
--code-bg: #e8e8f2;
|
||||
--chip: #dde;
|
||||
--shadow: rgba(0, 0, 0, .25);
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--field: #171a2b;
|
||||
--panel: #22263a;
|
||||
--accent: #3b4066;
|
||||
--ink: #e6e6ee;
|
||||
--ink-soft: #a9adc4;
|
||||
--rule: #3b4066;
|
||||
--link: #9db4ff;
|
||||
--link-hover: #ff9d9d;
|
||||
--code-bg: #14172a;
|
||||
--chip: #2e3350;
|
||||
--shadow: rgba(0, 0, 0, .6);
|
||||
}
|
||||
}
|
||||
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
/* The plain declaration before each var() is what IE11 gets: it drops the
|
||||
custom-property line it cannot parse and keeps the literal above it. */
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0 1rem 3rem;
|
||||
background: #77b;
|
||||
background: var(--field);
|
||||
color: #111;
|
||||
color: var(--ink);
|
||||
font: 1em/1.6 "Trebuchet MS", Verdana, system-ui, -apple-system, "Segoe UI", sans-serif;
|
||||
}
|
||||
|
||||
/* ---- page frame ---- */
|
||||
|
||||
.masthead, .wrap {
|
||||
max-width: 68rem;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.masthead {
|
||||
padding: .6rem 0 0;
|
||||
}
|
||||
|
||||
.masthead img { display: block; max-width: 100%; height: auto; }
|
||||
|
||||
.masthead .tagline {
|
||||
background: #000;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
padding: .25rem .4rem;
|
||||
margin-top: .4rem;
|
||||
}
|
||||
|
||||
.wrap {
|
||||
background: #ccd;
|
||||
background: var(--panel);
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 1.5rem;
|
||||
/* The rings the 2007 pages carried. Transparent, so it rides on --panel. */
|
||||
background-image: url(images/bg_rings.svg);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
/* Rings dropped, not inverted: their lavender is a light-panel tone. */
|
||||
.wrap { background-image: none; }
|
||||
|
||||
/* The wordmark is black on transparent, and all but vanishes on the dark field. */
|
||||
.masthead img { filter: invert(1); }
|
||||
}
|
||||
|
||||
@media (min-width: 62rem) {
|
||||
.wrap {
|
||||
display: grid;
|
||||
grid-template-columns: 14rem minmax(0, 1fr);
|
||||
gap: 2.5rem;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
/* The hub is its own navigation, so it spans the full width. */
|
||||
.wrap.solo { display: block; }
|
||||
}
|
||||
|
||||
footer {
|
||||
max-width: 68rem;
|
||||
margin: .5rem auto 0;
|
||||
color: #eef;
|
||||
font-size: .8em;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
footer { color: var(--ink-soft); }
|
||||
}
|
||||
|
||||
/* ---- typography ---- */
|
||||
|
||||
h2, h3 { scroll-margin-top: 1rem; }
|
||||
|
||||
h1 { font-size: 1.9em; margin: 0 0 .3em; line-height: 1.2; }
|
||||
h2 { font-size: 1.45em; margin: 2.5em 0 .5em; padding-bottom: .2em; border-bottom: 2px solid var(--rule); }
|
||||
h3 { font-size: 1.15em; margin: 2em 0 .4em; }
|
||||
h2:first-child, h1 + h2 { margin-top: 1em; }
|
||||
|
||||
p { margin: 0 0 1em; }
|
||||
|
||||
a { color: #00c; color: var(--link); }
|
||||
a:hover { color: #c00; color: var(--link-hover); }
|
||||
|
||||
code, kbd, pre {
|
||||
font-family: ui-monospace, "Cascadia Mono", Consolas, "DejaVu Sans Mono", monospace;
|
||||
font-size: .9em;
|
||||
}
|
||||
|
||||
code, kbd { background: var(--code-bg); padding: .1em .35em; border-radius: 3px; }
|
||||
|
||||
/* Legacy pages carry wide code samples: scroll them, never the page. */
|
||||
pre {
|
||||
overflow-x: auto;
|
||||
max-width: 100%;
|
||||
padding: .7rem;
|
||||
background: var(--code-bg);
|
||||
border-left: 3px solid var(--accent);
|
||||
}
|
||||
|
||||
.lede { font-size: 1.08em; color: var(--ink-soft); }
|
||||
|
||||
hr { height: 1px; border: 0; background: var(--rule); margin: 2em 0; }
|
||||
|
||||
img { max-width: 100%; height: auto; }
|
||||
|
||||
/* Legacy prose carries bare URLs long enough to push a phone sideways. */
|
||||
body { overflow-wrap: break-word; }
|
||||
|
||||
/* The reference pages carry tables wider than any column: scroll the table, not
|
||||
the page. The guide's own MIME table is narrow and reads better left alone. */
|
||||
main table:not(.mime) { display: block; overflow-x: auto; }
|
||||
|
||||
/* ---- table of contents ---- */
|
||||
|
||||
.toc { font-size: .92em; }
|
||||
|
||||
@media (min-width: 62rem) {
|
||||
.toc { position: sticky; top: 1rem; max-height: calc(100vh - 2rem); overflow-y: auto; }
|
||||
}
|
||||
|
||||
.toc h2 {
|
||||
font-size: .8em;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: .08em;
|
||||
margin: 0 0 .5em;
|
||||
border: 0;
|
||||
color: var(--ink-soft);
|
||||
}
|
||||
|
||||
.toc ol, .toc ul { list-style: none; margin: 0 0 1.5em; padding: 0; }
|
||||
.toc li { margin: 0; }
|
||||
|
||||
.toc a {
|
||||
display: block;
|
||||
padding: .2rem .5rem;
|
||||
text-decoration: none;
|
||||
border-left: 3px solid transparent;
|
||||
color: var(--ink);
|
||||
}
|
||||
|
||||
.toc a:hover { background: var(--accent); }
|
||||
.toc a[aria-current="true"] { border-left-color: var(--link); font-weight: bold; }
|
||||
.toc .here { font-weight: bold; }
|
||||
|
||||
/* ---- callouts ---- */
|
||||
|
||||
.note {
|
||||
margin: 0 0 1em;
|
||||
padding: .7rem 1rem;
|
||||
border-left: 4px solid var(--accent);
|
||||
background: var(--chip);
|
||||
font-size: .95em;
|
||||
}
|
||||
|
||||
.note > :last-child { margin-bottom: 0; }
|
||||
|
||||
/* ---- the hub ---- */
|
||||
|
||||
.hub {
|
||||
display: grid;
|
||||
gap: 1.5rem;
|
||||
margin: 2rem 0 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
@media (min-width: 46rem) {
|
||||
.hub { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
||||
}
|
||||
|
||||
.hub > li {
|
||||
padding: 1.2rem;
|
||||
background: var(--chip);
|
||||
border-radius: .5rem;
|
||||
}
|
||||
|
||||
.hub h2 {
|
||||
margin: 0 0 .8em;
|
||||
font-size: 1.1em;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: .06em;
|
||||
border: 0;
|
||||
color: var(--ink-soft);
|
||||
}
|
||||
|
||||
.hub dl { margin: 0; }
|
||||
.hub dt { margin: 0 0 .1em; font-weight: bold; }
|
||||
.hub dd { margin: 0 0 1em; font-size: .93em; color: var(--ink-soft); }
|
||||
.hub dd:last-child { margin-bottom: 0; }
|
||||
|
||||
/* Option names in the glosses are short; without this a browser breaks
|
||||
"--changes" after its hyphens. */
|
||||
.hub code { white-space: nowrap; }
|
||||
|
||||
.dated { font-weight: normal; font-size: .85em; color: var(--ink-soft); }
|
||||
|
||||
/* ---- content tables ---- */
|
||||
|
||||
/* The reference pages use bare <table> for their content tables. The guide's MIME
|
||||
table is styled beside the guide and opts out. */
|
||||
main table:not(.mime) {
|
||||
border-collapse: collapse;
|
||||
margin: 0 0 1em;
|
||||
font-size: .92em;
|
||||
}
|
||||
|
||||
main table:not(.mime) td, main table:not(.mime) th {
|
||||
border: 1px solid var(--rule);
|
||||
padding: .3em .6em;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
main table:not(.mime) th, main table:not(.mime) tr.head td {
|
||||
background: var(--accent);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* ---- screenshots ---- */
|
||||
|
||||
figure {
|
||||
margin: 0 0 1.5em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
figure img {
|
||||
border: 1px solid var(--rule);
|
||||
background: #fff;
|
||||
box-shadow: 0 2px 8px var(--shadow);
|
||||
cursor: zoom-in;
|
||||
}
|
||||
|
||||
figcaption {
|
||||
margin-top: .5em;
|
||||
font-size: .88em;
|
||||
color: var(--ink-soft);
|
||||
}
|
||||
|
||||
/* Zoom overlay. Closed <dialog> is hidden by the UA, so nothing shows without JS. */
|
||||
dialog#zoom {
|
||||
max-width: 96vw;
|
||||
max-height: 96vh;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
dialog#zoom img {
|
||||
display: block;
|
||||
max-width: 96vw;
|
||||
max-height: 96vh;
|
||||
width: auto;
|
||||
height: auto;
|
||||
cursor: zoom-out;
|
||||
}
|
||||
|
||||
dialog#zoom::backdrop { background: rgba(0, 0, 0, .8); }
|
||||
|
||||
/* ---- filter box (guide options, and the FAQ) ---- */
|
||||
|
||||
.filter {
|
||||
display: flex;
|
||||
gap: .5rem;
|
||||
align-items: center;
|
||||
margin: 0 0 1.5rem;
|
||||
}
|
||||
|
||||
.filter input {
|
||||
flex: 1 1 auto;
|
||||
padding: .5rem .7rem;
|
||||
border: 1px solid var(--rule);
|
||||
border-radius: .3rem;
|
||||
background: var(--panel);
|
||||
color: var(--ink);
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
.filter output { font-size: .88em; color: var(--ink-soft); white-space: nowrap; }
|
||||
|
||||
/* ---- misc ---- */
|
||||
|
||||
.skip {
|
||||
position: absolute;
|
||||
left: -9999px;
|
||||
}
|
||||
|
||||
.skip:focus {
|
||||
left: 1rem;
|
||||
top: 1rem;
|
||||
background: var(--panel);
|
||||
padding: .5rem;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body { background: #fff; }
|
||||
.toc, .filter { display: none; }
|
||||
.wrap { display: block; border: 0; }
|
||||
}
|
||||
104
html/doc.js
Normal file
@@ -0,0 +1,104 @@
|
||||
/* Shared behaviour for the documentation pages: click an image to enlarge it, and
|
||||
mark the section being read in the sidebar. Both are optional, and both are
|
||||
written to fail quietly on an old browser rather than break the page: a Windows 7
|
||||
machine may still open these files in Internet Explorer. */
|
||||
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
function each(list, fn) {
|
||||
Array.prototype.forEach.call(list, fn);
|
||||
}
|
||||
|
||||
/* ---- click to enlarge ---- */
|
||||
|
||||
function zoomable(node) {
|
||||
while (node && node !== document.body) {
|
||||
if (node.tagName === "IMG" && node.parentNode &&
|
||||
node.parentNode.tagName === "FIGURE") {
|
||||
return node;
|
||||
}
|
||||
node = node.parentNode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function enlarge() {
|
||||
var zoom = document.getElementById("zoom");
|
||||
if (!zoom || typeof zoom.showModal !== "function") {
|
||||
return;
|
||||
}
|
||||
var target = zoom.getElementsByTagName("img")[0];
|
||||
document.addEventListener("click", function (event) {
|
||||
var img = zoomable(event.target);
|
||||
if (!img) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
target.src = img.src;
|
||||
target.alt = img.alt;
|
||||
zoom.showModal();
|
||||
});
|
||||
zoom.addEventListener("click", function () {
|
||||
zoom.close();
|
||||
});
|
||||
}
|
||||
|
||||
/* ---- highlight the section being read ---- */
|
||||
|
||||
function highlight() {
|
||||
var marks = [];
|
||||
each(document.querySelectorAll(".toc a, .tabstrip a"), function (a) {
|
||||
if (a.hash && a.hash.length > 1) {
|
||||
marks.push(a);
|
||||
}
|
||||
});
|
||||
if (!marks.length || !window.IntersectionObserver) {
|
||||
return;
|
||||
}
|
||||
|
||||
var byId = {};
|
||||
each(marks, function (a) {
|
||||
var id = a.hash.slice(1);
|
||||
(byId[id] = byId[id] || []).push(a);
|
||||
});
|
||||
|
||||
var visible = {};
|
||||
var observer = new IntersectionObserver(function (entries) {
|
||||
each(entries, function (entry) {
|
||||
visible[entry.target.id] = entry.isIntersecting;
|
||||
});
|
||||
var top = Object.keys(byId).filter(function (id) {
|
||||
return visible[id];
|
||||
})[0];
|
||||
each(marks, function (a) {
|
||||
if (a.getAttribute("aria-current") === "true") {
|
||||
a.removeAttribute("aria-current");
|
||||
}
|
||||
});
|
||||
if (top) {
|
||||
each(byId[top], function (a) {
|
||||
a.setAttribute("aria-current", "true");
|
||||
});
|
||||
}
|
||||
}, { rootMargin: "-10% 0px -70% 0px" });
|
||||
|
||||
Object.keys(byId).forEach(function (id) {
|
||||
var el = document.getElementById(id);
|
||||
if (el) {
|
||||
observer.observe(el);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function start() {
|
||||
enlarge();
|
||||
highlight();
|
||||
}
|
||||
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", start);
|
||||
} else {
|
||||
start();
|
||||
}
|
||||
})();
|
||||
197
html/faq.html
@@ -1,112 +1,76 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, linux, windows, macos, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Frequently asked questions about HTTrack, and what to do when a site does not mirror the way you expected.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>HTTrack FAQ and troubleshooting</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<h2 align="center"><em>F A Q</em></h2>
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>On this page</h2>
|
||||
<ul>
|
||||
<li><a href="#very-frequently-asked-questions">Very Frequently Asked Questions</a></li>
|
||||
<li><a href="#general-questions">General questions</a></li>
|
||||
<li><a href="#troubleshooting">Troubleshooting</a></li>
|
||||
<li><a href="#questions-concerning-a-mirror">Questions concerning a mirror</a></li>
|
||||
<li><a href="#other-problems">Other problems</a></li>
|
||||
</ul>
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html" aria-current="page" class="here">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h1>F A Q</h1>
|
||||
|
||||
<br>
|
||||
|
||||
<p><em><br>
|
||||
<ul>
|
||||
<strong>Tips:</strong>
|
||||
<li>In case of troubles/problems during transfer, <b><u><font color="red">first check the hts-log.txt (and hts-err.txt) files to figure out what happened</b></u></font>. These log files report all
|
||||
<li>In case of troubles/problems during transfer, <b><u>first check the hts-log.txt (and hts-err.txt) files to figure out what happened</b></u>. These log files report all
|
||||
events that may be useful to detect a problem. You can also ajust the debug level of the log files in the option
|
||||
</li><li>
|
||||
The tutorial written by Fred Cohen is a very good document to read, to understand how to use the engine,
|
||||
@@ -118,12 +82,12 @@ clear language!
|
||||
|
||||
<ul><br>
|
||||
|
||||
<h3><b>Very</b> Frequently Asked Questions:<br></h3>
|
||||
<h3 id="very-frequently-asked-questions"><b>Very</b> Frequently Asked Questions:<br></h3>
|
||||
|
||||
<li><a href="#VF1">HTTrack does not capture all files I want to capture!</a><br></li>
|
||||
|
||||
<br>
|
||||
<h3>General questions:<br></h3>
|
||||
<h3 id="general-questions">General questions:<br></h3>
|
||||
|
||||
<li><a href="#QG0">Is there any 'spyware' or 'adware' in this program? Can you prove that there isn't any?</a><br></li>
|
||||
|
||||
@@ -152,7 +116,7 @@ clear language!
|
||||
<li><a href="#QG9">Is there a GUI version available for Linux and Un*x?</a><br></li>
|
||||
|
||||
|
||||
<br><h3>Troubleshooting:<br></h3>
|
||||
<br><h3 id="troubleshooting">Troubleshooting:<br></h3>
|
||||
|
||||
<li><a href="#Q0">Some sites are captured very well, other aren't. Why?</a><br></li>
|
||||
|
||||
@@ -217,7 +181,7 @@ clear language!
|
||||
<li><a href="#QT2">With WinHTTrack, sometimes the minimize in system tray causes a crash!</a><br></li>
|
||||
|
||||
|
||||
<h3><br>Questions concerning a mirror:<br></h3></li>
|
||||
<h3 id="questions-concerning-a-mirror"><br>Questions concerning a mirror:<br></h3></li>
|
||||
|
||||
<li><a href="#Q5">I want to mirror a Web site, but there are some files outside the domain, too. How to retrieve them?</a><br></li>
|
||||
|
||||
@@ -277,7 +241,7 @@ clear language!
|
||||
|
||||
<li><a href="#QM13">How can I grab email addresses in web pages?</a><br></li>
|
||||
|
||||
<br><h3>Other problems:<br></h3></a>
|
||||
<br><h3 id="other-problems">Other problems:<br></h3></a>
|
||||
|
||||
<li><a href="#Q300">My problerm is not listed!</a><br></li>
|
||||
|
||||
@@ -912,25 +876,14 @@ A: <em>Feel free to <a href="contact.html">contact us</a>!
|
||||
|
||||
</em></p><h3><br>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
@@ -1,110 +1,81 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Fred Cohen's HTTrack Users Guide, written for release 3.10.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>HTTrack Users Guide, by Fred Cohen (3.10)</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>On this page</h2>
|
||||
<ul>
|
||||
<li><a href="#background-and-introduction">Background and Introduction</a></li>
|
||||
<li><a href="#basics">Basics</a></li>
|
||||
<li><a href="#syntax">Syntax</a></li>
|
||||
<li><a href="#a-thorough-going-over">A Thorough Going Over</a></li>
|
||||
<li><a href="#filters">Filters</a></li>
|
||||
<li><a href="#user-authentication-protocols">User Authentication Protocols</a></li>
|
||||
<li><a href="#httrackrc">.httrackrc</a></li>
|
||||
<li><a href="#release-notes">Release Notes</a></li>
|
||||
<li><a href="#some-more-examples">Some More Examples</a></li>
|
||||
<li><a href="#general-questions">General questions</a></li>
|
||||
<li><a href="#troubleshooting">Troubleshooting</a></li>
|
||||
<li><a href="#questions-concerning-a-mirror">Questions concerning a mirror</a></li>
|
||||
</ul>
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html" aria-current="page" class="here">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<center><h1> Httrack Users Guide (3.10)</h1>
|
||||
By Fred Cohen </center>
|
||||
|
||||
<hr>
|
||||
|
||||
<h2> Background and Introduction </h2>
|
||||
<h2 id="background-and-introduction"> Background and Introduction </h2>
|
||||
|
||||
<p align=justify> I started using httrack in mid-2000 and found it to be
|
||||
an excellent tool for imaging web sites. Various words are used to
|
||||
@@ -125,7 +96,7 @@ assistance from the authors I volunteered to write a users manual for
|
||||
httrack - and here it is. I hope it gets the job done.
|
||||
|
||||
<hr>
|
||||
<h2> Basics </h2>
|
||||
<h2 id="basics"> Basics </h2>
|
||||
|
||||
<p align=justify> Httrack is a program that gets information from the
|
||||
Internet, looks for pointers to other information, gets that
|
||||
@@ -237,7 +208,7 @@ Build options:
|
||||
x replace external html links by error pages (--replace-external)
|
||||
%x do not include any password for external password protected websites (%x0 include) (--no-passwords)
|
||||
%q *include query string for local files (useless, for information purpose only) (%q0 don't include) (--include-query-string)
|
||||
o *generate output html file in case of error (404..) (o0 don't generate) (--generate-errors)
|
||||
o *save the server's error pages (404..) (o0 discard them) (--generate-errors)
|
||||
X *purge old files after update (X0 keep delete) (--purge-old[=N])
|
||||
|
||||
Spider options:
|
||||
@@ -385,7 +356,7 @@ the rest of us, I will now go through this listing one item at a time
|
||||
with examples... I will be here a while...
|
||||
|
||||
<hr>
|
||||
<h2> Syntax </h2>
|
||||
<h2 id="syntax"> Syntax </h2>
|
||||
|
||||
<pre><b><i>httrack <URLs> [-option] [+<FILTERs>] [-<FILTERs>] </i></b></pre>
|
||||
|
||||
@@ -413,7 +384,7 @@ site. Specifically, the defauls are:
|
||||
NN name conversion type (0 *original structure, 1+: see below)
|
||||
LN long names (L1 *long names / L0 8-3 conversion)
|
||||
K keep original links (e.g. http://www.adr/link) (K0 *relative link)
|
||||
o *generate output html file in case of error (404..) (o0 don't generate)
|
||||
o *save the server's error pages (404..) (o0 discard them)
|
||||
X *purge old files after update (X0 keep delete)
|
||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
||||
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
||||
@@ -473,11 +444,11 @@ store them with the same names used on the web site.
|
||||
URLs within this web site are adjusted to point to the files in the
|
||||
mirror.
|
||||
|
||||
<pre><b><i> o *generate output html file in case of error (404..) (o0 don't generate) </i></b></pre>
|
||||
<pre><b><i> o *save the server's error pages (404..) (o0 discard them) </i></b></pre>
|
||||
|
||||
<p align=justify> IF there are errors in downloading, create a file that
|
||||
indicates that the URL was not found. This makes browsing go a lot
|
||||
smoother.
|
||||
<p align=justify> IF a page cannot be downloaded, the error page the
|
||||
server sent is saved in its place, so a broken link still lands on the
|
||||
site's own 'not found' page. This makes browsing go a lot smoother.
|
||||
|
||||
<pre><b><i> X *purge old files after update (X0 keep delete) </i></b></pre>
|
||||
|
||||
@@ -571,7 +542,7 @@ www.all.net/bob/deeper/).
|
||||
|
||||
<hr>
|
||||
|
||||
<h2> A Thorough Going Over </h2>
|
||||
<h2 id="a-thorough-going-over"> A Thorough Going Over </h2>
|
||||
|
||||
<p align=justify> Now that you have an introduction, it's time for a
|
||||
more though coverage. This is where I go through each of the options
|
||||
@@ -1011,7 +982,7 @@ Build options:
|
||||
LN long names (L1 *long names / L0 8-3 conversion)
|
||||
K keep original links (e.g. http://www.adr/link) (K0 *relative link)
|
||||
x replace external html links by error pages
|
||||
o *generate output html file in case of error (404..) (o0 don't generate)
|
||||
o *save the server's error pages (404..) (o0 discard them)
|
||||
X *purge old files after update (X0 keep delete)
|
||||
%x do not include any password for external password protected websites (%x0 include) (--no-passwords)
|
||||
%q *include query string for local files (information only) (%q0 don't include) (--include-query-string)
|
||||
@@ -1118,9 +1089,9 @@ deactivated byt his process.
|
||||
httrack http://www.shoesizes.com -O /tmp/shoesizes -x
|
||||
</i></b></pre>
|
||||
|
||||
<p align=justify> This option prevents the generation of '404' error
|
||||
files to replace files that were not found even though there were URLs
|
||||
pointing to them. It is useful for saving space as well as eliminating
|
||||
<p align=justify> This option keeps the server's '404' error pages out
|
||||
of the mirror, even though there were URLs pointing to the missing
|
||||
files. It is useful for saving space as well as eliminating
|
||||
unnecessary files in operations where a working web site is not the
|
||||
desired result.
|
||||
|
||||
@@ -1930,7 +1901,7 @@ as -%h).
|
||||
|
||||
<hr>
|
||||
|
||||
<h2> Filters </h2>
|
||||
<h2 id="filters"> Filters </h2>
|
||||
|
||||
<p align=justify> Filters are normally placed at the end of the command
|
||||
line, but can be intermixed with other command line options if desired,
|
||||
@@ -2079,7 +2050,7 @@ generated automatically using the interface)
|
||||
|
||||
<hr>
|
||||
|
||||
<h2> User Authentication Protocols </h2>
|
||||
<h2 id="user-authentication-protocols"> User Authentication Protocols </h2>
|
||||
|
||||
<p align=justify> Smoe servers require user ID and password information
|
||||
in order to gain access. In this example, the user ID smith with
|
||||
@@ -2096,7 +2067,7 @@ capability is being provided through th URL capture features
|
||||
|
||||
<hr>
|
||||
|
||||
<h2> .httrackrc </h2>
|
||||
<h2 id="httrackrc"> .httrackrc </h2>
|
||||
|
||||
<p align=justify> A file called '.httrackrc' can be placed in the
|
||||
current directory, or if not found there, in the home directory, to
|
||||
@@ -2185,7 +2156,7 @@ added by the .httrackrc
|
||||
|
||||
<hr>
|
||||
|
||||
<h2> Release Notes </h2>
|
||||
<h2 id="release-notes"> Release Notes </h2>
|
||||
|
||||
<p align=justify> Some things change between releases. Here are some
|
||||
recent changes in httrack that may affect some of these options:
|
||||
@@ -2223,7 +2194,7 @@ collision for large numbers of files.
|
||||
|
||||
<hr>
|
||||
|
||||
<h2> Some More Examples </h2>
|
||||
<h2 id="some-more-examples"> Some More Examples </h2>
|
||||
|
||||
<p align=justify> Here are some examples of special purpose httrack
|
||||
command lines that might be useful for your situation.
|
||||
@@ -2275,7 +2246,7 @@ httrack "http://www.somesite.com/~library/thing/thingmain.htm" -O /tmp/thing -R5
|
||||
|
||||
<hr>
|
||||
|
||||
<h2>General questions:</h2>
|
||||
<h2 id="general-questions">General questions:</h2>
|
||||
|
||||
<p align=justify><b>Q: The install is not working on NT without administrator rights! </b>
|
||||
|
||||
@@ -2327,7 +2298,7 @@ Un*x? </b>
|
||||
<p align=justify> A: No. Unfortunately, we do not have enough time for
|
||||
that - if you want to help us, please write one!
|
||||
|
||||
<hr><h2> Troubleshooting:</h2>
|
||||
<hr><h2 id="troubleshooting"> Troubleshooting:</h2>
|
||||
|
||||
<p align=justify><b>Q: Only the first page is caught. What's wrong?</b>
|
||||
</br> A: First, check the <b>hts-err.txt</b> error log file - this can
|
||||
@@ -2509,7 +2480,7 @@ considered as "newer" than the local ones.. even if there are
|
||||
identical! Unfortunately, there is no possibility to avoid this problem,
|
||||
which is strongly linked with the server abilities.
|
||||
|
||||
<p align=justify> <hr><h2> Questions concerning a mirror: </h2>
|
||||
<p align=justify> <hr><h2 id="questions-concerning-a-mirror"> Questions concerning a mirror: </h2>
|
||||
|
||||
<p align=justify> <p align=justify><b>Q: I want to mirror a Web site,
|
||||
but there are some files outside the domain, too. How to retrieve them?
|
||||
@@ -2693,25 +2664,14 @@ too many sessions, or your system may be unable to provide the necessary
|
||||
resources. Try redusing this number - for example using the -c2 options
|
||||
for only 2 simultaneous sesions.
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 2007 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
@@ -1,105 +1,61 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="description" content="HTTrack is an easy-to-use website mirror utility. It allows you to download a World Wide website from the Internet to a local directory,building recursively all structures, getting html, images, and other files from the server to your computer. Links are rebuiltrelatively so that you can freely browse to the local site (works with any browser). You can mirror several sites together so that you can jump from one toanother. You can, also, update an existing mirror site, or resume an interrupted download. The robot is fully configurable, with an integrated help" />
|
||||
<meta name="keywords" content="httrack, HTTRACK, HTTrack, winhttrack, WINHTTRACK, WinHTTrack, offline browser, web mirror utility, aspirateur web, surf offline, web capture, www mirror utility, browse offline, local site builder, website mirroring, aspirateur www, internet grabber, capture de site web, internet tool, hors connexion, unix, dos, windows 95, windows 98, solaris, ibm580, AIX 4.0, HTS, HTGet, web aspirator, web aspirateur, libre, GPL, GNU, free software" />
|
||||
<title>HTTrack Website Copier - Offline Browser</title>
|
||||
|
||||
<style type="text/css">
|
||||
<!--
|
||||
|
||||
body {
|
||||
margin: 0; padding: 0; margin-bottom: 15px; margin-top: 8px;
|
||||
background: #77b;
|
||||
}
|
||||
body, td {
|
||||
font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
#subTitle {
|
||||
background: #000; color: #fff; padding: 4px; font-weight: bold;
|
||||
}
|
||||
|
||||
#siteNavigation a, #siteNavigation .current {
|
||||
font-weight: bold; color: #448;
|
||||
}
|
||||
#siteNavigation a:link { text-decoration: none; }
|
||||
#siteNavigation a:visited { text-decoration: none; }
|
||||
|
||||
#siteNavigation .current { background-color: #ccd; }
|
||||
|
||||
#siteNavigation a:hover { text-decoration: none; background-color: #fff; color: #000; }
|
||||
#siteNavigation a:active { text-decoration: none; background-color: #ccc; }
|
||||
|
||||
|
||||
a:link { text-decoration: underline; color: #00f; }
|
||||
a:visited { text-decoration: underline; color: #000; }
|
||||
a:hover { text-decoration: underline; color: #c00; }
|
||||
a:active { text-decoration: underline; }
|
||||
|
||||
#pageContent {
|
||||
clear: both;
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
#pageContent, #siteNavigation {
|
||||
background-color: #ccd;
|
||||
}
|
||||
|
||||
|
||||
.imgLeft { float: left; margin-right: 10px; margin-bottom: 10px; }
|
||||
.imgRight { float: right; margin-left: 10px; margin-bottom: 10px; }
|
||||
|
||||
hr { height: 1px; color: #000; background-color: #000; margin-bottom: 15px; }
|
||||
|
||||
h1 { margin: 0; font-weight: bold; font-size: 2em; }
|
||||
h2 { margin: 0; font-weight: bold; font-size: 1.6em; }
|
||||
h3 { margin: 0; font-weight: bold; font-size: 1.3em; }
|
||||
h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
.blak { background-color: #000; }
|
||||
.hide { display: none; }
|
||||
.tableWidth { min-width: 400px; }
|
||||
|
||||
.tblRegular { border-collapse: collapse; }
|
||||
.tblRegular td { padding: 6px; background-image: url(fade.gif); border: 2px solid #99c; }
|
||||
.tblHeaderColor, .tblHeaderColor td { background: #99c; }
|
||||
.tblNoBorder td { border: 0; }
|
||||
|
||||
|
||||
// -->
|
||||
</style>
|
||||
|
||||
<!-- doc-chrome:head -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="HTTrack filter syntax: wildcards, and the size and MIME-type forms of a scan rule.">
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<!-- /doc-chrome:head -->
|
||||
<title>HTTrack filter syntax</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr>
|
||||
<td><img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier" title="" border="0" id="title" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="3" class="tableWidth">
|
||||
<tr>
|
||||
<td id="subTitle">Open Source offline browser</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="76%" border="0" align="center" cellspacing="0" cellpadding="0" class="tableWidth">
|
||||
<tr class="blak">
|
||||
<td>
|
||||
<table width="100%" border="0" align="center" cellspacing="1" cellpadding="0">
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table width="100%" border="0" align="center" cellspacing="0" cellpadding="10">
|
||||
<tr>
|
||||
<td id="pageContent">
|
||||
<!-- ==================== End prologue ==================== -->
|
||||
<!-- doc-chrome:top -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<h2 align="center"><em>Filters: Advanced</em></h2>
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Documentation">
|
||||
<h2>Start here</h2>
|
||||
<ul>
|
||||
<li><a href="guide.html">Interface guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="abuse.html">Using HTTrack responsibly</a></li>
|
||||
</ul>
|
||||
<h2>Command line</h2>
|
||||
<ul>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="httrack.man.html">Option reference</a></li>
|
||||
<li><a href="filters.html" aria-current="page" class="here">Filter syntax</a></li>
|
||||
</ul>
|
||||
<h2>Developers</h2>
|
||||
<ul>
|
||||
<li><a href="dev.html">Programming</a></li>
|
||||
<li><a href="library.html">libhttrack API</a></li>
|
||||
<li><a href="plug.html">Callbacks</a></li>
|
||||
<li><a href="scripting.html">Scripting</a></li>
|
||||
<li><a href="cache.html">Cache format</a></li>
|
||||
<li><a href="changes.html">Change report format</a></li>
|
||||
</ul>
|
||||
<h2>More</h2>
|
||||
<ul>
|
||||
<li><a href="fcguide.html">Users Guide (3.10)</a></li>
|
||||
<li><a href="contact.html">Contact and credits</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
<!-- /doc-chrome:top -->
|
||||
|
||||
<h1>Filters: Advanced</h1>
|
||||
|
||||
<br>
|
||||
|
||||
@@ -152,7 +108,7 @@ See also: The <a href="faq.html#VF1">FAQ</a><br>
|
||||
|
||||
<br>
|
||||
|
||||
Important notice: size scan rules are checked <font color=red><b>after</b></font> the link was scheduled for download,
|
||||
Important notice: size scan rules are checked <b>after</b> the link was scheduled for download,
|
||||
allowing to abort the connection.
|
||||
|
||||
|
||||
@@ -174,7 +130,7 @@ See also: The <a href="faq.html#VF1">FAQ</a><br>
|
||||
-mime:image/gif
|
||||
<br>
|
||||
|
||||
Important notice: MIME types scan rules are <font color=red><b>only</b></font> checked against links that were
|
||||
Important notice: MIME types scan rules are <b>only</b> checked against links that were
|
||||
scheduled for download, i.e. links <b>already authorized</b> by url scan rules.
|
||||
Hence, using '+mime:image/gif' will only be a hint to accept images that were already authorized,
|
||||
if previous MIME scan rules excluded them - such as in '-mime:*/* +mime:text/html +mime:image/gif'
|
||||
@@ -182,7 +138,7 @@ See also: The <a href="faq.html#VF1">FAQ</a><br>
|
||||
<br>
|
||||
|
||||
<br>
|
||||
<h3>Scan rules patterns:</h3>
|
||||
<h3 id="scan-rules-patterns">Scan rules patterns:</h3>
|
||||
|
||||
<p>
|
||||
<h4>1.a. Scan rules based on URL or extension</h4>
|
||||
@@ -455,25 +411,14 @@ See also: The <a href="faq.html#VF1">FAQ</a><br>
|
||||
|
||||
<br>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- doc-chrome:bottom -->
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
<dialog id="zoom" aria-label="Enlarged image"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- /doc-chrome:bottom -->
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
149
html/guide.css
Normal file
@@ -0,0 +1,149 @@
|
||||
/* Styles specific to guide.html: the platform switcher, the option tab strip and
|
||||
the option entries. The shared page chrome is in doc.css, loaded first. */
|
||||
|
||||
/* Anchor targets must clear the sticky tab strip. */
|
||||
h2, h3, section.tab { scroll-margin-top: 5.5rem; }
|
||||
|
||||
.cli {
|
||||
font-family: ui-monospace, "Cascadia Mono", Consolas, "DejaVu Sans Mono", monospace;
|
||||
font-size: .9em;
|
||||
}
|
||||
|
||||
/* ---- platform switcher ---- */
|
||||
|
||||
.platforms {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: .3rem;
|
||||
margin: 0 0 1.5rem;
|
||||
padding: .3rem;
|
||||
background: var(--chip);
|
||||
border-radius: .5rem;
|
||||
}
|
||||
|
||||
.platforms button {
|
||||
flex: 1 1 8rem;
|
||||
padding: .5rem .7rem;
|
||||
border: 0;
|
||||
border-radius: .35rem;
|
||||
background: transparent;
|
||||
color: var(--ink);
|
||||
font: inherit;
|
||||
font-size: .95em;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.platforms button:hover { background: var(--accent); }
|
||||
|
||||
.platforms button[aria-pressed="true"] {
|
||||
background: var(--panel);
|
||||
box-shadow: 0 1px 3px var(--shadow);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.platforms button small { display: block; font-weight: normal; color: var(--ink-soft); font-size: .82em; }
|
||||
|
||||
/* Hide only what the chosen platform excludes: an "unhide" rule would need to
|
||||
outweigh the hiding one, and loses on specificity. Without scripting no
|
||||
platform is set, so every variant stays visible. */
|
||||
html[data-platform="win"] [data-for]:not([data-for~="win"]),
|
||||
html[data-platform="web"] [data-for]:not([data-for~="web"]),
|
||||
html[data-platform="droid"] [data-for]:not([data-for~="droid"]) { display: none; }
|
||||
|
||||
/* ---- platform badges ---- */
|
||||
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: .05em .5em;
|
||||
border-radius: 1em;
|
||||
background: var(--accent);
|
||||
color: var(--ink);
|
||||
font-size: .78em;
|
||||
font-weight: bold;
|
||||
vertical-align: .1em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* ---- screenshots ---- */
|
||||
|
||||
figure img[data-for~="droid"] { max-width: 18rem; }
|
||||
|
||||
/* ---- option tab strip ---- */
|
||||
|
||||
.tabstrip {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: .2rem;
|
||||
margin: 0 0 1.5rem;
|
||||
padding: .4rem;
|
||||
background: var(--chip);
|
||||
border-radius: .4rem;
|
||||
box-shadow: 0 2px 6px var(--shadow);
|
||||
}
|
||||
|
||||
.tabstrip a {
|
||||
padding: .3rem .6rem;
|
||||
border-radius: .25rem;
|
||||
text-decoration: none;
|
||||
color: var(--ink);
|
||||
font-size: .9em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.tabstrip a:hover { background: var(--accent); }
|
||||
.tabstrip a[aria-current="true"] { background: var(--panel); font-weight: bold; box-shadow: 0 1px 3px var(--shadow); }
|
||||
|
||||
/* ---- option entries ---- */
|
||||
|
||||
.opt {
|
||||
margin: 0 0 1.2em;
|
||||
padding-bottom: 1.2em;
|
||||
border-bottom: 1px solid var(--rule);
|
||||
}
|
||||
|
||||
.opt:last-child { border-bottom: 0; }
|
||||
|
||||
.opt-head {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: .5rem;
|
||||
align-items: baseline;
|
||||
justify-content: space-between;
|
||||
margin-bottom: .3em;
|
||||
}
|
||||
|
||||
.opt-name { font-weight: bold; }
|
||||
|
||||
.opt .cli {
|
||||
background: var(--code-bg);
|
||||
padding: .1em .45em;
|
||||
border-radius: 3px;
|
||||
color: var(--ink-soft);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.opt p { margin: 0 0 .5em; font-size: .95em; }
|
||||
.opt p:last-child { margin-bottom: 0; }
|
||||
|
||||
.opt[hidden] { display: none; }
|
||||
|
||||
/* ---- misc ---- */
|
||||
|
||||
table.mime {
|
||||
border-collapse: collapse;
|
||||
margin: 0 0 1em;
|
||||
font-size: .92em;
|
||||
}
|
||||
|
||||
table.mime td {
|
||||
border: 1px solid var(--rule);
|
||||
padding: .3em .6em;
|
||||
}
|
||||
|
||||
@media print {
|
||||
.tabstrip, .platforms { display: none; }
|
||||
html[data-platform] [data-for] { display: revert !important; }
|
||||
}
|
||||
916
html/guide.html
Normal file
@@ -0,0 +1,916 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="How to mirror a website with the HTTrack graphical interface: a step-by-step walkthrough and a full option reference for WinHTTrack on Windows, WebHTTrack on Linux and Unix, and HTTrack for Android.">
|
||||
<meta name="keywords" content="httrack, WinHTTrack, WebHTTrack, HTTrack Android, offline browser, website mirroring, web mirror utility, options, scan rules, filters">
|
||||
<title>The HTTrack interface, step by step</title>
|
||||
<link rel="stylesheet" href="doc.css">
|
||||
<link rel="stylesheet" href="guide.css">
|
||||
<script src="doc.js" defer></script>
|
||||
<script src="guide.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/header_title_4.gif" width="400" height="34" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Open Source offline browser</div>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
<nav class="toc" aria-label="Contents">
|
||||
<h2>Walkthrough</h2>
|
||||
<ol>
|
||||
<li><a href="#before">Before you start</a></li>
|
||||
<li><a href="#step-start">1. Open HTTrack</a></li>
|
||||
<li><a href="#step-project">2. Name the project</a></li>
|
||||
<li><a href="#step-address">3. Enter the addresses</a></li>
|
||||
<li><a href="#step-ready">4. Last checks</a></li>
|
||||
<li><a href="#step-run">5. Watch it run</a></li>
|
||||
<li><a href="#step-done">6. Read the result</a></li>
|
||||
</ol>
|
||||
<h2>Options</h2>
|
||||
<ol>
|
||||
<li><a href="#opt-scan-rules">Scan Rules</a></li>
|
||||
<li><a href="#opt-limits">Limits</a></li>
|
||||
<li><a href="#opt-flow-control">Flow Control</a></li>
|
||||
<li><a href="#opt-links">Links</a></li>
|
||||
<li><a href="#opt-build">Build</a></li>
|
||||
<li><a href="#opt-browser-id">Browser ID</a></li>
|
||||
<li><a href="#opt-spider">Spider</a></li>
|
||||
<li><a href="#opt-proxy">Proxy</a></li>
|
||||
<li><a href="#opt-log-index-cache">Log, Index, Cache</a></li>
|
||||
<li><a href="#opt-mime-types">MIME Types</a></li>
|
||||
<li><a href="#opt-experts-only">Experts Only</a></li>
|
||||
</ol>
|
||||
<h2>Elsewhere</h2>
|
||||
<ol>
|
||||
<li><a href="filters.html">Filter syntax</a></li>
|
||||
<li><a href="cmdguide.html">Command-line guide</a></li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a></li>
|
||||
<li><a href="index.html">All documentation</a></li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<main id="main">
|
||||
|
||||
<h1>The HTTrack interface, step by step</h1>
|
||||
|
||||
<p class="lede">HTTrack copies a website to your disk so you can read it offline. The same
|
||||
engine ships behind three interfaces, and this page covers all three: pick yours below and
|
||||
the screenshots and notes follow along.</p>
|
||||
|
||||
<div class="platforms" role="group" aria-label="Choose your version">
|
||||
<button type="button" data-platform="win" aria-pressed="false">WinHTTrack <small>Windows</small></button>
|
||||
<button type="button" data-platform="web" aria-pressed="false">WebHTTrack <small>Linux, macOS and Unix</small></button>
|
||||
<button type="button" data-platform="droid" aria-pressed="false">HTTrack <small>Android</small></button>
|
||||
</div>
|
||||
|
||||
<h2 id="before">Before you start</h2>
|
||||
|
||||
<p>The three versions differ in their chrome, not in what they do. Every option below means
|
||||
the same thing in each of them, and all three write the same profile format. Where a version
|
||||
genuinely lacks something, it is marked <span class="badge">not on Android</span> or
|
||||
similar.</p>
|
||||
|
||||
<p data-for="web">WebHTTrack runs as a small local web server and opens in your usual browser.
|
||||
Nothing is uploaded anywhere; the pages you see come from your own machine. Do leave the window
|
||||
open while a mirror runs: the interface pings the server every 30 seconds, and the server shuts
|
||||
itself down once those pings stop.</p>
|
||||
|
||||
<p data-for="droid">The Android app needs Android 7.0 or later and is on
|
||||
<a href="https://play.google.com/store/apps/details?id=com.httrack.android">Google Play</a>.</p>
|
||||
|
||||
<p>Each option also lists its command-line equivalent, so anything you set here can later be
|
||||
scripted. The <a href="cmdguide.html">command-line guide</a> covers that side.</p>
|
||||
|
||||
<div class="note" data-for="droid">
|
||||
<p><b>First launch.</b> Android asks for permission to store mirrors on your device. Without
|
||||
it the app cannot save anything, so tap <b>Allow</b>.</p>
|
||||
<figure>
|
||||
<img data-for="droid" src="img/guide-droid-permission.png" alt="Android storage permission dialog" width="600" height="1300">
|
||||
</figure>
|
||||
<p>If an older release left mirrors behind, a second prompt offers to bring them in. Tap
|
||||
<b>Import</b> to move them, or <b>Not now</b>.</p>
|
||||
<figure>
|
||||
<img data-for="droid" src="img/guide-droid-legacy-import.png" alt="Prompt offering to import mirrors from an older version" width="600" height="1300">
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
<div class="note" data-for="win">
|
||||
<p><b>First launch.</b> WinHTTrack opens on its About box, which carries a <b>Language
|
||||
preference</b> dropdown at the foot. The choice is remembered, and
|
||||
<b>Preferences > Language preference...</b> changes it later.</p>
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-language.png" alt="WinHTTrack About box with the language preference dropdown" width="369" height="371">
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
<h2 id="step-start">1. Open HTTrack</h2>
|
||||
|
||||
<p>The welcome screen has nothing to fill in. <span data-for="win web">Click <b>Next</b></span><span
|
||||
data-for="droid">Tap <b>Next</b></span> to create a project, or open one you already made.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-start.png" alt="WinHTTrack welcome pane" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-start.png" alt="WebHTTrack welcome page" width="1024" height="388">
|
||||
<img data-for="droid" src="img/guide-droid-start.png" alt="HTTrack for Android welcome screen" width="600" height="1300">
|
||||
<figcaption>The welcome screen.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p class="note" data-for="web">The language dropdown starts blank on purpose: its first entry
|
||||
means "leave the interface as it is". Pick a language only if you want to change it.</p>
|
||||
|
||||
<p class="note" data-for="web">On macOS, <code>brew install httrack</code> installs WebHTTrack
|
||||
alongside the command line tool. Open <b>HTTrack.app</b> if you have it, or run
|
||||
<code>webhttrack</code> in a terminal; either way the interface opens in your browser and
|
||||
behaves exactly as described here.</p>
|
||||
|
||||
<h2 id="step-project">2. Name the project</h2>
|
||||
|
||||
<p>A project is one mirror: its name becomes the folder your files land in, so give it something
|
||||
you will recognise in a year. The <b>category</b> is optional and only groups related projects
|
||||
together in the list.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-project-name.png" alt="WinHTTrack project name, category and base path" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-project-name.png" alt="WebHTTrack project name, category and base path" width="1024" height="346">
|
||||
<img data-for="droid" src="img/guide-droid-project-name.png" alt="Android project name, category and base path" width="600" height="1300">
|
||||
<figcaption>Project name, category, and where the files go.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p data-for="win web"><b>Base path</b> is the folder holding all your mirrors. Keeping every project
|
||||
under one folder is worth doing, if only so an update finds the previous copy. To reopen or update
|
||||
an existing project, pick its name from the list instead of typing a new one.</p>
|
||||
|
||||
<p data-for="droid">The base path is fixed inside the app's storage and cannot be changed. To update
|
||||
an existing project, pick its name from the list instead of typing a new one.</p>
|
||||
|
||||
<h2 id="step-address">3. Enter the addresses</h2>
|
||||
|
||||
<p>Type the address you want to copy. Several addresses, one per line, are mirrored together and
|
||||
keep their links to each other.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-project-setup.png" alt="WinHTTrack action and web addresses" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-project-setup.png" alt="WebHTTrack action and web addresses" width="1024" height="496">
|
||||
<img data-for="droid" src="img/guide-droid-project-setup.png" alt="Android web address and action" width="600" height="1300">
|
||||
<figcaption>The addresses to copy, and what to do with them.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p><b>Action</b> decides what the engine does with them:</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Download web site(s)</span><span class="cli">-w, --mirror</span></div>
|
||||
<p>The normal choice. Copies the sites with the current options.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Download web site(s) + questions</span><span class="cli">-W, --mirror-wizard</span></div>
|
||||
<p>The same, but asks before following anything it is unsure about.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Get individual files</span><span class="cli">-g, --get-files</span></div>
|
||||
<p>Downloads exactly the addresses you listed and follows nothing. Use it to grab a handful of
|
||||
files rather than a site.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Download all sites in pages</span><span class="cli">-Y, --mirrorlinks</span></div>
|
||||
<p>Mirrors every site linked from the pages you listed. Pointed at a bookmarks file, it copies
|
||||
everything you bookmarked.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Test links in pages</span><span class="cli">--testlinks</span></div>
|
||||
<p>Checks that the links resolve without saving anything. Useful against a bookmarks file.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Continue interrupted download</span><span class="cli">--continue</span></div>
|
||||
<p>Picks a crashed or cancelled mirror back up where it stopped. Offered only when the project
|
||||
already exists.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Update existing download</span><span class="cli">--update</span></div>
|
||||
<p>Re-checks the whole site and fetches only what changed. Offered only when the project already
|
||||
exists, and it needs the cache from the previous run, which is why
|
||||
<a href="#opt-experts-only">Use a cache for updates</a> should stay on.</p>
|
||||
</div>
|
||||
|
||||
<p data-for="win web">The <b>Add a URL</b> button takes one address at a time, and does two
|
||||
things the address box cannot. It attaches a login and password to that one address, for a
|
||||
page behind basic authentication. And it captures an address out of your browser, for a page
|
||||
you can only reach by submitting a form or following a script: HTTrack listens on a local
|
||||
port, you point your browser at it as a proxy and click the link or the submit button as
|
||||
usual, and the address the browser asks for is added to the project.</p>
|
||||
|
||||
<figure data-for="web">
|
||||
<img data-for="web" src="img/guide-web-add-url.png" alt="WebHTTrack add-a-URL dialog" width="1024" height="634">
|
||||
<figcaption>Adding a single address, with an optional login.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p>Everything else lives behind <b>Set options</b>, described in
|
||||
<a href="#options">the option panel</a> below. The defaults are sane; a first mirror needs nothing
|
||||
from there except, quite often, a <a href="#opt-scan-rules">scan rule</a>.</p>
|
||||
|
||||
<figure data-for="droid">
|
||||
<img data-for="droid" src="img/guide-droid-options-menu.png" alt="Android options tab list" width="600" height="1300">
|
||||
<figcaption>On Android the option tabs are a list.</figcaption>
|
||||
</figure>
|
||||
|
||||
<h2 id="step-ready">4. Last checks</h2>
|
||||
|
||||
<p data-for="win">One pane stands between you and the mirror. It can dial a connection first,
|
||||
hang up when the mirror ends, shut the machine down afterwards, or hold the whole thing for up to
|
||||
24 hours. Leave it alone if you are already online and want to start now, and click
|
||||
<b>Finish</b>.</p>
|
||||
|
||||
<p data-for="web">One page stands between you and the mirror. <b>Start</b> begins it;
|
||||
the save-only choice writes the project settings and stops, which is handy when you are preparing
|
||||
a mirror to run later.</p>
|
||||
|
||||
<p data-for="droid">Android has no such screen: <b>Start</b> on the address screen begins the
|
||||
mirror straight away.</p>
|
||||
|
||||
<figure data-for="win web">
|
||||
<img data-for="win" src="img/guide-win-ready.png" alt="WinHTTrack connection settings before starting" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-ready.png" alt="WebHTTrack ready to start" width="1024" height="508">
|
||||
<figcaption>The last screen before the mirror runs.</figcaption>
|
||||
</figure>
|
||||
|
||||
<h2 id="step-run">5. Watch it run</h2>
|
||||
|
||||
<p>The engine reports what it is doing: bytes written, links scanned, transfer rate, errors so
|
||||
far, and one line per transfer in flight. A mirror of any size takes a while. That is the
|
||||
server's pace as much as yours, and the <a href="#opt-limits">Limits</a> options exist to keep it
|
||||
polite.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-progress.png" alt="WinHTTrack mirror in progress" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-progress.png" alt="WebHTTrack mirror in progress" width="1024" height="742">
|
||||
<img data-for="droid" src="img/guide-droid-progress.png" alt="Android mirror in progress" width="600" height="1300">
|
||||
<figcaption>A crawl in flight.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p data-for="win web">You can stop at any point without losing what has been written, and a
|
||||
stopped mirror resumes later with <b>Continue interrupted download</b>. Individual transfers can
|
||||
be cancelled too, which is the quick way past one enormous file. Several options (the number of
|
||||
connections, the limits) can be changed while the mirror runs.</p>
|
||||
|
||||
<p data-for="droid">Tap <b>Abort</b> to stop. Nothing already written is lost, and the mirror
|
||||
resumes later with <b>Continue interrupted download</b>.</p>
|
||||
|
||||
<h2 id="step-done">6. Read the result</h2>
|
||||
|
||||
<p>When the crawl ends, open the copy and read it as you would the real site. Links between
|
||||
mirrored pages are rewritten to point at each other, so it browses offline in any browser.</p>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-finished.png" alt="WinHTTrack mirror complete" width="1040" height="744">
|
||||
<img data-for="web" src="img/guide-web-finished.png" alt="WebHTTrack mirror complete" width="1024" height="487">
|
||||
<img data-for="droid" src="img/guide-droid-finished.png" alt="Android mirror complete" width="600" height="1300">
|
||||
<figcaption>Done.</figcaption>
|
||||
</figure>
|
||||
|
||||
<p>Read the log before you trust a mirror. It records every error, and a site that looks complete
|
||||
can still be missing images that a <a href="#opt-scan-rules">scan rule</a> would have caught. If
|
||||
something is missing, the <a href="faq.html">FAQ and troubleshooting</a> page starts with the
|
||||
usual causes.</p>
|
||||
|
||||
<p data-for="win web">The files sit under the base path you chose, in a folder named after the
|
||||
project. Opening <code>index.html</code> there browses the mirror without HTTrack.</p>
|
||||
|
||||
<p data-for="droid">Mirrors are written to
|
||||
<code>/storage/emulated/0/HTTrack/Websites</code>, in a folder named after the project. That is
|
||||
shared storage, so a file manager or a USB cable can reach it, and opening
|
||||
<code>index.html</code> there browses the mirror without the app.</p>
|
||||
|
||||
<h2 id="options">The option panel</h2>
|
||||
|
||||
<p>Eleven tabs, and you can ignore almost all of them. The defaults mirror a site correctly; the
|
||||
options are there for the sites that need persuading. Each entry below names the setting as the
|
||||
interface shows it, and the command-line option it corresponds to.</p>
|
||||
|
||||
<nav class="tabstrip" aria-label="Option tabs">
|
||||
<a href="#opt-scan-rules">Scan Rules</a>
|
||||
<a href="#opt-limits">Limits</a>
|
||||
<a href="#opt-flow-control">Flow Control</a>
|
||||
<a href="#opt-links">Links</a>
|
||||
<a href="#opt-build">Build</a>
|
||||
<a href="#opt-browser-id">Browser ID</a>
|
||||
<a href="#opt-spider">Spider</a>
|
||||
<a href="#opt-proxy">Proxy</a>
|
||||
<a href="#opt-log-index-cache">Log, Index, Cache</a>
|
||||
<a href="#opt-mime-types">MIME Types</a>
|
||||
<a href="#opt-experts-only">Experts Only</a>
|
||||
</nav>
|
||||
|
||||
<div class="filter">
|
||||
<label for="optfilter">Find an option</label>
|
||||
<input type="search" id="optfilter" placeholder="cookies, depth, footer…" autocomplete="off">
|
||||
<output id="optcount" for="optfilter"></output>
|
||||
</div>
|
||||
|
||||
<section class="tab" id="opt-scan-rules">
|
||||
<h3>Scan Rules</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-scan-rules.png" alt="WinHTTrack Scan Rules tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-scan-rules.png" alt="WebHTTrack Scan Rules tab" width="1024" height="995">
|
||||
<img data-for="droid" src="img/guide-droid-opt-scan-rules.png" alt="Android Scan Rules tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>The most useful tab in the panel, and the answer to most "why is this missing?" questions. A
|
||||
scan rule accepts or refuses addresses by pattern: a whole directory, a domain, a file type. When
|
||||
a mirror comes back without its images because they live on another host, this is where you let
|
||||
them in.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Include link(s)</span><span class="cli">+pattern</span></div>
|
||||
<p>Accept addresses matching the pattern, even ones the engine would otherwise leave alone.
|
||||
<code>+*.example.com/*.jpg</code> takes the JPEGs from a neighbouring host;
|
||||
<code>+*/images/landscapes/*</code> takes one directory wherever it appears.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Exclude link(s)</span><span class="cli">-pattern</span></div>
|
||||
<p>Refuse addresses matching the pattern. <code>-*.zip</code> skips the archives,
|
||||
<code>-*/forum/*</code> skips a section you do not want.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Rule list from a file</span><span class="cli">-%S, --urllist <file></span></div>
|
||||
<p>Reads rules from a text file, one per line, instead of the box.</p>
|
||||
</div>
|
||||
|
||||
<p>Rules are read in order and the last match wins, so a broad exclusion followed by a narrow
|
||||
inclusion does what it looks like. The full pattern syntax, including size and MIME conditions,
|
||||
is on the <a href="filters.html">filter page</a>.</p>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-limits">
|
||||
<h3>Limits</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-limits.png" alt="WinHTTrack Limits tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-limits.png" alt="WebHTTrack Limits tab" width="1024" height="1016">
|
||||
<img data-for="droid" src="img/guide-droid-opt-limits.png" alt="Android Limits tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>Ceilings on how much the mirror may cost you, and cost the server. The two rate limits at the
|
||||
bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Maximum mirroring depth</span><span class="cli">-rN, --depth N</span></div>
|
||||
<p>How many clicks from your starting addresses the engine may travel. A depth of 3 means the
|
||||
pages you listed, plus everything within two more clicks. Left empty it is effectively
|
||||
unlimited, which is usually right: the engine already refuses to leave the site.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Maximum external depth</span><span class="cli">-%eN, --ext-depth N</span></div>
|
||||
<p>How far to follow links off the site, past what the scan rules allow. It overrides the other
|
||||
limits, so raise it with care. The default is zero.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Max size of any non-HTML file</span><span class="cli">-mN, --max-files N</span></div>
|
||||
<p>Per-file ceiling in bytes: a larger image or archive is skipped.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Max size of any HTML file</span><span class="cli">-mN,N2, --max-files</span></div>
|
||||
<p>The same for pages. One command-line option carries both ceilings, non-HTML first.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Site size limit</span><span class="cli">-MN, --max-size N</span></div>
|
||||
<p>Total bytes the mirror may download before it stops.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Pause after downloading</span><span class="cli">-GN, --max-pause N</span></div>
|
||||
<p>Pauses once that many bytes have arrived and waits for you to delete a lock file. The way to
|
||||
mirror a site larger than your free space: back up and clear the files during the pause.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Pause between files</span><span class="cli">-%G, --pause MIN[:MAX]</span></div>
|
||||
<p>Waits a random number of seconds between downloads. <code>2:8</code> picks a fresh delay in
|
||||
that range each time. The gentlest way to crawl a small server, and less blunt than capping the
|
||||
rate.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Max time overall</span><span class="cli">-EN, --max-time N</span></div>
|
||||
<p>Seconds the whole mirror may take. 3600 is an hour.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Max transfer rate</span><span class="cli">-AN, --max-rate N</span></div>
|
||||
<p>Bytes per second, across the whole mirror. Keeps HTTrack from taking the whole line.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Max connections / seconds</span><span class="cli">-%cN, --connection-per-second N</span></div>
|
||||
<p>New connections per second, and the politest thing on this page. Fractions are allowed:
|
||||
<code>0.1</code> is one connection every ten seconds. Setting it to zero removes the limit and
|
||||
can flatten a small server; do not, unless the server is yours.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Maximum number of links</span><span class="cli">-#LN, --advanced-maxlinks N</span></div>
|
||||
<p>How many addresses may be held in memory, downloaded or not. The engine stops dead on
|
||||
reaching it, so do not set it low. The default of 100,000 suits most sites and costs memory to
|
||||
raise.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-flow-control">
|
||||
<h3>Flow Control</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-flow-control.png" alt="WinHTTrack Flow Control tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-flow-control.png" alt="WebHTTrack Flow Control tab" width="1024" height="910">
|
||||
<img data-for="droid" src="img/guide-droid-opt-flow-control.png" alt="Android Flow Control tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>How hard to push, and when to give up on a server that is not answering.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Number of connections</span><span class="cli">-cN, --sockets N</span></div>
|
||||
<p>Transfers running at once. Four is the default and eight is comfortable on an ordinary site;
|
||||
drop to one or two when the files are large, since parallel transfers of big files help nobody.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Timeout</span><span class="cli">-TN, --timeout N</span></div>
|
||||
<p>Seconds to wait on a silent server before abandoning the link. It also bounds host name
|
||||
resolution. Around 120 suits most connections.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Retries</span><span class="cli">-RN, --retries N</span></div>
|
||||
<p>How many times to retry after a timeout or another non-fatal error. It will not rescue a
|
||||
404: nothing retries a definite answer.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Min transfer rate</span><span class="cli">-JN, --min-rate N</span></div>
|
||||
<p>Bytes per second below which a transfer is treated as stalled and dropped.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Abandon host on timeout or slow transfer</span><span class="cli">-HN, --host-control N</span></div>
|
||||
<p>Whether one bad transfer condemns the whole host: never (0), on timeout (1), on a slow
|
||||
transfer (2), or either (3). The checkboxes beside the timeout and rate fields set this. Anything
|
||||
but <em>never</em> can drop a lot of links over one slow moment, so leave it off unless a host is
|
||||
actively wasting your time.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-links">
|
||||
<h3>Links</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-links.png" alt="WinHTTrack Links tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-links.png" alt="WebHTTrack Links tab" width="1024" height="781">
|
||||
<img data-for="droid" src="img/guide-droid-opt-links.png" alt="Android Links tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>What counts as a link worth following.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Attempt to detect all links</span><span class="cli">-%P, --extended-parsing</span></div>
|
||||
<p>Looks for addresses everywhere, including unknown tags and JavaScript. On by default. It
|
||||
earns its keep on script-heavy pages, at the price of the occasional request for something that
|
||||
was never a link.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Get non-HTML files related to a link</span><span class="cli">-n, --near</span></div>
|
||||
<p>Fetches the images and other files a page refers to even when they sit outside the mirror.
|
||||
The usual fix for a page whose pictures live on another host.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Test validity of all links</span><span class="cli">-t, --test</span></div>
|
||||
<p>Requests every link found, including ones the rules forbid, and logs the failures. A link
|
||||
checker rather than a mirroring option.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Get HTML files first</span><span class="cli">-p7, --priority 7</span></div>
|
||||
<p>Takes the pages before the images. The structure of the site is known sooner, which makes the
|
||||
rest of the crawl better informed.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-build">
|
||||
<h3>Build</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-build.png" alt="WinHTTrack Build tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-build.png" alt="WebHTTrack Build tab" width="1024" height="986">
|
||||
<img data-for="droid" src="img/guide-droid-opt-build.png" alt="Android Build tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>How the copy is laid out on disk.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Local structure type</span><span class="cli">-NN, --structure N</span></div>
|
||||
<p>The default reproduces the site's own folders and names. The alternatives sort files by kind
|
||||
instead: all the pages here, all the images there. A custom pattern such as
|
||||
<code>-N "%h%p/%n%q.%t"</code> builds names from the host, path, name, query and type.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">DOS names (8+3)</span><span class="cli">-L0, --long-names 0</span></div>
|
||||
<p>Cuts every name to eight characters and a three-letter extension.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">ISO9660 names (CDROM)</span><span class="cli">-L2, --long-names 2</span></div>
|
||||
<p>Names that survive being burned to a CD or DVD.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">No error pages</span><span class="cli">-o0, --do-not-generate-errors</span></div>
|
||||
<p>By default a page that returned 404 is saved as a note saying so. This drops those, leaving
|
||||
nothing at all where the page was.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">No external pages</span><span class="cli">-x, --replace-external</span></div>
|
||||
<p>Replaces links that leave the mirror with a page saying you need to be online. Keeps the
|
||||
offline copy from silently reaching for the network.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Hide passwords</span><span class="cli">-%x, --disable-passwords</span></div>
|
||||
<p>Strips credentials out of the links written into the saved pages, so the copy cannot leak
|
||||
them.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Hide query strings</span><span class="cli">-%q0, --include-query-string 0</span></div>
|
||||
<p>Local files rarely need the <code>?a=1&b=2</code> part, though it can carry a hint about
|
||||
what a page was. Some limited browsers choke on it.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Do not purge old files</span><span class="cli">-X0, --purge-old 0</span></div>
|
||||
<p>After an update HTTrack deletes local files that are gone from the site or now excluded. This
|
||||
keeps them.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Inline assets as data: URIs</span><span class="cli">-%Z, --single-file</span></div>
|
||||
<p>Rewrites each saved page with its stylesheets, scripts, images and fonts embedded, so a single
|
||||
file opens anywhere on its own. Links between mirrored pages stay relative; audio and video stay
|
||||
links. <code>--single-file-max-size</code> caps each embedded asset, 10 MB by default.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-browser-id">
|
||||
<h3>Browser ID</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-browser-id.png" alt="WinHTTrack Browser ID tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-browser-id.png" alt="WebHTTrack Browser ID tab" width="1024" height="706">
|
||||
<img data-for="droid" src="img/guide-droid-opt-browser-id.png" alt="Android Browser ID tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>What HTTrack says about itself in its requests.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Browser identity</span><span class="cli">-F, --user-agent</span></div>
|
||||
<p>The <code>User-Agent</code> sent with every request. Some sites serve different pages, or
|
||||
refuse to serve at all, depending on what they read here.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">HTML footer</span><span class="cli">-%F, --footer</span></div>
|
||||
<p>A comment added to each saved page, recording where it came from. Named fields are
|
||||
substituted: <code>{url}</code>, <code>{date}</code>, <code>{addr}</code>, <code>{path}</code>,
|
||||
<code>{lastmodified}</code>, <code>{version}</code>, <code>{mime}</code>, <code>{charset}</code>,
|
||||
<code>{status}</code> and <code>{size}</code>. For example
|
||||
<code><!-- Mirrored from {url} on {date} --></code>. You can turn it off, but a page with no
|
||||
record of its origin is worth less later.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Preferred language</span><span class="cli">-%l, --language</span></div>
|
||||
<p>The <code>Accept-Language</code> header, as in <code>"fr, en, *"</code>. It decides which
|
||||
translation a multilingual site hands over.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Default referer</span><span class="cli">-%R, --referer</span></div>
|
||||
<p>The <code>Referer</code> sent with the first request. Occasionally needed by sites that refuse
|
||||
traffic arriving from nowhere.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-spider">
|
||||
<h3>Spider</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-spider.png" alt="WinHTTrack Spider tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-spider.png" alt="WebHTTrack Spider tab" width="1024" height="1557">
|
||||
<img data-for="droid" src="img/guide-droid-opt-spider.png" alt="Android Spider tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>How the engine behaves towards the server it is talking to.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Accept cookies</span><span class="cli">-bN, --cookies N</span></div>
|
||||
<p>On by default. Sites that hand out a session before showing anything need it.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Check document type</span><span class="cli">-uN, --check-type N</span></div>
|
||||
<p>When the address does not reveal the file type, say a <code>.cgi</code> that returns an image,
|
||||
the engine asks the server so the file gets a sensible name locally. Turning this off entirely
|
||||
produces a mirror full of files no browser will open.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Parse scripts</span><span class="cli">-jN, --parse-java N</span></div>
|
||||
<p>Reads scripts looking for addresses. On by default.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Follow robots.txt</span><span class="cli">-sN, --robots N</span></div>
|
||||
<p>Whether to respect the site's crawling rules: never (0), sometimes (1), always (2, the
|
||||
default), or always including the strict rules (3). Ignoring them on a site you do not own is
|
||||
how mirroring gets people blocked.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Update hacks</span><span class="cli">-%s, --updatehack</span></div>
|
||||
<p>Works around servers that misreport what changed, treating a file of identical size as
|
||||
unchanged even when the timestamp moved. Saves a great deal of traffic on dynamic sites, at a
|
||||
small risk of keeping a stale page.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Tolerant requests</span><span class="cli">-%B, --tolerant</span></div>
|
||||
<p>Accepts responses that break the rules. Off by default, because a server that lies about a
|
||||
file's length usually leaves you with a truncated one.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Force HTTP/1.0 requests</span><span class="cli">-%h, --http-10</span></div>
|
||||
<p>For servers and proxies too old to cope with anything newer. It costs you most of the update
|
||||
machinery, so use it only when a site genuinely fails without it.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">URL hacks</span><span class="cli">-%u, --urlhack</span></div>
|
||||
<p>Treats addresses that differ only cosmetically as the same page (<code>www.example.com</code>
|
||||
and <code>example.com</code>, doubled slashes, reordered query keys), so the same page is not
|
||||
downloaded twice.</p>
|
||||
<p>Three checkboxes opt out of one part each when a site really does treat the difference as
|
||||
meaningful: <b>Keep the www. prefix</b> (<code>--keep-www-prefix</code>), <b>Keep double
|
||||
slashes</b> (<code>--keep-double-slashes</code>) and <b>Keep the original query-string order</b>
|
||||
(<code>--keep-query-order</code>).</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Seed the crawl from the site's sitemap</span><span class="cli">-%m, --sitemap</span></div>
|
||||
<p>Reads the site's sitemap, the <code>Sitemap:</code> lines in <code>robots.txt</code> and then
|
||||
<code>/sitemap.xml</code>, and adds every address it lists as a starting point. It reaches pages
|
||||
no link on the site points to. <b>Sitemap address</b> (<code>--sitemap-url</code>) names one
|
||||
directly instead of probing.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Load cookies from file</span><span class="cli">-%K, --cookies-file</span></div>
|
||||
<p>Preloads cookies from a Netscape <code>cookies.txt</code> before the crawl starts. How you
|
||||
mirror something that needs you logged in, by exporting the session from your browser.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Strip query keys</span><span class="cli">-%g, --strip-query</span></div>
|
||||
<p>Comma-separated query keys to drop when naming saved files, such as
|
||||
<code>sid,utm_source</code>. Keeps one page from being saved several times under tracking
|
||||
parameters that change nothing.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-proxy">
|
||||
<h3>Proxy</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-proxy.png" alt="WinHTTrack Proxy tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-proxy.png" alt="WebHTTrack Proxy tab" width="1024" height="762">
|
||||
<img data-for="droid" src="img/guide-droid-opt-proxy.png" alt="Android Proxy tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Proxy type</span><span class="cli">-P scheme://…</span></div>
|
||||
<p>The proxy protocol. <b>HTTP</b> is an ordinary proxy. <b>HTTP (CONNECT tunnel)</b> sends every
|
||||
request through a CONNECT tunnel, which CONNECT-only proxies such as Tor's
|
||||
<code>HTTPTunnelPort</code> require. <b>SOCKS5</b> defaults to port 1080.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Proxy address and port</span><span class="cli">-P, --proxy</span></div>
|
||||
<p>The proxy to send requests through. On the command line one string carries the lot, including
|
||||
a scheme and credentials where needed:
|
||||
<code>--proxy socks5://user:pass@proxy.example.com:1080</code>.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Proxy login and password</span><span class="cli">-P user:pass@host:port</span></div>
|
||||
<p>Filled in behind the <b>Configure</b> button, for a proxy that demands authentication.</p>
|
||||
<p><span class="badge">not on Android</span> The Android app takes a host and a port only.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Use proxy for FTP transfers</span><span class="cli">-%f, --httpproxy-ftp</span></div>
|
||||
<p>Sends <code>ftp://</code> transfers through the HTTP proxy as well. On by default, and worth
|
||||
keeping: it gets FTP links through a firewall, and proxied FTP tends to be more reliable than the
|
||||
engine's own client.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-log-index-cache">
|
||||
<h3>Log, Index, Cache</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-log-index-cache.png" alt="WinHTTrack Log, Index, Cache tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-log-index-cache.png" alt="WebHTTrack Log, Index, Cache tab" width="1024" height="1278">
|
||||
<img data-for="droid" src="img/guide-droid-opt-log-index-cache.png" alt="Android Log, Index, Cache tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Store all files in cache</span><span class="cli">-k, --store-all-in-cache</span></div>
|
||||
<p>Normally only pages are cached, since that is all an update needs. This caches everything,
|
||||
which lets you rebuild the mirror in a different layout later without downloading it again, and
|
||||
makes the cache as large as the mirror.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Do not re-download locally erased files</span><span class="cli">-%n, --do-not-recatch</span></div>
|
||||
<p>A file you deleted stays deleted through the next update, instead of coming straight back.
|
||||
Useful while pruning something large by hand.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Create log files</span><span class="cli">-f, --file-log</span></div>
|
||||
<p>On, and worth leaving on: without a log you have no way to find out what failed. The
|
||||
debug level beside it controls how much detail lands there.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Make an index</span><span class="cli">-I, --index</span></div>
|
||||
<p>Writes an <code>index.html</code> at the top of the project, listing the mirrored sites. The
|
||||
front door to the copy.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Make a word database</span><span class="cli">-%I, --search-index</span></div>
|
||||
<p>Builds a searchable word index of every mirrored page.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Write a WARC archive of the crawl</span><span class="cli">-%r, --warc</span></div>
|
||||
<p>Saves every fetched response into an ISO-28500 WARC/1.1 archive alongside the mirror, headers
|
||||
and all. The mirror is a browsable copy; the WARC is the archival record of what the server
|
||||
actually sent, which is what replay tools and web archives want.</p>
|
||||
<p><b>WARC archive name</b> (<code>--warc-file</code>) sets the base name, blank to auto-name it
|
||||
under the output directory. <b>WARC segment size limit</b> (<code>--warc-max-size</code>) starts a
|
||||
new segment past that many bytes; blank or 0 keeps one file.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Write a CDXJ index of the WARC archive</span><span class="cli">-%rc, --warc-cdx</span></div>
|
||||
<p>Adds a sorted CDXJ index listing every record in the archive, which replay tools use to find a
|
||||
capture without reading the whole file.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Package the crawl as a WACZ file</span><span class="cli">--wacz</span></div>
|
||||
<p>Bundles the WARC, its CDXJ index and the mirrored pages into one WACZ file. It implies both of
|
||||
the two above.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web">
|
||||
<div class="opt-head"><span class="opt-name">Report what changed since the previous mirror</span><span class="cli">-%d, --changes</span></div>
|
||||
<p>Writes <code>hts-changes.json</code> listing what this crawl left new, changed, unchanged and
|
||||
gone against the previous mirror. The quick way to see what an update actually did.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-mime-types">
|
||||
<h3>MIME Types</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-mime-types.png" alt="WinHTTrack MIME types tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-mime-types.png" alt="WebHTTrack MIME types tab" width="1024" height="1046">
|
||||
<img data-for="droid" src="img/guide-droid-opt-mime-types.png" alt="Android MIME types tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Type / MIME associations</span><span class="cli">-%A, --assume</span></div>
|
||||
<p>Tells the engine what an extension always means, so it stops asking the server. On a site full
|
||||
of <code>.asp</code> links this is a large speed-up: without it every unknown extension costs a
|
||||
request before the engine knows what it has.</p>
|
||||
<p>Enter a file type and the MIME type it maps to, <code>asp</code> to <code>text/html</code>,
|
||||
and list several at once with commas: <code>asp,php,php3</code>. On the command line the same
|
||||
thing reads <code>--assume asp,php,php3=text/html</code>, and
|
||||
<code>--assume standard</code> covers the usual page extensions in one go.</p>
|
||||
<p>It also renames on the way in. If you know the site's <code>.dat</code> files are really ZIPs,
|
||||
map <code>dat</code> to <code>application/x-zip</code> and they land correctly named. Mapping an
|
||||
unknown type to <code>application/octet-stream</code> simply stops the engine checking it.</p>
|
||||
<table class="mime">
|
||||
<tr><td><code>text/html</code></td><td>pages, which HTTrack parses for links</td></tr>
|
||||
<tr><td><code>image/gif</code>, <code>image/jpeg</code>, <code>image/png</code></td><td>images</td></tr>
|
||||
<tr><td><code>application/x-zip</code></td><td>ZIP archives</td></tr>
|
||||
<tr><td><code>application/octet-stream</code></td><td>anything else, left alone</td></tr>
|
||||
</table>
|
||||
<p><span class="badge">Android</span> The table holds up to eight entries.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab" id="opt-experts-only">
|
||||
<h3>Experts Only</h3>
|
||||
|
||||
<figure>
|
||||
<img data-for="win" src="img/guide-win-opt-experts-only.png" alt="WinHTTrack Experts Only tab" width="524" height="448">
|
||||
<img data-for="web" src="img/guide-web-opt-experts-only.png" alt="WebHTTrack Experts Only tab" width="1024" height="1088">
|
||||
<img data-for="droid" src="img/guide-droid-opt-experts-only.png" alt="Android Experts Only tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
<p>The defaults here are right for almost every mirror. The travel modes are the exception: they
|
||||
are how you widen a crawl deliberately.</p>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Use a cache for updates</span><span class="cli">-CN, --cache N</span></div>
|
||||
<p>Keep this on. The cache is what makes <b>Update existing download</b> and <b>Continue
|
||||
interrupted download</b> possible at all; turning it off saves a little disk and costs you both.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Primary scan rule</span><span class="cli">-pN, --priority N</span></div>
|
||||
<p>What gets saved: nothing (0, for checking links), pages only (1), everything but pages (2),
|
||||
everything (3, the default), or pages first then the rest (7).</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Travel mode</span><span class="cli">-S -D -U -B</span></div>
|
||||
<p>Which directories the crawl may enter relative to your starting address: this one only
|
||||
(<code>-S</code>), it and below (<code>-D</code>, the default), it and above (<code>-U</code>), or
|
||||
both directions (<code>-B</code>).</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Global travel mode</span><span class="cli">-a -d -l -e</span></div>
|
||||
<p>How far the crawl may stray from the address you gave it: same address only (<code>-a</code>,
|
||||
the default), same domain (<code>-d</code>), same top-level domain (<code>-l</code>), or anywhere
|
||||
at all (<code>-e</code>). The last one will follow the web until a limit stops it.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Rewrite links</span><span class="cli">-KN, --keep-links N</span></div>
|
||||
<p>What the links in the saved pages look like: relative, so the copy browses offline
|
||||
(<code>K0</code>, the default), absolute, or the original online addresses (<code>K4</code>), which
|
||||
gives you the pages as archived documents rather than a browsable mirror.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt">
|
||||
<div class="opt-head"><span class="opt-name">Activate debug mode</span><span class="cli">-%H, --debug-headers</span></div>
|
||||
<p>Writes the HTTP headers and other internals to the log. For diagnosing a site that behaves
|
||||
strangely, not for normal use.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<h2 id="next">Where to go next</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="filters.html">Filter syntax</a>: the full pattern language behind Scan Rules.</li>
|
||||
<li><a href="cmdguide.html">Command-line guide</a>: the same engine, scripted.</li>
|
||||
<li><a href="httrack.man.html">Manual page</a>: every option, authoritative.</li>
|
||||
<li><a href="faq.html">FAQ and troubleshooting</a>: when a mirror comes back wrong.</li>
|
||||
<li><a href="abuse.html">How not to use HTTrack</a>: worth two minutes before pointing it at
|
||||
someone else's server.</li>
|
||||
</ul>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged screenshot"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
127
html/guide.js
Normal file
@@ -0,0 +1,127 @@
|
||||
/* Progressive enhancement for guide.html: the platform switcher and the option
|
||||
filter. Image zoom and sidebar highlighting are shared, in doc.js. Everything
|
||||
here is optional: with scripting off the page still carries every platform's
|
||||
text and screenshots. */
|
||||
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var PLATFORMS = ["win", "web", "droid"];
|
||||
var STORE = "httrack-guide-platform";
|
||||
|
||||
/* Chrome denies storage to file:// origins, and the doc is read from disk. */
|
||||
function remembered() {
|
||||
try {
|
||||
return localStorage.getItem(STORE);
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function remember(platform) {
|
||||
try {
|
||||
localStorage.setItem(STORE, platform);
|
||||
} catch (e) {
|
||||
/* not fatal: the hash still carries the choice */
|
||||
}
|
||||
}
|
||||
|
||||
/* "#win/opt-limits" -> {platform: "win", target: "opt-limits"}, and a bare
|
||||
"#win" is a platform, not a target of that name. */
|
||||
function parseHash() {
|
||||
var hash = location.hash.replace(/^#/, "");
|
||||
var slash = hash.indexOf("/");
|
||||
if (slash < 0) {
|
||||
return PLATFORMS.indexOf(hash) !== -1
|
||||
? { platform: hash, target: "" }
|
||||
: { platform: null, target: hash };
|
||||
}
|
||||
if (PLATFORMS.indexOf(hash.slice(0, slash)) !== -1) {
|
||||
return { platform: hash.slice(0, slash), target: hash.slice(slash + 1) };
|
||||
}
|
||||
return { platform: null, target: hash };
|
||||
}
|
||||
|
||||
function setPlatform(platform) {
|
||||
document.documentElement.setAttribute("data-platform", platform);
|
||||
}
|
||||
|
||||
/* Runs before first paint, so the page never flashes the other platforms. */
|
||||
var initial = parseHash().platform || remembered() ||
|
||||
(/Android/i.test(navigator.userAgent) ? "droid" :
|
||||
/Windows/i.test(navigator.userAgent) ? "win" : "web");
|
||||
setPlatform(initial);
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
var current = document.documentElement.getAttribute("data-platform");
|
||||
|
||||
/* ---- platform switcher ---- */
|
||||
|
||||
var buttons = [].slice.call(document.querySelectorAll(".platforms button"));
|
||||
|
||||
function select(platform, push) {
|
||||
current = platform;
|
||||
setPlatform(platform);
|
||||
remember(platform);
|
||||
buttons.forEach(function (b) {
|
||||
b.setAttribute("aria-pressed", String(b.dataset.platform === platform));
|
||||
});
|
||||
if (push) {
|
||||
var target = parseHash().target;
|
||||
history.replaceState(null, "", "#" + platform + (target ? "/" + target : ""));
|
||||
}
|
||||
}
|
||||
|
||||
buttons.forEach(function (b) {
|
||||
b.addEventListener("click", function () {
|
||||
select(b.dataset.platform, true);
|
||||
});
|
||||
});
|
||||
select(current, false);
|
||||
|
||||
/* A "#win/opt-limits" link has no element of that id: scroll it ourselves. */
|
||||
function jumpToHash() {
|
||||
var parsed = parseHash();
|
||||
if (parsed.platform) {
|
||||
select(parsed.platform, false);
|
||||
}
|
||||
if (parsed.target) {
|
||||
var el = document.getElementById(parsed.target);
|
||||
if (el) {
|
||||
el.scrollIntoView();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("hashchange", jumpToHash);
|
||||
if (parseHash().platform) {
|
||||
jumpToHash();
|
||||
}
|
||||
|
||||
/* ---- option filter ---- */
|
||||
|
||||
var filter = document.getElementById("optfilter");
|
||||
var count = document.getElementById("optcount");
|
||||
if (filter) {
|
||||
var options = [].slice.call(document.querySelectorAll(".opt"));
|
||||
options.forEach(function (opt) {
|
||||
opt.dataset.haystack = opt.textContent.toLowerCase();
|
||||
});
|
||||
filter.addEventListener("input", function () {
|
||||
var needle = filter.value.trim().toLowerCase();
|
||||
var shown = 0;
|
||||
options.forEach(function (opt) {
|
||||
var hit = !needle || opt.dataset.haystack.indexOf(needle) !== -1;
|
||||
opt.hidden = !hit;
|
||||
shown += hit ? 1 : 0;
|
||||
});
|
||||
/* Fold away a tab whose options all filtered out. */
|
||||
[].slice.call(document.querySelectorAll("section.tab")).forEach(function (section) {
|
||||
section.hidden = needle !== "" &&
|
||||
!section.querySelector(".opt:not([hidden])");
|
||||
});
|
||||
count.textContent = needle ? shown + " of " + options.length : "";
|
||||
});
|
||||
}
|
||||
});
|
||||
})();
|
||||
@@ -37,7 +37,7 @@ a:active { text-decoration: underline; }
|
||||
border-bottom: 6px solid #000;
|
||||
padding: 10px; padding-top: 20px;
|
||||
line-height: 1.65em;
|
||||
background-image: url(images/bg_rings.gif);
|
||||
background-image: url(images/bg_rings.svg);
|
||||
background-repeat: no-repeat;
|
||||
background-position: top right;
|
||||
}
|
||||
|
||||
@@ -87,12 +87,13 @@ offline browser : copy websites to a local directory</p>
|
||||
--host-control[=N]</b> ] [ <b>-%P,
|
||||
--extended-parsing[=N]</b> ] [ <b>-n, --near</b> ] [ <b>-t,
|
||||
--test</b> ] [ <b>-%L, --list</b> ] [ <b>-%S, --urllist</b>
|
||||
] [ <b>-NN, --structure[=N]</b> ] [ <b>-%N,
|
||||
--delayed-type-check</b> ] [ <b>-%D,
|
||||
] [ <b>-%m, --sitemap</b> ] [ <b>-NN, --structure[=N]</b> ]
|
||||
[ <b>-%N, --delayed-type-check</b> ] [ <b>-%D,
|
||||
--cached-delayed-type-check</b> ] [ <b>-%M, --mime-html</b>
|
||||
] [ <b>-LN, --long-names[=N]</b> ] [ <b>-KN,
|
||||
--keep-links[=N]</b> ] [ <b>-x, --replace-external</b> ] [
|
||||
<b>-%x, --disable-passwords</b> ] [ <b>-%q,
|
||||
] [ <b>-%Z, --single-file</b> ] [ <b>-LN,
|
||||
--long-names[=N]</b> ] [ <b>-KN, --keep-links[=N]</b> ] [
|
||||
<b>-x, --replace-external</b> ] [ <b>-%x,
|
||||
--disable-passwords</b> ] [ <b>-%q,
|
||||
--include-query-string</b> ] [ <b>-%g, --strip-query</b> ] [
|
||||
<b>-o, --generate-errors</b> ] [ <b>-X, --purge-old[=N]</b>
|
||||
] [ <b>-%p, --preserve</b> ] [ <b>-%T, --utf8-conversion</b>
|
||||
@@ -108,16 +109,17 @@ offline browser : copy websites to a local directory</p>
|
||||
--footer</b> ] [ <b>-%l, --language</b> ] [ <b>-%a,
|
||||
--accept</b> ] [ <b>-%X, --headers</b> ] [ <b>-C,
|
||||
--cache[=N]</b> ] [ <b>-k, --store-all-in-cache</b> ] [
|
||||
<b>-%r, --warc</b> ] [ <b>-%n, --do-not-recatch</b> ] [
|
||||
<b>-%v, --display</b> ] [ <b>-Q, --do-not-log</b> ] [ <b>-q,
|
||||
--quiet</b> ] [ <b>-z, --extra-log</b> ] [ <b>-Z,
|
||||
--debug-log</b> ] [ <b>-v, --verbose</b> ] [ <b>-f,
|
||||
--file-log</b> ] [ <b>-f2, --single-log</b> ] [ <b>-I,
|
||||
--index</b> ] [ <b>-%i, --build-top-index</b> ] [ <b>-%I,
|
||||
--search-index</b> ] [ <b>-pN, --priority[=N]</b> ] [ <b>-S,
|
||||
--stay-on-same-dir</b> ] [ <b>-D, --can-go-down</b> ] [
|
||||
<b>-U, --can-go-up</b> ] [ <b>-B, --can-go-up-and-down</b> ]
|
||||
[ <b>-a, --stay-on-same-address</b> ] [ <b>-d,
|
||||
<b>-%r, --warc</b> ] [ <b>-%d, --changes</b> ] [ <b>-%n,
|
||||
--do-not-recatch</b> ] [ <b>-%v, --display</b> ] [ <b>-Q,
|
||||
--do-not-log</b> ] [ <b>-q, --quiet</b> ] [ <b>-z,
|
||||
--extra-log</b> ] [ <b>-Z, --debug-log</b> ] [ <b>-v,
|
||||
--verbose</b> ] [ <b>-f, --file-log</b> ] [ <b>-f2,
|
||||
--single-log</b> ] [ <b>-I, --index</b> ] [ <b>-%i,
|
||||
--build-top-index</b> ] [ <b>-%I, --search-index</b> ] [
|
||||
<b>-pN, --priority[=N]</b> ] [ <b>-S, --stay-on-same-dir</b>
|
||||
] [ <b>-D, --can-go-down</b> ] [ <b>-U, --can-go-up</b> ] [
|
||||
<b>-B, --can-go-up-and-down</b> ] [ <b>-a,
|
||||
--stay-on-same-address</b> ] [ <b>-d,
|
||||
--stay-on-same-domain</b> ] [ <b>-l, --stay-on-same-tld</b>
|
||||
] [ <b>-e, --go-everywhere</b> ] [ <b>-%H,
|
||||
--debug-headers</b> ] [ <b>-%!,
|
||||
@@ -575,6 +577,22 @@ URL per line) (--list <param>)</p></td></tr>
|
||||
|
||||
<p><file> add all scan rules located in this text
|
||||
file (one scan rule per line) (--urllist <param>)</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-%m</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>seed the crawl from the site’s sitemap (robots.txt
|
||||
Sitemap:, then /sitemap.xml); --sitemap-url URL names one
|
||||
explicitly. A sitemap you name, or one the site declares, is
|
||||
fetched even under robots.txt Disallow; only the guessed
|
||||
/sitemap.xml obeys it. The URLs found still pass every
|
||||
filter and scope rule (--sitemap)</p></td></tr>
|
||||
</table>
|
||||
|
||||
<h3>Build options:
|
||||
@@ -648,6 +666,24 @@ don’t wait) (--cached-delayed-type-check)</p></td></tr>
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-%Z</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>after the mirror, rewrite each saved page with its
|
||||
stylesheets, scripts, images and fonts inlined as data:
|
||||
URIs, so any page opens by double-click anywhere (links
|
||||
between pages stay relative; audio and video stay links);
|
||||
--single-file-max-size N caps each asset (default 10485760
|
||||
bytes). %M is the better container where a Chromium-family
|
||||
browser is a given: one archive, no base64 tax on text, a
|
||||
shared asset stored once (--single-file)</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-%t</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
@@ -741,8 +777,8 @@ information purpose only) (%q0 don’t include)
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>*generate output html file in case of error (404..) (o0
|
||||
don’t generate) (--generate-errors)</p></td></tr>
|
||||
<p>*save the server’s error pages (404..) (o0 discard
|
||||
them) (--generate-errors)</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1143,6 +1179,19 @@ past N bytes, --warc-cdx also writes a sorted CDXJ index,
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-%d</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>write hts-changes.json listing what this crawl left new,
|
||||
changed, unchanged and gone compared to the previous mirror
|
||||
(--changes)</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-%n</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
Before Width: | Height: | Size: 4.1 KiB |
8
html/images/bg_rings.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="501" height="456" viewBox="0 0 501 456">
|
||||
<title>HTTrack rings</title>
|
||||
<!-- Transparent, unlike the GIF this replaces: the panel's own #ccd shows through. -->
|
||||
<g fill="#b9b9d0" fill-rule="evenodd">
|
||||
<path d="M614.59 346.3A323.36 197.55 21.16 1 0 11.46 112.89A323.36 197.55 21.16 1 0 614.59 346.3 ZM590.57 315.66A262.58 160.99 22.18 1 0 104.26 117.43A262.58 160.99 22.18 1 0 590.57 315.66 Z"/>
|
||||
<path d="M578.08 292.16A185.6 113.57 21.23 1 0 232.08 157.73A185.6 113.57 21.23 1 0 578.08 292.16 ZM564.4 274.56A150.77 92.55 22.26 1 0 285.34 160.32A150.77 92.55 22.26 1 0 564.4 274.56 Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 641 B |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 33 KiB |
BIN
html/img/guide-droid-finished.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
html/img/guide-droid-legacy-import.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
html/img/guide-droid-opt-browser-id.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
html/img/guide-droid-opt-build.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
html/img/guide-droid-opt-experts-only.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
html/img/guide-droid-opt-flow-control.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
html/img/guide-droid-opt-limits.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
html/img/guide-droid-opt-links.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
html/img/guide-droid-opt-log-index-cache.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
html/img/guide-droid-opt-mime-types.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
html/img/guide-droid-opt-proxy.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
html/img/guide-droid-opt-scan-rules.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
html/img/guide-droid-opt-spider.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
html/img/guide-droid-options-menu.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
html/img/guide-droid-permission.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
html/img/guide-droid-progress.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
html/img/guide-droid-project-name.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
html/img/guide-droid-project-setup.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
html/img/guide-droid-start.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
html/img/guide-web-add-url.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
html/img/guide-web-finished.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
html/img/guide-web-opt-browser-id.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
html/img/guide-web-opt-build.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
html/img/guide-web-opt-experts-only.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
html/img/guide-web-opt-flow-control.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
html/img/guide-web-opt-limits.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
html/img/guide-web-opt-links.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
html/img/guide-web-opt-log-index-cache.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
html/img/guide-web-opt-mime-types.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
html/img/guide-web-opt-proxy.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
html/img/guide-web-opt-scan-rules.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
html/img/guide-web-opt-spider.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
html/img/guide-web-progress.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
html/img/guide-web-project-name.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
html/img/guide-web-project-setup.png
Normal file
|
After Width: | Height: | Size: 31 KiB |