Compare commits
54 Commits
3.49.20
...
zz-pidreus
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d22b59809 | ||
|
|
65940365ee | ||
|
|
95c03624dd | ||
|
|
bfb9d4611d | ||
|
|
de484e0670 | ||
|
|
b6d15c7bc8 | ||
|
|
db22036173 | ||
|
|
50f151e11b | ||
|
|
729f823db9 | ||
|
|
01274a93f5 | ||
|
|
bd765e4ed6 | ||
|
|
17e3d241fa | ||
|
|
ee20bfbb2b | ||
|
|
bde9eadb05 | ||
|
|
88f0a0174d | ||
|
|
696553b0f9 | ||
|
|
99d494bd39 | ||
|
|
53eace3cfe | ||
|
|
1dcfcf491f | ||
|
|
14e9108049 | ||
|
|
5c068a3c65 | ||
|
|
e9336b4d87 | ||
|
|
11c357e73a | ||
|
|
94d2d79217 | ||
|
|
52ac9ee142 | ||
|
|
d432772e1e | ||
|
|
997160c98f | ||
|
|
c3a5deef57 | ||
|
|
b33ef757e5 | ||
|
|
9bb989053d | ||
|
|
c27d55c345 | ||
|
|
40e94df2cc | ||
|
|
c71f37189a | ||
|
|
cb91ecaedc | ||
|
|
faa6964d18 | ||
|
|
fce40a5511 | ||
|
|
0f3dbcded4 | ||
|
|
04c75c430a | ||
|
|
0e0072ec03 | ||
|
|
ceab9c834b | ||
|
|
082d87e284 | ||
|
|
58e8aec88f | ||
|
|
ce66c2391a | ||
|
|
49e93b171b | ||
|
|
3ea7a773fa | ||
|
|
5175cf986f | ||
|
|
d25dd436ee | ||
|
|
0fe1e2ba34 | ||
|
|
9bc300296f | ||
|
|
a6315d04a3 | ||
|
|
893b542953 | ||
|
|
3232f81373 | ||
|
|
4a5854f31d | ||
|
|
df0fbd4711 |
63
.github/workflows/ci.yml
vendored
@@ -700,6 +700,47 @@ jobs:
|
||||
if: failure()
|
||||
run: cat tests/test-suite.log 2>/dev/null || true
|
||||
|
||||
# The cell of #1139: a libc exporting getrandom() without shipping
|
||||
# <sys/random.h>. Nothing else reaches it, and it is a hard build break when
|
||||
# the call is not gated on the header. It also runs the /dev/urandom fallback.
|
||||
no-getrandom:
|
||||
name: build (getrandom header hidden)
|
||||
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 || true # a third-party source in the runner image can 403 (#1097)
|
||||
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 (sys/random.h hidden from configure)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
autoreconf -fi
|
||||
./configure ac_cv_header_sys_random_h=no
|
||||
# A libc without getrandom() at all would pass this job vacuously.
|
||||
grep -q "define HAVE_GETRANDOM 1" config.h
|
||||
! grep -q "define HAVE_SYS_RANDOM_H" config.h
|
||||
|
||||
- name: Build
|
||||
run: make -j"$(nproc)"
|
||||
|
||||
- name: Test
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
||||
make check -j"$jobs"
|
||||
|
||||
- name: Print the test log on failure
|
||||
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.
|
||||
@@ -837,6 +878,7 @@ jobs:
|
||||
fi
|
||||
|
||||
lint:
|
||||
# The name is a required status check on master; renaming it blocks every PR.
|
||||
name: lint (shellcheck, shfmt)
|
||||
runs-on: ubuntu-24.04
|
||||
# Every tracked shell script; the globs expand at run time. Kept here so the
|
||||
@@ -865,8 +907,13 @@ jobs:
|
||||
# version; use it rather than fetching a release binary from github.com.
|
||||
sudo apt-get install -y --no-install-recommends shellcheck shfmt appstream \
|
||||
appstream-util
|
||||
# Pinned to the local dev versions: black's stable style moves across
|
||||
# majors, so the runner image's build would reformat on its own schedule.
|
||||
pip install --quiet black==25.1.0 flake8==7.1.1
|
||||
shfmt --version
|
||||
appstreamcli --version
|
||||
black --version
|
||||
flake8 --version
|
||||
|
||||
- name: shellcheck
|
||||
run: shellcheck $SHELL_SCRIPTS
|
||||
@@ -874,6 +921,22 @@ jobs:
|
||||
- name: shfmt
|
||||
run: shfmt -d -i 4 $SHELL_SCRIPTS
|
||||
|
||||
# Read the list rather than hand-keeping one: a .py added in a new
|
||||
# directory then gets checked without anyone widening a glob.
|
||||
- name: List the tracked Python files
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mapfile -t py < <(git ls-files '*.py')
|
||||
test "${#py[@]}" -gt 0 # flake8 given no paths exits 0, checking nothing
|
||||
echo "${#py[@]} tracked Python files"
|
||||
echo "PYTHON_FILES=${py[*]}" >> "$GITHUB_ENV"
|
||||
|
||||
- name: black
|
||||
run: black --check --diff $PYTHON_FILES
|
||||
|
||||
- name: flake8
|
||||
run: flake8 $PYTHON_FILES
|
||||
|
||||
# A misnamed test falls outside the glob "make check" runs, so it goes
|
||||
# missing without failing anything.
|
||||
- name: test file names
|
||||
|
||||
4
.github/workflows/codeql.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev
|
||||
|
||||
- uses: github/codeql-action/init@v4.37.4
|
||||
- uses: github/codeql-action/init@v4.37.6
|
||||
with:
|
||||
languages: c-cpp
|
||||
build-mode: manual
|
||||
@@ -67,6 +67,6 @@ jobs:
|
||||
./configure
|
||||
make -j"$(nproc)"
|
||||
|
||||
- uses: github/codeql-action/analyze@v4.37.4
|
||||
- uses: github/codeql-action/analyze@v4.37.6
|
||||
with:
|
||||
category: "/language:c-cpp"
|
||||
|
||||
78
.github/workflows/emulated-suite.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
# cross-arch.yml stops at compile for the ports architectures, so the Debian
|
||||
# buildd is the first machine to run the suite on one, and it reports by failing
|
||||
# the package build (#1146, #1148). This runs it under qemu-user, where a process
|
||||
# is not the shape a native one is and every step costs far more.
|
||||
name: Emulated suite
|
||||
|
||||
on:
|
||||
# The harness is where a native-shape assumption lands, so gate on it rather
|
||||
# than on every PR: this leg is slow and is not a required check.
|
||||
pull_request:
|
||||
paths:
|
||||
- "tests/**"
|
||||
- "tools/emulated-suite.sh"
|
||||
- ".github/workflows/emulated-suite.yml"
|
||||
push:
|
||||
branches: [master]
|
||||
schedule:
|
||||
- cron: "41 5 * * 1"
|
||||
workflow_dispatch:
|
||||
|
||||
# Least privilege: the workflow only needs to read the repo.
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: emulated-suite-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
emulated:
|
||||
name: emulated suite (${{ matrix.arch }})
|
||||
runs-on: ubuntu-24.04
|
||||
# The emulated apt, configure and build take the bulk of it, well under the
|
||||
# 6h ceiling: a wedge should not run that long.
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Emulation is what is under test, not parisc: the hppa that reported
|
||||
# #1146 lives in debian-ports, with no container image and a far more
|
||||
# fragile archive. s390x is in main, and big-endian, which nothing else
|
||||
# here covers.
|
||||
arch: [s390x]
|
||||
steps:
|
||||
- name: Register the binfmt handlers
|
||||
run: |
|
||||
set -euo pipefail
|
||||
sudo apt-get update
|
||||
# Registered with the F flag, so the kernel holds the interpreter open
|
||||
# and the container needs no copy of it.
|
||||
sudo apt-get install -y --no-install-recommends qemu-user-static binfmt-support
|
||||
test -e "/proc/sys/fs/binfmt_misc/qemu-${{ matrix.arch }}" ||
|
||||
{ ls /proc/sys/fs/binfmt_misc; exit 1; }
|
||||
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Build and run the suite emulated
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# The build dir is a mounted volume, so the suite log outlives the
|
||||
# container: a failure here has no detail otherwise.
|
||||
mkdir -p "$RUNNER_TEMP/emul-bld"
|
||||
docker run --rm --platform "linux/${{ matrix.arch }}" \
|
||||
-v "$GITHUB_WORKSPACE:$GITHUB_WORKSPACE" -w "$GITHUB_WORKSPACE" \
|
||||
-v "$RUNNER_TEMP/emul-bld:/bld" \
|
||||
-e "GITHUB_WORKSPACE=$GITHUB_WORKSPACE" \
|
||||
-e "EMULATED_ARCH=${{ matrix.arch }}" \
|
||||
debian:sid bash ./tools/emulated-suite.sh
|
||||
|
||||
- name: Collect the suite log
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: emulated-suite-${{ matrix.arch }}-log
|
||||
path: ${{ runner.temp }}/emul-bld/tests/test-suite.log
|
||||
if-no-files-found: warn
|
||||
106
.github/workflows/httraqt.yml
vendored
Normal file
@@ -0,0 +1,106 @@
|
||||
# Build HTTraQt, the only consumer of our installed headers, against this branch.
|
||||
name: HTTraQt
|
||||
|
||||
# Filtered, so it must never join the required set: a check that a path filter
|
||||
# skips stays "Expected" forever and blocks the merge.
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
paths: ['src/**', 'm4/**', 'configure.ac', '.github/workflows/httraqt.yml']
|
||||
pull_request:
|
||||
paths: ['src/**', 'm4/**', 'configure.ac', '.github/workflows/httraqt.yml']
|
||||
schedule:
|
||||
- cron: '37 05 * * 1' # upstream is pinned; this catches drift in Qt and the runner image
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: httraqt-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
# Unofficial mirror of the SourceForge tree, so no PR depends on a third-party host.
|
||||
HTTRAQT_REPO: https://github.com/xroche/httraqt-ci-mirror.git
|
||||
HTTRAQT_REF: a1175565c61ab9afd7bda2dc96ed1182c2d44ec3 # 1.4.11 + cmake patch, upstream HEAD since 2023-01-06
|
||||
PREFIX: /usr/local
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: build HTTraQt against this branch
|
||||
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 || true # a third-party source in the runner image can 403 (#1097)
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
|
||||
cmake qt6-base-dev qt6-multimedia-dev
|
||||
|
||||
- name: Build and install libhttrack
|
||||
run: |
|
||||
set -euo pipefail
|
||||
autoreconf -fi
|
||||
bld="$RUNNER_TEMP/bld"
|
||||
mkdir -p "$bld"
|
||||
(cd "$bld" && "$GITHUB_WORKSPACE/configure" --prefix="$PREFIX" --disable-static)
|
||||
make -C "$bld" -j"$(nproc)"
|
||||
sudo make -C "$bld" install
|
||||
sudo ldconfig
|
||||
|
||||
- name: Assert no distribution libhttrack can shadow ours
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# FindHttrack.cmake hardcodes /usr/include/httrack first, so a stray libhttrack-dev would test Debian's headers.
|
||||
for stray in /usr/include/httrack /usr/lib/libhttrack.so /usr/lib/*/libhttrack.so; do
|
||||
if [ -e "$stray" ]; then
|
||||
echo "::error::$stray exists; HTTraQt would build against it, not this branch"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
test -f "$PREFIX/include/httrack/htsglobal.h"
|
||||
|
||||
- name: Fetch HTTraQt
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Fetching the SHA itself needs no pin check afterwards, and keeps the
|
||||
# tree out of the workspace so our own build cannot pick it up.
|
||||
rm -rf "$RUNNER_TEMP/httraqt"
|
||||
git init -q "$RUNNER_TEMP/httraqt"
|
||||
ok=
|
||||
for attempt in 1 2 3; do
|
||||
if git -C "$RUNNER_TEMP/httraqt" fetch -q --depth 1 "$HTTRAQT_REPO" "$HTTRAQT_REF"; then ok=1; break; fi
|
||||
echo "fetch failed (attempt $attempt)"
|
||||
[ "$attempt" -eq 3 ] || sleep $((attempt * 15))
|
||||
done
|
||||
[ -n "$ok" ] || { echo "::error::cannot reach $HTTRAQT_REPO"; exit 1; }
|
||||
git -C "$RUNNER_TEMP/httraqt" checkout -q --detach FETCH_HEAD
|
||||
|
||||
- name: Configure HTTraQt
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# CMAKE_MINIMUM_REQUIRED is 2.8 upstream, which CMake 4 rejects outright.
|
||||
# The redirect is load-bearing: a bare MESSAGE() is NOTICE mode, which goes to stderr.
|
||||
cmake -S "$RUNNER_TEMP/httraqt" -B "$RUNNER_TEMP/httraqt-bld" \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||
2>&1 | tee "$RUNNER_TEMP/cmake.log"
|
||||
# A configure that resolved elsewhere would compile someone else's headers.
|
||||
grep -q "httrack header directory found: $PREFIX/include/httrack/" "$RUNNER_TEMP/cmake.log"
|
||||
|
||||
- name: Build HTTraQt
|
||||
run: cmake --build "$RUNNER_TEMP/httraqt-bld" -j"$(nproc)"
|
||||
|
||||
- name: Assert it linked against the libhttrack we just built
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Not bin/: CMAKE_RUNTIME_OUTPUT_DIRECTORY is set after ADD_EXECUTABLE, too late.
|
||||
bin="$RUNNER_TEMP/httraqt-bld/httraqt"
|
||||
ldd "$bin" | grep -E "libhttrack\.so.* => $PREFIX/lib/" \
|
||||
|| { ldd "$bin"; exit 1; }
|
||||
101
.github/workflows/windows-build.yml
vendored
@@ -31,6 +31,11 @@ jobs:
|
||||
matrix:
|
||||
platform: [x64, Win32]
|
||||
configuration: [Release]
|
||||
# Windows runs from other branches starve this one's runner (#1213), so cap
|
||||
# them repo-wide at one per platform. queue: max: the default cancels a waiter.
|
||||
concurrency:
|
||||
group: windows-build-${{ matrix.platform }}
|
||||
queue: max
|
||||
# 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.
|
||||
@@ -67,17 +72,30 @@ jobs:
|
||||
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
|
||||
# API), so cache the binary archives directly. An exact key hit skips the save,
|
||||
# so a cache orphaned by a toolchain bump pins itself, and naming every input
|
||||
# vcpkg's ABI hash folds in is a list that can come up short: key on the run
|
||||
# id instead, and restore by prefix.
|
||||
- name: Restore the vcpkg binary archives
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: ${{ github.workspace }}\vcpkg_cache
|
||||
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}
|
||||
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
restore-keys: |
|
||||
vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-
|
||||
vcpkg-${{ matrix.platform }}-
|
||||
|
||||
# Counted before the build, or vcpkg's own writes during it make a cold cache
|
||||
# look warm.
|
||||
- name: Count the restored vcpkg archives
|
||||
shell: pwsh
|
||||
run: |
|
||||
$a = @(Get-ChildItem -Recurse -File -Filter *.zip `
|
||||
$env:VCPKG_DEFAULT_BINARY_CACHE -EA SilentlyContinue)
|
||||
Write-Host "restored $($a.Count) archive(s)"
|
||||
$a.FullName | Out-File -FilePath vcpkg-restored.txt
|
||||
"VCPKG_ARCHIVES_BEFORE=$($a.Count)" | Out-File -FilePath $env:GITHUB_ENV -Append
|
||||
|
||||
# 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
|
||||
@@ -107,6 +125,50 @@ jobs:
|
||||
if ($LASTEXITCODE -ne 0) { throw "$proj failed" }
|
||||
}
|
||||
|
||||
# A stale cache and a warm one both restore and rebuild; only archives
|
||||
# restored and unmatched prove staleness.
|
||||
- name: Check whether vcpkg could use the restored archives
|
||||
id: vcpkg
|
||||
if: ${{ !cancelled() }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
$before = [int]$env:VCPKG_ARCHIVES_BEFORE
|
||||
$stale = $false
|
||||
# The log is missing when the build never reached MSBuild.
|
||||
if (Test-Path msbuild-libhttrack.log) {
|
||||
$m = Select-String -Path msbuild-libhttrack.log -Pattern 'Restored (\d+) package' |
|
||||
Select-Object -First 1
|
||||
if ($m) {
|
||||
$restored = [int]$m.Matches[0].Groups[1].Value
|
||||
Write-Host "vcpkg restored $restored of $before archive(s)"
|
||||
$stale = ($restored -eq 0 -and $before -gt 0)
|
||||
} else { Write-Host "no vcpkg restore line in the build log" }
|
||||
} else { Write-Host "no build log" }
|
||||
if ($stale) {
|
||||
Write-Host "::warning::stale vcpkg cache: $before archives, none matching this toolchain; every port rebuilt from source"
|
||||
# Provably dead: drop them rather than carry every past toolchain
|
||||
# generation in the saved entry forever. -LiteralPath because a piped
|
||||
# string binds -Path, which globs on a name carrying [ ].
|
||||
Get-Content vcpkg-restored.txt -EA SilentlyContinue | Where-Object { $_ } |
|
||||
ForEach-Object { Remove-Item -LiteralPath $_ -Force -EA SilentlyContinue }
|
||||
}
|
||||
$after = @(Get-ChildItem -Recurse -File -Filter *.zip `
|
||||
$env:VCPKG_DEFAULT_BINARY_CACHE -EA SilentlyContinue).Count
|
||||
Write-Host "$after archive(s) to cache"
|
||||
# Pruning can leave the count unmoved while replacing every archive, so the
|
||||
# stale case saves on its own account rather than on growth.
|
||||
"save=$($stale -or ($after -gt $before))".ToLower() |
|
||||
Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||
|
||||
# Only when the archive set changed, so a warm run adds no entry and the
|
||||
# eviction budget stays for the runs that rebuilt something.
|
||||
- name: Save the vcpkg binary archives
|
||||
if: ${{ !cancelled() && steps.vcpkg.outputs.save == 'true' }}
|
||||
uses: actions/cache/save@v6
|
||||
with:
|
||||
path: ${{ github.workspace }}\vcpkg_cache
|
||||
key: vcpkg-${{ matrix.platform }}-${{ hashFiles('src/vcpkg.json') }}-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
|
||||
# WinHTTrack links src\$(Platform)\$(Configuration)\libhttrack.lib, so the
|
||||
# import lib and the DLL both have to land there under that exact name.
|
||||
- name: Check the binaries landed where they are expected
|
||||
@@ -167,6 +229,33 @@ jobs:
|
||||
throw "CRT mismatch across the boundary: libhttrack.dll=$a httrack.exe=$b"
|
||||
}
|
||||
|
||||
# The DLL build only proves the engine's own fixed include order, the one
|
||||
# order a consumer need not use, and 205/206/207/269 all gate on an automake
|
||||
# environment this job has not (#1153).
|
||||
- name: Compile the installed headers standalone and pairwise
|
||||
shell: pwsh
|
||||
timeout-minutes: 20
|
||||
run: |
|
||||
$ErrorActionPreference = "Stop"
|
||||
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||
$vs = & $vswhere -latest -products * -property installationPath | Select-Object -First 1
|
||||
if (-not $vs) { throw "Visual Studio not found" }
|
||||
Import-Module "$vs\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
|
||||
$arch = if ("${{ matrix.platform }}" -eq "x64") { "x64" } else { "x86" }
|
||||
Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation `
|
||||
-DevCmdArguments "-arch=$arch -host_arch=x64"
|
||||
# htsbasenet.h reaches for <openssl/ssl.h> unless a consumer turns it
|
||||
# off, so the sweep needs what vcpkg installed for the build. Searched,
|
||||
# not spelled: the install root nests the triplet twice.
|
||||
$dirs = @(Get-ChildItem -Path "src\vcpkg_installed" -Recurse -Depth 3 `
|
||||
-Directory -Filter include -ErrorAction SilentlyContinue)
|
||||
if (-not ($dirs | Where-Object { Test-Path (Join-Path $_.FullName "openssl\ssl.h") })) {
|
||||
throw "no vcpkg include directory under src\vcpkg_installed holds openssl/ssl.h"
|
||||
}
|
||||
$inc = @($dirs | ForEach-Object { "-I" + $_.FullName })
|
||||
bash tests/install-headers-sweep.sh --backend cl --srcdir . -- @inc
|
||||
if ($LASTEXITCODE -ne 0) { throw "the installed headers do not compile standalone and pairwise" }
|
||||
|
||||
# The engine ships ~90 tests and none had ever run on Windows: "make check"
|
||||
# is Linux/macOS only. These are the offline ones, driven from Git Bash
|
||||
# against the native httrack.exe. They subsume the self-tests this step
|
||||
|
||||
364
.github/workflows/zz-pidreuse-probe.yml
vendored
Normal file
@@ -0,0 +1,364 @@
|
||||
# Scratch probe: does taskkill /F /T follow a recorded parent PID whose owner is
|
||||
# long dead? Not part of the build gate; branch-scoped, delete when answered.
|
||||
name: zz pid-reuse probe
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [zz-pidreuse-probe]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
probe:
|
||||
runs-on: windows-2022
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- name: Probe
|
||||
shell: pwsh
|
||||
run: |
|
||||
$ErrorActionPreference = 'Continue'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
$sum = $env:GITHUB_STEP_SUMMARY
|
||||
|
||||
function Say([string]$m) {
|
||||
Write-Host $m
|
||||
if ($sum) { try { Add-Content -LiteralPath $sum -Value $m -ErrorAction SilentlyContinue } catch { } }
|
||||
}
|
||||
|
||||
Say "# PID-reuse probe on $env:COMPUTERNAME $(Get-Date -Format o)"
|
||||
Say ""
|
||||
Say '```'
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Part 1: is the hazard even present?
|
||||
# ---------------------------------------------------------------
|
||||
Say "== PART 1: recorded-parent state of the runner's own processes =="
|
||||
|
||||
$snap = @(Get-CimInstance Win32_Process)
|
||||
$byPid = @{}
|
||||
foreach ($p in $snap) { $byPid[[int]$p.ProcessId] = $p }
|
||||
Say ("snapshot: {0} live processes" -f $snap.Count)
|
||||
|
||||
function Stamp($d) { if ($null -eq $d) { return '?' } else { return ([datetime]$d).ToString('HH:mm:ss.fff') } }
|
||||
|
||||
function Classify([int]$q) {
|
||||
$c = $byPid[$q]
|
||||
if ($null -eq $c) { return 'NOPROC' }
|
||||
$par = $byPid[[int]$c.ParentProcessId]
|
||||
if ($null -eq $par) { return 'DEAD-PARENT' }
|
||||
if ($null -eq $par.CreationDate -or $null -eq $c.CreationDate) { return 'OK' }
|
||||
if ($par.CreationDate -gt $c.CreationDate) { return 'RECYCLED-PARENT' }
|
||||
return 'OK'
|
||||
}
|
||||
|
||||
function Chain([int]$q) {
|
||||
$out = @()
|
||||
$seen = @{}
|
||||
$cur = $q
|
||||
for ($i = 0; $i -lt 24; $i++) {
|
||||
$c = $byPid[$cur]
|
||||
if ($null -eq $c) { $out += ("{0}=<no such process>" -f $cur); break }
|
||||
$out += ("{0}/{1}@{2}" -f $c.ProcessId, $c.Name, (Stamp $c.CreationDate))
|
||||
if ($seen.ContainsKey($cur)) { $out += '<cycle>'; break }
|
||||
$seen[$cur] = $true
|
||||
$st = Classify $cur
|
||||
if ($st -ne 'OK') { $out += ("<<{0}>>" -f $st); break }
|
||||
$cur = [int]$c.ParentProcessId
|
||||
if ($cur -eq 0) { break }
|
||||
}
|
||||
return ($out -join ' <- ')
|
||||
}
|
||||
|
||||
$interesting = @($snap | Where-Object {
|
||||
$_.Name -like 'Runner.*' -or $_.Name -like 'Agent.*' -or $_.Name -like 'hosted-*' -or
|
||||
$_.Name -eq 'bash.exe' -or $_.Name -eq 'pwsh.exe' -or
|
||||
$_.Name -eq 'powershell.exe' -or $_.Name -eq 'dotnet.exe' -or
|
||||
$_.Name -eq 'node.exe' -or $_.Name -eq 'cmd.exe' -or
|
||||
$_.Name -eq 'conhost.exe' -or $_.Name -eq 'sh.exe'
|
||||
} | Sort-Object Name, ProcessId)
|
||||
|
||||
$armed = 0
|
||||
foreach ($p in $interesting) {
|
||||
$st = Classify ([int]$p.ProcessId)
|
||||
Say (" {0,-24} pid={1,-7} ppid={2,-7} {3,-16} {4}" -f $p.Name, $p.ProcessId, $p.ParentProcessId, $st, (Chain ([int]$p.ProcessId)))
|
||||
if ($st -ne 'OK' -and ($p.Name -like 'Runner.*' -or $p.Name -like 'Agent.*' -or $p.Name -like 'hosted-*')) { $armed++ }
|
||||
}
|
||||
|
||||
$dead = 0; $rec = 0; $ok = 0
|
||||
$boxOrphan = @{}
|
||||
foreach ($p in $snap) {
|
||||
$st = Classify ([int]$p.ProcessId)
|
||||
if ($st -eq 'DEAD-PARENT') {
|
||||
$dead++
|
||||
$k = [int]$p.ParentProcessId
|
||||
if (-not $boxOrphan.ContainsKey($k)) { $boxOrphan[$k] = @() }
|
||||
$boxOrphan[$k] += ("{0}/{1}" -f $p.ProcessId, $p.Name)
|
||||
} elseif ($st -eq 'RECYCLED-PARENT') { $rec++ } else { $ok++ }
|
||||
}
|
||||
Say ""
|
||||
Say ("box-wide: {0} processes, {1} with a DEAD recorded parent, {2} with a RECYCLED one, {3} sound" -f $snap.Count, $dead, $rec, $ok)
|
||||
foreach ($k in ($boxOrphan.Keys | Sort-Object)) {
|
||||
Say (" dead ppid {0,-7} still claimed as parent by: {1}" -f $k, ($boxOrphan[$k] -join ', '))
|
||||
}
|
||||
Say ""
|
||||
if ($armed -gt 0) {
|
||||
Say "PART 1 VERDICT: HAZARD PRESENT - $armed runner-agent process(es) record a parent PID that is dead or already recycled."
|
||||
} elseif ($dead -gt 0) {
|
||||
Say "PART 1 VERDICT: no Runner.*/Agent.* process has a stale recorded parent, but $dead other live processes do."
|
||||
} else {
|
||||
Say "PART 1 VERDICT: NOT ARMED - every live process's recorded parent is alive and older."
|
||||
}
|
||||
Say ""
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Part 2. Five sets of freed PIDs, released at the same instant, so
|
||||
# that a null on the set the theory needs can be told apart from a
|
||||
# probe that never recycles anything:
|
||||
# A plain ping, killed, .NET handle disposed (baseline: does reuse happen?)
|
||||
# C plain ping, killed, handle deliberately HELD (does a handle pin the PID?)
|
||||
# D cmd orphan-maker, child killed (is the construction sound?)
|
||||
# B cmd orphan-maker, ping child left ALIVE (the question)
|
||||
# E cmd orphan-maker, wscript child left ALIVE (same, with a child that
|
||||
# attaches to no console)
|
||||
# Every process inherits this shell's console, so no console host survives
|
||||
# to hold a handle on the dead cmd. Run 2 created 500 of those.
|
||||
# ---------------------------------------------------------------
|
||||
Say "== PART 2: can a dead parent's PID be handed out again, and does taskkill /T follow it? =="
|
||||
|
||||
$vbs = Join-Path $env:TEMP 'zzsleep.vbs'
|
||||
Set-Content -LiteralPath $vbs -Value 'WScript.Sleep 600000' -Encoding ascii
|
||||
|
||||
function New-Ping {
|
||||
$psi = New-Object System.Diagnostics.ProcessStartInfo
|
||||
$psi.FileName = "$env:SystemRoot\System32\PING.EXE"
|
||||
$psi.Arguments = '-n 600 127.0.0.1'
|
||||
$psi.UseShellExecute = $false
|
||||
$psi.CreateNoWindow = $false
|
||||
$psi.RedirectStandardOutput = $true
|
||||
$psi.RedirectStandardError = $true
|
||||
return [System.Diagnostics.Process]::Start($psi)
|
||||
}
|
||||
|
||||
function New-Orphan([string]$childArgs) {
|
||||
# cmd exits at once, leaving the child alive with cmd's now-free PID recorded as parent.
|
||||
$psi = New-Object System.Diagnostics.ProcessStartInfo
|
||||
$psi.FileName = "$env:ComSpec"
|
||||
$psi.Arguments = $childArgs
|
||||
$psi.UseShellExecute = $false
|
||||
$psi.CreateNoWindow = $false
|
||||
return [System.Diagnostics.Process]::Start($psi)
|
||||
}
|
||||
|
||||
function Get-Proc([int]$q) {
|
||||
return (Get-CimInstance Win32_Process -Filter "ProcessId = $q" -ErrorAction SilentlyContinue | Select-Object -First 1)
|
||||
}
|
||||
|
||||
# --- control: a tree kill of a LIVE parent must kill its child, or the probe is blind.
|
||||
Say ""
|
||||
Say "-- control: taskkill /F /T on a live cmd whose child ping is genuine"
|
||||
$ctl = New-Orphan '/c ping -n 600 127.0.0.1 > NUL'
|
||||
Start-Sleep -Milliseconds 1500
|
||||
$ctlKid = @(Get-CimInstance Win32_Process -Filter "ParentProcessId = $($ctl.Id)")
|
||||
if ($ctlKid.Count -eq 0) {
|
||||
Say " control INCONCLUSIVE: no child found under cmd $($ctl.Id)"
|
||||
try { $ctl.Kill() } catch { }
|
||||
} else {
|
||||
$kp = [int]$ctlKid[0].ProcessId
|
||||
Say (" cmd {0} -> child {1}/{2}" -f $ctl.Id, $kp, $ctlKid[0].Name)
|
||||
$co = (& taskkill.exe /F /T /PID $ctl.Id 2>&1 | Out-String).Trim()
|
||||
Say (" taskkill: " + ($co -replace "`r?`n", ' | '))
|
||||
Start-Sleep -Milliseconds 800
|
||||
$still = Get-Proc $kp
|
||||
Say (" control result: child {0} {1}" -f $kp, $(if ($null -eq $still) { 'GONE - the probe can observe a tree kill' } else { 'STILL ALIVE - probe is blind, part 2 is inconclusive' }))
|
||||
}
|
||||
try { $ctl.Dispose() } catch { }
|
||||
|
||||
$conBefore = @(Get-Process conhost -ErrorAction SilentlyContinue).Count
|
||||
|
||||
# --- build the sets.
|
||||
$NB = 300; $ND = 200; $NE = 200; $NA = 200; $NC = 200
|
||||
Say ""
|
||||
Say "-- building sets: B=$NB (ping child alive) E=$NE (wscript child alive) D=$ND (child killed) A=$NA (baseline) C=$NC (handle held)"
|
||||
|
||||
$bCmd = New-Object 'System.Collections.Generic.List[System.Diagnostics.Process]'
|
||||
for ($i = 0; $i -lt $NB; $i++) { try { $bCmd.Add((New-Orphan '/c start /b ping -n 600 127.0.0.1 > NUL')) } catch { } }
|
||||
$eCmd = New-Object 'System.Collections.Generic.List[System.Diagnostics.Process]'
|
||||
for ($i = 0; $i -lt $NE; $i++) { try { $eCmd.Add((New-Orphan ('/c start /b wscript.exe //B //Nologo "' + $vbs + '"'))) } catch { } }
|
||||
$dCmd = New-Object 'System.Collections.Generic.List[System.Diagnostics.Process]'
|
||||
for ($i = 0; $i -lt $ND; $i++) { try { $dCmd.Add((New-Orphan '/c start /b ping -n 600 127.0.0.1 > NUL')) } catch { } }
|
||||
$aProc = New-Object 'System.Collections.Generic.List[System.Diagnostics.Process]'
|
||||
for ($i = 0; $i -lt $NA; $i++) { try { $aProc.Add((New-Ping)) } catch { } }
|
||||
$pinned = New-Object 'System.Collections.Generic.List[System.Diagnostics.Process]'
|
||||
for ($i = 0; $i -lt $NC; $i++) { try { $pinned.Add((New-Ping)) } catch { } }
|
||||
|
||||
$bPid = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
foreach ($p in $bCmd) { [void]$bPid.Add([int]$p.Id) }
|
||||
$ePid = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
foreach ($p in $eCmd) { [void]$ePid.Add([int]$p.Id) }
|
||||
$dPid = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
foreach ($p in $dCmd) { [void]$dPid.Add([int]$p.Id) }
|
||||
$aPid = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
foreach ($p in $aProc) { [void]$aPid.Add([int]$p.Id) }
|
||||
$cPid = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
foreach ($p in $pinned) { [void]$cPid.Add([int]$p.Id) }
|
||||
Say (" distinct PIDs held: B={0} E={1} D={2} A={3} C={4}" -f $bPid.Count, $ePid.Count, $dPid.Count, $aPid.Count, $cPid.Count)
|
||||
if ($bPid.Count -eq 0 -or $aPid.Count -eq 0) { Say " set construction failed, aborting"; Say '```'; exit 1 }
|
||||
|
||||
Start-Sleep -Seconds 3
|
||||
|
||||
# Map the surviving children back to the cmd that made them.
|
||||
$orphan = @{}
|
||||
$dKids = New-Object 'System.Collections.Generic.List[int]'
|
||||
$nB = 0; $nE = 0
|
||||
foreach ($p in @(Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'ping.exe' -or $_.Name -eq 'wscript.exe' })) {
|
||||
$pp = [int]$p.ParentProcessId
|
||||
if ($bPid.Contains($pp) -or $ePid.Contains($pp)) {
|
||||
if (-not $orphan.ContainsKey($pp)) { $orphan[$pp] = @() }
|
||||
$orphan[$pp] += [pscustomobject]@{ Pid = [int]$p.ProcessId; Created = $p.CreationDate }
|
||||
if ($bPid.Contains($pp)) { $nB++ } else { $nE++ }
|
||||
} elseif ($dPid.Contains($pp)) {
|
||||
$dKids.Add([int]$p.ProcessId)
|
||||
}
|
||||
}
|
||||
Say (" surviving orphan children: {0} under B parents, {1} under E parents, {2} under D parents (to be killed)" -f $nB, $nE, $dKids.Count)
|
||||
|
||||
# Free every set at the same instant. Only C keeps its .NET handle open.
|
||||
foreach ($p in $bCmd) { try { [void]$p.WaitForExit(2000) } catch { }; try { $p.Dispose() } catch { } }
|
||||
foreach ($p in $eCmd) { try { [void]$p.WaitForExit(2000) } catch { }; try { $p.Dispose() } catch { } }
|
||||
foreach ($p in $dCmd) { try { [void]$p.WaitForExit(2000) } catch { }; try { $p.Dispose() } catch { } }
|
||||
foreach ($p in $aProc) { try { $p.Kill() } catch { } }
|
||||
foreach ($p in $pinned) { try { $p.Kill() } catch { } }
|
||||
Start-Sleep -Milliseconds 1000
|
||||
foreach ($p in $aProc) { try { $p.Dispose() } catch { } }
|
||||
$aProc.Clear(); $bCmd.Clear(); $eCmd.Clear(); $dCmd.Clear()
|
||||
if ($dKids.Count -gt 0) { Stop-Process -Id $dKids.ToArray() -Force -ErrorAction SilentlyContinue }
|
||||
[GC]::Collect(); [GC]::WaitForPendingFinalizers(); [GC]::Collect()
|
||||
Start-Sleep -Seconds 2
|
||||
|
||||
$liveNow = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
foreach ($p in @(Get-CimInstance Win32_Process)) { [void]$liveNow.Add([int]$p.ProcessId) }
|
||||
function CountLive($s) { $n = 0; foreach ($x in $s) { if ($liveNow.Contains($x)) { $n++ } }; return $n }
|
||||
Say (" set members still live (must be 0): B={0} E={1} D={2} A={3} C={4}" -f (CountLive $bPid), (CountLive $ePid), (CountLive $dPid), (CountLive $aPid), (CountLive $cPid))
|
||||
$conAfter = @(Get-Process conhost -ErrorAction SilentlyContinue).Count
|
||||
Say (" conhost.exe: {0} before, {1} after (a surviving console host would hold a handle on its dead creator and pin its PID)" -f $conBefore, $conAfter)
|
||||
$kidsAlive = 0
|
||||
foreach ($k in $orphan.Keys) { foreach ($o in $orphan[$k]) { if ($liveNow.Contains($o.Pid)) { $kidsAlive++ } } }
|
||||
Say (" orphan children still alive under a dead B/E parent: {0}" -f $kidsAlive)
|
||||
|
||||
# --- hunt.
|
||||
$hitA = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
$hitB = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
$hitC = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
$hitD = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
$hitE = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
$boxHits = 0
|
||||
$spawns = 0; $tested = 0; $followed = 0; $survived = 0
|
||||
$KILLCAP = 25
|
||||
$distinct = New-Object 'System.Collections.Generic.HashSet[int]'
|
||||
$window = New-Object 'System.Collections.Generic.Queue[System.Diagnostics.Process]'
|
||||
$minPid = [int]::MaxValue; $maxPid = 0
|
||||
|
||||
function Test-Hit([int]$np) {
|
||||
if ($script:aPid.Contains($np)) { [void]$script:hitA.Add($np) }
|
||||
if ($script:dPid.Contains($np)) { [void]$script:hitD.Add($np) }
|
||||
if ($script:cPid.Contains($np)) {
|
||||
if ($script:hitC.Add($np) -and $script:hitC.Count -le 5) { Say ("!! set C hit: PID $np was handed out although an open process handle on it is still held") }
|
||||
}
|
||||
if ($script:boxOrphan.ContainsKey($np)) {
|
||||
$script:boxHits++
|
||||
Say ""
|
||||
Say ("!! REAL COLLISION: our spawn got PID $np, which live box process(es) still record as their parent: $($script:boxOrphan[$np] -join ', ')")
|
||||
Say " (not tree-killing this one: it would reap a process we did not start)"
|
||||
Say ""
|
||||
}
|
||||
$isB = $script:bPid.Contains($np)
|
||||
$isE = $script:ePid.Contains($np)
|
||||
if (-not ($isB -or $isE)) { return $false }
|
||||
if ($isB) { [void]$script:hitB.Add($np) } else { [void]$script:hitE.Add($np) }
|
||||
if ($script:tested -ge $script:KILLCAP) { return $false }
|
||||
|
||||
$live = @()
|
||||
foreach ($o in $script:orphan[$np]) {
|
||||
$cur = Get-Proc $o.Pid
|
||||
if ($null -ne $cur -and $cur.CreationDate -eq $o.Created) { $live += $o }
|
||||
}
|
||||
if ($live.Count -eq 0) { return $false }
|
||||
|
||||
$script:tested++
|
||||
Say ""
|
||||
Say ("### HIT #$($script:tested) on set $(if ($isB) { 'B' } else { 'E' }): spawn #$($script:spawns) at t=$([int]$script:sw.Elapsed.TotalSeconds)s was handed PID $np, the PID of a dead parent whose child is still running")
|
||||
foreach ($k in @(Get-CimInstance Win32_Process -Filter "ParentProcessId = $np")) {
|
||||
Say (" the process table calls this a child of $np : {0}/{1} created {2}" -f $k.ProcessId, $k.Name, $k.CreationDate)
|
||||
}
|
||||
foreach ($o in $live) { Say (" stale-PPID orphan {0} is alive before the kill" -f $o.Pid) }
|
||||
Say (" issuing: taskkill /F /T /PID $np")
|
||||
$out = (& taskkill.exe /F /T /PID $np 2>&1 | Out-String).Trim()
|
||||
Say (" taskkill said: " + ($out -replace "`r?`n", ' | '))
|
||||
Start-Sleep -Milliseconds 1000
|
||||
$anyDied = $false
|
||||
foreach ($o in $live) {
|
||||
$cur = Get-Proc $o.Pid
|
||||
$alive = ($null -ne $cur -and $cur.CreationDate -eq $o.Created)
|
||||
if (-not $alive) { $anyDied = $true }
|
||||
Say (" stale-PPID orphan {0}: alive after the kill = {1}" -f $o.Pid, $alive)
|
||||
}
|
||||
if (-not $anyDied) { $script:survived++ }
|
||||
if ($anyDied) {
|
||||
$script:followed++
|
||||
Say " >>> THE TREE WALK FOLLOWED A STALE PPID. taskkill /T does not validate that the recorded parent is the real one."
|
||||
} else {
|
||||
Say " >>> the orphan survived: taskkill /T did not follow the stale PPID."
|
||||
}
|
||||
Say ""
|
||||
return $false
|
||||
}
|
||||
|
||||
$sw = [Diagnostics.Stopwatch]::StartNew()
|
||||
Say ""
|
||||
Say "-- hunting: rolling window of 200 live spawns, 300s cap"
|
||||
$done = $false
|
||||
while (-not $done -and $sw.Elapsed.TotalSeconds -lt 300) {
|
||||
try { $np = (New-Ping) } catch { Start-Sleep -Milliseconds 50; continue }
|
||||
$window.Enqueue($np)
|
||||
$spawns++
|
||||
$id = [int]$np.Id
|
||||
[void]$distinct.Add($id)
|
||||
if ($id -lt $minPid) { $minPid = $id }
|
||||
if ($id -gt $maxPid) { $maxPid = $id }
|
||||
try { $done = Test-Hit $id } catch { Say ("Test-Hit failed on $id : " + $_.Exception.Message) }
|
||||
while ($window.Count -gt 200) {
|
||||
$old = $window.Dequeue()
|
||||
try { $old.Kill() } catch { }
|
||||
try { $old.Dispose() } catch { }
|
||||
}
|
||||
if (($spawns % 250) -eq 0) { Write-Host (" ... spawn $spawns, distinct $($distinct.Count), A=$($hitA.Count) B=$($hitB.Count) C=$($hitC.Count) D=$($hitD.Count) E=$($hitE.Count), t=$([int]$sw.Elapsed.TotalSeconds)s") }
|
||||
}
|
||||
|
||||
Say ""
|
||||
Say "== RESULT =="
|
||||
Say ("spawns {0}, distinct PIDs {1}, range {2}..{3}, {4:N0}s" -f $spawns, $distinct.Count, $minPid, $maxPid, $sw.Elapsed.TotalSeconds)
|
||||
Say ("distinct set PIDs reissued, by set:")
|
||||
Say (" A killed, handle disposed, no child : {0} of {1}" -f $hitA.Count, $aPid.Count)
|
||||
Say (" C killed, handle still OPEN : {0} of {1}" -f $hitC.Count, $cPid.Count)
|
||||
Say (" D dead orphan-maker, child killed : {0} of {1}" -f $hitD.Count, $dPid.Count)
|
||||
Say (" B dead orphan-maker, ping child ALIVE : {0} of {1}" -f $hitB.Count, $bPid.Count)
|
||||
Say (" E dead orphan-maker, wscript ALIVE : {0} of {1}" -f $hitE.Count, $ePid.Count)
|
||||
Say ("tree kills issued on a reissued stale-parent PID: {0}; reached the orphan: {1}; orphan survived: {2}" -f $tested, $followed, $survived)
|
||||
Say ("collisions with a dead PPID recorded by a process we did NOT start: {0}" -f $boxHits)
|
||||
if ($tested -gt 0 -and $followed -eq 0) {
|
||||
Say "INTERPRETATION: a dead parent's PID IS reissued while a live process still records it as its parent, in $tested measured cases, and taskkill /F /T left that process alone every time. The tree walk does not follow a stale PPID: it skips a claimed child that predates the process now holding the PID."
|
||||
} elseif ($hitA.Count -eq 0 -and $hitB.Count -eq 0 -and $hitE.Count -eq 0) {
|
||||
Say "INTERPRETATION: nothing came back, so this run recycled nothing and says nothing either way."
|
||||
} elseif ($tested -eq 0) {
|
||||
Say "INTERPRETATION: PIDs recycle (A>0) but no PID with a live process recording it as parent ever came back. On this kernel such a PID stays reserved, so a tree kill cannot land on one and the stale-PPID mechanism cannot fire."
|
||||
} elseif ($followed -gt 0) {
|
||||
Say "INTERPRETATION: a dead parent's PID IS reissued while a live process records it, and taskkill /F /T reaped that process. The mechanism is real on this image."
|
||||
} else {
|
||||
Say "INTERPRETATION: the PID was reissued, but taskkill /F /T left the stale-PPID orphan alone: the tree walk validates parentage."
|
||||
}
|
||||
Say '```'
|
||||
|
||||
while ($window.Count -gt 0) { $o = $window.Dequeue(); try { $o.Kill() } catch { } }
|
||||
try { Get-Process ping, wscript -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue } catch { }
|
||||
Write-Host "probe done"
|
||||
@@ -1,6 +1,6 @@
|
||||
AC_PREREQ([2.71])
|
||||
|
||||
AC_INIT([httrack], [3.49.20], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
||||
AC_INIT([httrack], [3.49.21], [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,6 +29,8 @@ AC_CONFIG_SRCDIR(src/httrack.c)
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
# 3:14:0: revision-only bump. httrackp gained a tail field (host_alias) and #1202
|
||||
# added an export (hts_host_alias_rule_ok); no layout moved, nothing went away.
|
||||
# 3:13:0: revision-only bump. htsstrings.h's StringRoomTotal grew saturation in
|
||||
# its macro body; no installed struct moved and no export came or went.
|
||||
# 3:12:0: revision-only bump. httrackp gained a tail field (singlefile_state) and
|
||||
@@ -44,7 +46,7 @@ AM_INIT_AUTOMAKE([subdir-objects])
|
||||
# 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:13:0"
|
||||
VERSION_INFO="3:14:0"
|
||||
AM_MAINTAINER_MODE
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
|
||||
9
debian/changelog
vendored
@@ -1,3 +1,12 @@
|
||||
httrack (3.49.21-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release: a site answering to several hostnames can now be
|
||||
mirrored once rather than once per name, plus fixes to mirror
|
||||
interruption, to an update pass that purged files it had never reached,
|
||||
and to several buffer overflows; full list in history.txt.
|
||||
|
||||
-- Xavier Roche <xavier@debian.org> Wed, 12 Aug 2026 15:05:15 +0200
|
||||
|
||||
httrack (3.49.20-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release: an off-site link that looked like a file could pull
|
||||
|
||||
18
history.txt
@@ -4,6 +4,24 @@ HTTrack Website Copier release history:
|
||||
|
||||
This file lists all changes and fixes that have been made for HTTrack
|
||||
|
||||
3.49-21
|
||||
+ New: --host-alias (-%C) folds the several hostnames of one site onto a single canonical host, so a site that answers under more than one hostname is fetched once instead of once per name (#16)
|
||||
+ New: the WebHTTrack wizard can set the host-alias rules and the guide documents them for every front end; a malformed rule is refused where it can still be corrected, through a newly exported hts_host_alias_rule_ok() (#1161, #1172, #1192)
|
||||
+ Fixed: any signal caught during a mirror killed every transfer in flight, so a burst of them silently truncated the mirror; a stop now ends an HTTP transfer as the user's stop rather than a fabricated receive error (#1110)
|
||||
+ Fixed: stopping an FTP transfer against a silent server waited out --timeout twice, once on the data socket and again on a QUIT reply nobody was going to send (#1096)
|
||||
+ Fixed: a crawl that ended early ran --update's purge against the files it had never reached, deleting good ones (#1109)
|
||||
+ Fixed: a long URL overflowed the duplicate-detection key buffer (#1160)
|
||||
+ Fixed: a long command line, a large doit.log or a large .httrackrc aborted the engine while it rebuilt its arguments (#1189, #1198)
|
||||
+ Fixed: a scan rule beginning with a dash ended the whole run (#1179)
|
||||
+ Fixed: --index=0 and --noindex enabled the index rather than disabling it, and --purge-old=1 killed the run; an option that takes no value now refuses one instead of silently dropping it (#1195, #1200)
|
||||
+ Fixed: reloading a WebHTTrack project lost every zero and every cleared field, so a rate limit of 0 came back as 100 KB/s and a cleared user-agent refilled itself (#1177, #1171, #1186)
|
||||
+ Fixed: the wizard kept only the last of several --strip-query rules, and its domain answers matched beyond the domain they named (#1168, #1119)
|
||||
+ Fixed: the offer to resume an interrupted mirror printed the program path instead of the command line it would rerun (#1204)
|
||||
+ Fixed: the build failed where getrandom() has no declaration, and the installed headers did not compile under some include orders (#1139, #1150, #1151)
|
||||
+ Changed: the documentation and the WebHTTrack pages compute their copyright year instead of carrying a fixed one (#1163, #1165)
|
||||
+ Changed: refreshed the guide screenshots for all three interfaces, and repaired the documentation's dark mode and its search-target tabs (#1164, #1158)
|
||||
+ Changed: multiple internal hardening, build, test and CI improvements
|
||||
|
||||
3.49-20
|
||||
+ Fixed: a link to another host whose name looked like a file was scanned as a page, so one link could mirror the whole foreign site on the referring page's depth budget (#121)
|
||||
+ Fixed: a size-bounded filter built both of its filter URLs wrong when the path had no leading slash (#1095)
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -534,9 +536,14 @@ And then, put the email address in your pages through:
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -75,8 +77,8 @@ 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>
|
||||
<li>Standard <a href="http://www.pkware.com/products/enterprise/white_papers/appnote.txt" target="_blank">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="_blank">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 />
|
||||
@@ -84,7 +86,7 @@ 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 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="_blank">HTTP</a> headers fields. See also <a href="http://www.ietf.org/rfc/rfc2396.txt?number=2396" target="_blank">RFC</a>.</li><br />
|
||||
<li>The ZIP file timestamp follows the "Last-Modified-Since" field given for this URL, if any</li>
|
||||
</ul>
|
||||
|
||||
@@ -230,9 +232,14 @@ Libraries should generally handle this peculiar format, however.
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -211,9 +213,14 @@ scope: both change what a mirror directory contains.</li>
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -117,6 +119,7 @@ the index" problems disappear.</p>
|
||||
<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>--host-alias (-%C)</tt></td><td>Declares that several hostnames serve the same site, for example <tt>--host-alias "www2.example.com,m.example.com=example.com"</tt>. Those names then count as the starting host: their links travel under the same-address rules, are fetched from the canonical host, and are saved once rather than once per name. The left side takes filter-style globs and comma-separated names, the right side one literal host, port included. Either side may name a scheme (<tt>legacy.example.com=https://example.com</tt> reaches a host that only answers over HTTPS, and <tt>https://www.example.com=ftp://files.example.com</tt> matches only the HTTPS form). A path is refused: this maps hosts, not URLs.</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>
|
||||
@@ -146,7 +149,9 @@ 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>
|
||||
lands you on a different host, and same-host scope stops the crawl there. Start
|
||||
from the final URL, or add a filter that re-admits the real host (see
|
||||
<a href="#filters">Filters</a>). The log will show the redirect.</p>
|
||||
<a href="#filters">Filters</a>). The log will show the redirect. When both names
|
||||
really are one site, <tt>--host-alias</tt> says so once and the mirror stops
|
||||
depending on which one you started from.</p>
|
||||
|
||||
<p><tt>-n</tt> is the fix for pages that render locally without their images or
|
||||
stylesheets: it lets HTTrack pull in requisites that sit just outside scope. Note
|
||||
@@ -503,9 +508,14 @@ all disabled.</small></p>
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -23,12 +23,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -206,9 +208,14 @@ roche at httrack dot com (Xavier ROCHE)<br>
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -103,9 +105,14 @@ compared to the previous mirror. This page describes that file.
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
28
html/doc.css
@@ -121,11 +121,17 @@ body {
|
||||
}
|
||||
|
||||
/* Colour inherited: nothing lighter than --ink reaches 4.5:1 on the --field
|
||||
this sits on, and at .8em it is small text. */
|
||||
this sits on, and at this size it is small text. */
|
||||
/* Mirrors site.css's .sitefooter: flush on the panel's black edge, chicklet at the far end. */
|
||||
footer {
|
||||
max-width: 68rem;
|
||||
margin: .5rem auto 0;
|
||||
margin: 0 auto;
|
||||
font-size: .8em;
|
||||
line-height: 1.3;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
@@ -360,8 +366,26 @@ dialog#zoom::backdrop { background: rgba(0, 0, 0, .8); }
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
/* Some browsers still apply prefers-color-scheme: dark when printing, so the ink
|
||||
comes out #e6e6ee on white paper. Reset the palette, not each rule reading it. */
|
||||
@media print {
|
||||
: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);
|
||||
}
|
||||
|
||||
body { background: #fff; }
|
||||
.toc, .filter { display: none; }
|
||||
.wrap { display: block; border: 0; }
|
||||
/* Not a token, same paper: the dark scheme inverts the wordmark to white. */
|
||||
.masthead img { filter: none; }
|
||||
}
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -318,7 +320,7 @@ However, be sure to always download HTTrack from a <b>trusted source</b> (prefer
|
||||
|
||||
<br><br><a NAME="QG0c">Q: <strong>This software is 'free', but I bought it from an authorized reseller . What's going on?</strong></a><br>
|
||||
A: <em>
|
||||
HTTrack is free (free as in 'freedom') as it is covered by the <a href="http://www.gnu.org/licenses/gpl.txt" target="_new">GNU General Public License (GPL)</a>.
|
||||
HTTrack is free (free as in 'freedom') as it is covered by the <a href="http://www.gnu.org/licenses/gpl.txt" target="_blank">GNU General Public License (GPL)</a>.
|
||||
You can freely download it, without paying any fees, copy it to your friends, and modify it if you respect the license.
|
||||
There are NO official/authorized resellers, because HTTrack is <b>NOT</b> a commercial product.
|
||||
But you can be charged for duplication fees, or any other services (example: software CDroms or shareware collections, or fees for maintenance),
|
||||
@@ -881,9 +883,14 @@ A: <em>Feel free to <a href="contact.html">contact us</a>!
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -174,7 +176,7 @@ Action options:
|
||||
|
||||
Proxy options:
|
||||
P proxy use (-P proxy:port or -P user:pass@proxy:port) (--proxy <param>)
|
||||
%f *use proxy for ftp (f0 don't use) (--httpproxy-ftp[=N])
|
||||
%f *use proxy for ftp (f0 don't use) (--httpproxy-ftp[=0])
|
||||
|
||||
Limits options:
|
||||
rN set the mirror depth to N (* r9999) (--depth[=N])
|
||||
@@ -195,7 +197,7 @@ Flow control:
|
||||
HN host is abandoned if: 0=never, 1=timeout, 2=slow, 3=timeout or slow (--host-control[=N])
|
||||
|
||||
Links options:
|
||||
%P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (--extended-parsing[=N])
|
||||
%P *extended parsing, attempt to parse all links, even in unknown tags or Javascript (%P0 don't use) (--extended-parsing[=0])
|
||||
n get non-html files 'near' an html file (ex: an image located outside) (--near)
|
||||
t test all URLs (even forbidden ones) (--test)
|
||||
%L <file> add all URL located in this text file (one URL per line) (--list <param>)
|
||||
@@ -209,7 +211,7 @@ Build options:
|
||||
%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 *save the server's error pages (404..) (o0 discard them) (--generate-errors)
|
||||
X *purge old files after update (X0 keep delete) (--purge-old[=N])
|
||||
X *purge old files after update (X0 keep delete) (--purge-old[=0])
|
||||
|
||||
Spider options:
|
||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
|
||||
@@ -2669,9 +2671,14 @@ for only 2 simultaneous sesions.
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -416,9 +418,14 @@ See also: The <a href="faq.html#VF1">FAQ</a><br>
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -629,7 +629,7 @@ bottom are the ones that keep you welcome.</p>
|
||||
|
||||
<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="1541">
|
||||
<img data-for="web" src="img/guide-web-opt-spider.png" alt="WebHTTrack Spider tab" width="1024" height="1770">
|
||||
<img data-for="droid" src="img/guide-droid-opt-spider.png" alt="Android Spider tab" width="600" height="1300">
|
||||
</figure>
|
||||
|
||||
@@ -703,11 +703,23 @@ bottom are the ones that keep you welcome.</p>
|
||||
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" data-for="win web droid">
|
||||
<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>
|
||||
parameters that change nothing. You can scope a rule to the addresses it covers, for example
|
||||
<code>shop.example.com/*=sid</code>.</p>
|
||||
<p data-for="web">The box takes one rule per line. Only the last matching rule applies, so keep
|
||||
the keys for one scope together on a line rather than on lines of their own.</p>
|
||||
</div>
|
||||
|
||||
<div class="opt" data-for="win web droid">
|
||||
<div class="opt-head"><span class="opt-name">Host aliases</span><span class="cli">-%C, --host-alias</span></div>
|
||||
<p>Names the other hostnames one site answers to, one rule per line, written
|
||||
<code>www2.example.com,m.example.com=example.com</code>. They fold onto that host: their links
|
||||
travel under the same rules and each page is saved once instead of once per name. Either side may
|
||||
carry a scheme, as in <code>legacy.example.com=https://example.com</code>. A trailing slash is
|
||||
ignored, but a path is refused: this maps hosts, not addresses.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -915,7 +927,12 @@ are how you widen a crawl deliberately.</p>
|
||||
|
||||
<dialog id="zoom" aria-label="Enlarged screenshot"><img src="" alt=""></dialog>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -76,7 +76,7 @@ offline browser : copy websites to a local directory</p>
|
||||
[ <b>-w, --mirror</b> ] [ <b>-W, --mirror-wizard</b> ] [
|
||||
<b>-g, --get-files</b> ] [ <b>-i, --continue</b> ] [ <b>-Y,
|
||||
--mirrorlinks</b> ] [ <b>-P, --proxy</b> ] [ <b>-%f,
|
||||
--httpproxy-ftp[=N]</b> ] [ <b>-%b, --bind</b> ] [ <b>-rN,
|
||||
--httpproxy-ftp[=0]</b> ] [ <b>-%b, --bind</b> ] [ <b>-rN,
|
||||
--depth[=N]</b> ] [ <b>-%eN, --ext-depth[=N]</b> ] [ <b>-mN,
|
||||
--max-files[=N]</b> ] [ <b>-MN, --max-size[=N]</b> ] [
|
||||
<b>-EN, --max-time[=N]</b> ] [ <b>-AN, --max-rate[=N]</b> ]
|
||||
@@ -85,48 +85,50 @@ offline browser : copy websites to a local directory</p>
|
||||
--sockets[=N]</b> ] [ <b>-TN, --timeout[=N]</b> ] [ <b>-RN,
|
||||
--retries[=N]</b> ] [ <b>-JN, --min-rate[=N]</b> ] [ <b>-HN,
|
||||
--host-control[=N]</b> ] [ <b>-%P,
|
||||
--extended-parsing[=N]</b> ] [ <b>-n, --near</b> ] [ <b>-t,
|
||||
--extended-parsing[=0]</b> ] [ <b>-n, --near</b> ] [ <b>-t,
|
||||
--test</b> ] [ <b>-%L, --list</b> ] [ <b>-%S, --urllist</b>
|
||||
] [ <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>-%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>
|
||||
[ <b>-%N, --delayed-type-check[=N]</b> ] [ <b>-%D,
|
||||
--cached-delayed-type-check[=0]</b> ] [ <b>-%M,
|
||||
--mime-html[=0]</b> ] [ <b>-%Z, --single-file[=0]</b> ] [
|
||||
<b>-LN, --long-names[=N]</b> ] [ <b>-KN,
|
||||
--keep-links[=N]</b> ] [ <b>-x, --replace-external</b> ] [
|
||||
<b>-%x, --disable-passwords[=0]</b> ] [ <b>-%q,
|
||||
--include-query-string[=0]</b> ] [ <b>-%g, --strip-query</b>
|
||||
] [ <b>-%C, --host-alias</b> ] [ <b>-o,
|
||||
--generate-errors[=N]</b> ] [ <b>-X, --purge-old[=0]</b> ] [
|
||||
<b>-%p, --preserve</b> ] [ <b>-%T, --utf8-conversion[=0]</b>
|
||||
] [ <b>-bN, --cookies[=N]</b> ] [ <b>-%K, --cookies-file</b>
|
||||
] [ <b>-%Y, --why</b> ] [ <b>-u, --check-type[=N]</b> ] [
|
||||
<b>-j, --parse-java[=N]</b> ] [ <b>-sN, --robots[=N]</b> ] [
|
||||
<b>-%h, --http-10</b> ] [ <b>-%k, --keep-alive</b> ] [
|
||||
<b>-%z, --disable-compression</b> ] [ <b>-%B, --tolerant</b>
|
||||
] [ <b>-%s, --updatehack</b> ] [ <b>-%u, --urlhack</b> ] [
|
||||
<b>-%A, --assume</b> ] [ <b>-@iN, --protocol[=N]</b> ] [
|
||||
<b>-%w, --disable-module</b> ] [ <b>-F, --user-agent</b> ] [
|
||||
<b>-%R, --referer</b> ] [ <b>-%E, --from</b> ] [ <b>-%F,
|
||||
--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>-%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>-%h, --http-10[=0]</b> ] [ <b>-%k, --keep-alive[=0]</b> ]
|
||||
[ <b>-%z, --disable-compression[=0]</b> ] [ <b>-%B,
|
||||
--tolerant[=0]</b> ] [ <b>-%s, --updatehack[=0]</b> ] [
|
||||
<b>-%u, --urlhack[=0]</b> ] [ <b>-%A, --assume</b> ] [
|
||||
<b>-@iN, --protocol[=N]</b> ] [ <b>-%w, --disable-module</b>
|
||||
] [ <b>-F, --user-agent</b> ] [ <b>-%R, --referer</b> ] [
|
||||
<b>-%E, --from</b> ] [ <b>-%F, --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>-%d,
|
||||
--changes[=0]</b> ] [ <b>-%n, --do-not-recatch[=0]</b> ] [
|
||||
<b>-%v, --display[=N]</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[=0]</b> ] [ <b>-%i, --build-top-index[=0]</b> ] [
|
||||
<b>-%I, --search-index[=N]</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>-%!,
|
||||
--disable-security-limits</b> ] [ <b>-V, --userdef-cmd</b> ]
|
||||
[ <b>-%W, --callback</b> ] [ <b>-y,
|
||||
--background-on-suspend</b> ] [ <b>-K, --keep-links[=N]</b>
|
||||
]</p>
|
||||
--disable-security-limits[=0]</b> ] [ <b>-V,
|
||||
--userdef-cmd</b> ] [ <b>-%W, --callback</b> ] [ <b>-y,
|
||||
--background-on-suspend[=0]</b> ] [ <b>-K,
|
||||
--keep-links[=N]</b> ]</p>
|
||||
|
||||
<h2>DESCRIPTION
|
||||
<a name="DESCRIPTION"></a>
|
||||
@@ -297,7 +299,7 @@ httrack --continue</b></p>
|
||||
|
||||
|
||||
<p>*use proxy for ftp (f0 don’t use)
|
||||
(--httpproxy-ftp[=N])</p> </td></tr>
|
||||
(--httpproxy-ftp[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -529,7 +531,7 @@ errors (*R1) (--retries[=N])</p></td></tr>
|
||||
|
||||
<p style="margin-top: 1em">*extended parsing, attempt to
|
||||
parse all links, even in unknown tags or Javascript (%P0
|
||||
don’t use) (--extended-parsing[=N])</p></td></tr>
|
||||
don’t use) (--extended-parsing[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -635,7 +637,7 @@ structure, 1+: see below) (--structure[=N])</p></td></tr>
|
||||
make any link test but wait for files download to start
|
||||
instead (experimental) (%N0 don’t use, %N1 use for
|
||||
unknown extensions, * %N2 always use)
|
||||
(--delayed-type-check)</p> </td></tr>
|
||||
(--delayed-type-check[=N])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -648,7 +650,7 @@ unknown extensions, * %N2 always use)
|
||||
|
||||
<p>cached delayed type check, don’t wait for remote
|
||||
type during updates, to speedup them (%D0 wait, * %D1
|
||||
don’t wait) (--cached-delayed-type-check)</p></td></tr>
|
||||
don’t wait) (--cached-delayed-type-check[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -660,7 +662,7 @@ don’t wait) (--cached-delayed-type-check)</p></td></tr>
|
||||
|
||||
|
||||
<p>generate a RFC MIME-encapsulated full-archive (.mht)
|
||||
(--mime-html)</p> </td></tr>
|
||||
(--mime-html[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -678,7 +680,7 @@ 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>
|
||||
shared asset stored once (--single-file[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -740,7 +742,8 @@ absolute URI links, K5 transparent proxy link)
|
||||
|
||||
|
||||
<p>do not include any password for external password
|
||||
protected websites (%x0 include) (--disable-passwords)</p></td></tr>
|
||||
protected websites (%x0 include)
|
||||
(--disable-passwords[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -753,7 +756,7 @@ protected websites (%x0 include) (--disable-passwords)</p></td></tr>
|
||||
|
||||
<p>*include query string for local files (useless, for
|
||||
information purpose only) (%q0 don’t include)
|
||||
(--include-query-string)</p> </td></tr>
|
||||
(--include-query-string[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -772,13 +775,26 @@ information purpose only) (%q0 don’t include)
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-%C</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>fold other hostnames of one site onto it
|
||||
([scheme://]alias[,...]=[scheme://]host) (--host-alias
|
||||
<param>)</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
|
||||
|
||||
<p>-o</p></td>
|
||||
<td width="5%"></td>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>*save the server’s error pages (404..) (o0 discard
|
||||
them) (--generate-errors)</p></td></tr>
|
||||
them) (--generate-errors[=N])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -790,7 +806,7 @@ them) (--generate-errors)</p></td></tr>
|
||||
|
||||
|
||||
<p>*purge old files after update (X0 keep delete)
|
||||
(--purge-old[=N])</p> </td></tr>
|
||||
(--purge-old[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -813,7 +829,7 @@ them) (--generate-errors)</p></td></tr>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>links conversion to UTF-8 (--utf8-conversion)</p></td></tr>
|
||||
<p>links conversion to UTF-8 (--utf8-conversion[=0])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<h3>Spider options:
|
||||
@@ -909,7 +925,7 @@ rules)) (--robots[=N])</p></td></tr>
|
||||
|
||||
|
||||
<p>force HTTP/1.0 requests (reduce update features, only
|
||||
for old servers or proxies) (--http-10)</p></td></tr>
|
||||
for old servers or proxies) (--http-10[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -922,7 +938,7 @@ for old servers or proxies) (--http-10)</p></td></tr>
|
||||
|
||||
<p>use keep-alive if possible, greately reducing latency
|
||||
for small files and test requests (%k0 don’t use)
|
||||
(--keep-alive)</p> </td></tr>
|
||||
(--keep-alive[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -934,7 +950,7 @@ for small files and test requests (%k0 don’t use)
|
||||
|
||||
|
||||
<p>do not request compressed content (%z0 request)
|
||||
(--disable-compression)</p> </td></tr>
|
||||
(--disable-compression[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -946,7 +962,7 @@ for small files and test requests (%k0 don’t use)
|
||||
|
||||
|
||||
<p>tolerant requests (accept bogus responses on some
|
||||
servers, but not standard!) (--tolerant)</p></td></tr>
|
||||
servers, but not standard!) (--tolerant[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -959,7 +975,7 @@ servers, but not standard!) (--tolerant)</p></td></tr>
|
||||
|
||||
<p>update hacks: various hacks to limit re-transfers when
|
||||
updating (identical size, bogus response..)
|
||||
(--updatehack)</p> </td></tr>
|
||||
(--updatehack[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -971,7 +987,7 @@ updating (identical size, bogus response..)
|
||||
|
||||
|
||||
<p>url hacks: various hacks to limit duplicate URLs (strip
|
||||
//, www.foo.com==foo.com..) (--urlhack)</p></td></tr>
|
||||
//, www.foo.com==foo.com..) (--urlhack[=0])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<p style="margin-left:18%;">opt out of one url-hack part:
|
||||
@@ -1186,7 +1202,7 @@ past N bytes, --warc-cdx also writes a sorted CDXJ index,
|
||||
|
||||
<p>write hts-changes.json listing what this crawl left new,
|
||||
changed, unchanged and gone compared to the previous mirror
|
||||
(--changes)</p> </td></tr>
|
||||
(--changes[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1198,7 +1214,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
|
||||
|
||||
<p>do not re-download locally erased files
|
||||
(--do-not-recatch)</p> </td></tr>
|
||||
(--do-not-recatch[=0])</p> </td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1210,7 +1226,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
|
||||
|
||||
<p>display on screen filenames downloaded (in realtime) - *
|
||||
%v1 short version - %v2 full animation (--display)</p></td></tr>
|
||||
%v1 short version - %v2 full animation (--display[=N])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1298,7 +1314,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>*make an index (I0 don’t make) (--index)</p></td></tr>
|
||||
<p>*make an index (I0 don’t make) (--index[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1310,7 +1326,7 @@ changed, unchanged and gone compared to the previous mirror
|
||||
|
||||
|
||||
<p>make a top index for a project folder (* %i0 don’t
|
||||
make) (--build-top-index)</p></td></tr>
|
||||
make) (--build-top-index[=0])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="4%">
|
||||
@@ -1322,7 +1338,7 @@ make) (--build-top-index)</p></td></tr>
|
||||
|
||||
|
||||
<p>make an searchable index for this mirror (* %I0
|
||||
don’t make) (--search-index)</p></td></tr>
|
||||
don’t make) (--search-index[=N])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<h3>Expert options:
|
||||
@@ -1627,7 +1643,7 @@ with -#test=NAME [args])</p></td></tr>
|
||||
<td width="82%">
|
||||
|
||||
|
||||
<p>wait time (--advanced-wait)</p></td></tr>
|
||||
<p>wait time (--advanced-wait[=N])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="9%"></td>
|
||||
<td width="8%">
|
||||
@@ -1661,7 +1677,7 @@ with -#test=NAME [args])</p></td></tr>
|
||||
|
||||
<p style="margin-top: 1em">bypass built-in security limits
|
||||
aimed to avoid bandwidth abuses (bandwidth, simultaneous
|
||||
connections) (--disable-security-limits)</p></td></tr>
|
||||
connections) (--disable-security-limits[=0])</p></td></tr>
|
||||
</table>
|
||||
|
||||
<p style="margin-left:18%;">IMPORTANT NOTE: DANGEROUS
|
||||
@@ -1711,7 +1727,7 @@ myfoo.so[,myparameters]) (--callback <param>)</p></td></tr>
|
||||
|
||||
|
||||
<p>go to background when suspended (y0 don’t)
|
||||
(--background-on-suspend)</p> </td></tr>
|
||||
(--background-on-suspend[=0])</p> </td></tr>
|
||||
</table>
|
||||
|
||||
<h3>Details: Option N
|
||||
|
||||
BIN
html/images/esp_chicklet.png
Normal file
|
After Width: | Height: | Size: 842 B |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
@@ -110,7 +110,12 @@ not own.</p>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<footer>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</footer>
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -73,9 +75,14 @@ You may also want to check the <tt>httrack.c</tt> and <tt>httrack.h<tt> files to
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -279,9 +281,14 @@ httrack --wrapper mylibrary,myparameter-string http://www.example.com
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -155,9 +157,14 @@ Below additional function names that can be defined inside the optional libhttra
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -13,12 +13,14 @@
|
||||
<body>
|
||||
|
||||
<!-- doc-chrome:top -->
|
||||
<!-- doc-chrome:masthead -->
|
||||
<a class="skip" href="#main">Skip to content</a>
|
||||
|
||||
<header class="masthead">
|
||||
<img src="images/wordmark.svg" width="400" height="36" alt="HTTrack Website Copier">
|
||||
<div class="tagline">Free software offline browser</div>
|
||||
</header>
|
||||
<!-- /doc-chrome:masthead -->
|
||||
|
||||
<div class="wrap">
|
||||
|
||||
@@ -198,9 +200,14 @@ Script example:
|
||||
</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 -->
|
||||
|
||||
<!-- doc-chrome:footer -->
|
||||
<footer>
|
||||
<small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small>
|
||||
<a href="https://endsoftwarepatents.org/innovating-without-patents/" target="_blank" rel="noopener" title="This site is innovating without patents!"><img src="images/esp_chicklet.png" width="91" height="17" alt="End Software Patents"></a>
|
||||
</footer>
|
||||
<!-- /doc-chrome:footer -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -92,7 +92,7 @@ ${LANG_K3} : ${HTTRACK_WEB}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ ${do:end-if}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -43,17 +43,29 @@
|
||||
</developer>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<caption>Choosing which files a mirror includes</caption>
|
||||
<caption>Choosing the addresses and options for a new mirror</caption>
|
||||
<!-- A guide asset, so every screenshot reshoot refreshes this too.
|
||||
appstream-network.yml resolves the URL weekly if the name moves.
|
||||
Not a wizard pane: the walk crawls a loopback server, so every pane
|
||||
showing the address advertises 127.0.0.1 and an ephemeral port. -->
|
||||
<image>https://www.httrack.com/html/img/guide-web-opt-scan-rules.png</image>
|
||||
appstream-network.yml resolves the URL weekly if the name moves; it
|
||||
cannot see a stale deploy, since the name survives a reshoot. -->
|
||||
<image>https://www.httrack.com/html/img/guide-web-project-setup.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1"/>
|
||||
<!-- Newest first; tests/01_engine-version-macros.test enforces it. -->
|
||||
<releases>
|
||||
<release version="3.49.21" date="2026-08-12">
|
||||
<description>
|
||||
<ul>
|
||||
<li>A site that answers to several names is mirrored once, instead of once per name</li>
|
||||
<li>Stopping a mirror ends the transfers under way instead of reporting them as network errors</li>
|
||||
<li>A mirror that ends early no longer deletes files the update pass never reached</li>
|
||||
<li>Reloading a project keeps the boxes you cleared and the values you set to zero</li>
|
||||
<li>Clearing the option to build an index page now turns it off</li>
|
||||
<li>A very long address, or a very large settings file, no longer stops the mirror</li>
|
||||
<li>Refreshed screenshots throughout the documentation</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="3.49.20" date="2026-08-10">
|
||||
<description>
|
||||
<ul>
|
||||
|
||||
@@ -72,7 +72,7 @@ ${html:error}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ function info(str) {
|
||||
${do:output-mode:html-urlescaped}
|
||||
href="file://${path}/"
|
||||
${do:output-mode:}
|
||||
target="_new">
|
||||
target="_blank">
|
||||
${LANG_D8}
|
||||
</a>
|
||||
</td></tr>
|
||||
@@ -96,7 +96,7 @@ ${do:loadhash}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -99,12 +99,12 @@ ${do:end-if}
|
||||
|
||||
${LANG_G8} :
|
||||
${/* an http: page cannot navigate to file:, so the mirror is reached through the server */}
|
||||
<a href="/website/index.html" target="_new">
|
||||
<a href="/website/index.html" target="_blank">
|
||||
${html:path}/${html:projname}
|
||||
</a></li>
|
||||
<ul>
|
||||
<li><a href="/website/index.html" target="_new">${LANG_D8}</a></li>
|
||||
<li><a href="/website/hts-log.txt" target="_new">${LANG_D4}</a></li>
|
||||
<li><a href="/website/index.html" target="_blank">${LANG_D8}</a></li>
|
||||
<li><a href="/website/hts-log.txt" target="_blank">${LANG_D4}</a></li>
|
||||
</ul>
|
||||
|
||||
<form method="POST" action="exit.html" name="form">
|
||||
@@ -143,7 +143,7 @@ ${html:path}/${html:projname}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ function info(str) {
|
||||
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white" href="about.html" target="_new"
|
||||
<a style="background:black;color: white" href="about.html" target="_blank"
|
||||
title='${html:LANG_G21}' onMouseOver="info('${js:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_O16}...
|
||||
@@ -66,7 +66,7 @@ ${LANG_O16}...
|
||||
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white"
|
||||
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${attr:HTTRACK_VERSIONID}&VersionStr=${attr:HTTRACK_VERSION}&Platform=${attr:HTS_PLATFORM}&LanguageId=${attr:lang}" target="_new"
|
||||
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${attr:HTTRACK_VERSIONID}&VersionStr=${attr:HTTRACK_VERSION}&Platform=${attr:HTS_PLATFORM}&LanguageId=${attr:lang}" target="_blank"
|
||||
title='${html:LANG_O17}' onMouseOver="info('${js:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_O17}...
|
||||
@@ -77,7 +77,7 @@ ${/* show help only if available */}
|
||||
${do:if-file-exists:html/index.html}
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white"
|
||||
href="/index.html" target="_new"
|
||||
href="/index.html" target="_blank"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${js:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_P16}
|
||||
@@ -103,7 +103,7 @@ ${do:end-if}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ ${LANG_THANKYOU}!
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@ ${do:end-if}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ ${LANG_IOPT10}:
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -250,7 +250,7 @@ ${LANG_W3}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -191,7 +191,7 @@ ${listid:build:LISTDEF_3}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@ ${do:output-mode:}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -194,7 +194,7 @@ ${listid:travel3:LISTDEF_11}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -189,7 +189,7 @@ ${LANG_I46}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -228,7 +228,7 @@ ${LANG_I64b}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ ${LANG_I43b}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@ ${LANG_B13}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -181,9 +181,17 @@ ${LANG_SITEMAPURL}
|
||||
<br><br>
|
||||
|
||||
${LANG_STRIPQUERY}
|
||||
<input name="stripquery" value="${attr:stripquery}" size="40"
|
||||
<br>
|
||||
<textarea name="stripquery" cols="60" rows="4"
|
||||
title='${html:LANG_STRIPQUERYTIP}' onMouseOver="info('${js:LANG_STRIPQUERYTIP}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
>${do:output-mode:html}${stripquery}${do:output-mode:}</textarea>
|
||||
<br><br>
|
||||
|
||||
${LANG_HOSTALIAS}
|
||||
<br>
|
||||
<textarea name="hostalias" cols="60" rows="4"
|
||||
title='${html:LANG_HOSTALIASTIP}' onMouseOver="info('${js:LANG_HOSTALIASTIP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${do:output-mode:html}${hostalias}${do:output-mode:}</textarea>
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="toler" ${checked:toler}
|
||||
@@ -235,7 +243,7 @@ ${LANG_STRIPQUERY}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ ${listid:logtype:LISTDEF_9}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ ${LANG_H20} ${html:info.currentjob}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -99,9 +99,6 @@ ${do:if-file-exists:html/index.html}
|
||||
${do:end-if}
|
||||
</tr></table>
|
||||
|
||||
${/* Default values for empty settings */}
|
||||
${do:set:cache:1}
|
||||
|
||||
${/* Convert winprofile.ini into internal variables */}
|
||||
${do:copy:CurrentUrl:urls}
|
||||
${do:copy:Category:projcateg}
|
||||
@@ -140,6 +137,7 @@ ${do:copy:KeepWww:keepwww}
|
||||
${do:copy:KeepSlashes:keepslashes}
|
||||
${do:copy:KeepQueryOrder:keepqueryorder}
|
||||
${do:copy:StripQuery:stripquery}
|
||||
${do:copy:HostAlias:hostalias}
|
||||
${do:copy:StoreAllInCache:cache2}
|
||||
${do:copy:Sitemap:sitemap}
|
||||
${do:copy:SitemapUrl:sitemapurl}
|
||||
@@ -293,7 +291,7 @@ ${do:end-if:}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ ${do:output-mode:}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ ${do:end-if}${do:output-mode:html}
|
||||
${test:hidequery:--include-query-string=1:--include-query-string=0}
|
||||
${test:nopurge:--purge-old=1:--purge-old=0}
|
||||
\
|
||||
${test:cache:--cache=0:}
|
||||
${ztest:cache:--cache=0:}
|
||||
${test:filter::--priority=0:--priority=1:--priority=2:--priority=7}
|
||||
${test:travel::--stay-on-same-dir:--can-go-down:--can-go-up:--can-go-up-and-down}
|
||||
${test:travel2::--stay-on-same-address:--stay-on-same-domain:--stay-on-same-tld:--go-everywhere}
|
||||
@@ -179,13 +179,14 @@ ${/* -m<n> resets the html limit, so the bare form must precede the -m,<n> one *
|
||||
${ztest:cookies:--cookies=0:}
|
||||
${ztest:parsejava:--parse-java=0:}
|
||||
${test:updhack:--updatehack}
|
||||
${test:urlhack:--urlhack=0:--urlhack}
|
||||
${ztest:urlhack:--urlhack=0:--urlhack}
|
||||
${test:keepwww:--keep-www-prefix}
|
||||
${test:keepslashes:--keep-double-slashes}
|
||||
${test:keepqueryorder:--keep-query-order}
|
||||
${test:cookiesfile:--cookies-file "}${arg:cookiesfile}${test:cookiesfile:"}
|
||||
${test:pausefiles:--pause "}${arg:pausefiles}${test:pausefiles:"}
|
||||
${test:stripquery:--strip-query "}${arg:stripquery}${test:stripquery:"}
|
||||
${arglist:stripquery:--strip-query}
|
||||
${arglist:hostalias:--host-alias}
|
||||
${test:toler:--tolerant}
|
||||
${test:http10:--http-10}
|
||||
${test:cache2:--store-all-in-cache}
|
||||
@@ -202,8 +203,8 @@ ${/* -m<n> resets the html limit, so the bare form must precede the -m,<n> one *
|
||||
${test:norecatch:--do-not-recatch}
|
||||
${test:logf:--single-log}
|
||||
${test:logtype:::--extra-log:--debug-log}
|
||||
${test:index:--index=0:}
|
||||
${test:index2:--search-index=0:--search-index}
|
||||
${ztest:index:--index=0:}
|
||||
${ztest:index2:--search-index=0:--search-index}
|
||||
${test:prox:--proxy "}${do:if-not-empty:prox}${test:proxytype::socks5:connect}${test:proxytype:\3A//}${do:end-if}${do:output-mode:html}${arg:prox}${test:prox:\3A}${arg:portprox}${test:prox:"}
|
||||
${test:ftpprox:--httpproxy-ftp=0:--httpproxy-ftp}
|
||||
</textarea>
|
||||
@@ -248,6 +249,7 @@ KeepWww=${ztest:keepwww:0:1}
|
||||
KeepSlashes=${ztest:keepslashes:0:1}
|
||||
KeepQueryOrder=${ztest:keepqueryorder:0:1}
|
||||
StripQuery=${stripquery}
|
||||
HostAlias=${hostalias}
|
||||
StoreAllInCache=${ztest:cache2:0:1}
|
||||
Sitemap=${ztest:sitemap:0:1}
|
||||
SitemapUrl=${sitemapurl}
|
||||
@@ -346,7 +348,7 @@ ${do:output-mode:}
|
||||
|
||||
<table width="76%" border="0" align="center" valign="bottom" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td id="footer"><small><small>© 1998-2026 Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
<td id="footer"><small><small>© 1998-${date:year} Xavier Roche & other contributors - Web Design: Leto Kauler.</small></small></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
4
lang.def
@@ -1034,6 +1034,10 @@ LANG_STRIPQUERY
|
||||
Strip query keys:
|
||||
LANG_STRIPQUERYTIP
|
||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
||||
LANG_HOSTALIAS
|
||||
Host aliases:
|
||||
LANG_HOSTALIASTIP
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
LANG_WARC
|
||||
Write a WARC archive of the crawl
|
||||
LANG_WARCTIP
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Íàé-ãîëÿì ðàçìåð íà WARC ñåãìåíò:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Çàïî÷âàíå íà íîâ WARC ñåãìåíò, êîãàòî òåêóùèÿò íàäõâúðëè òîçè áðîé áàéòîâå; îñòàâåòå ïðàçíî èëè 0 çà åäèí ôàéë.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Tamaño máximo de segmento WARC:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Empezar un nuevo segmento WARC cuando el actual supere este número de bytes; déjelo en blanco o 0 para un solo archivo.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Nejvìtší velikost segmentu WARC:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Zaèít nový segment WARC, jakmile aktuální pøekroèí tento poèet bajtù; ponechte prázdné nebo 0 pro jeden soubor.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
WARC 分段大小上限:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
目前分段超過此位元組數時開始新的 WARC 分段;留空或填 0 則保持單一檔案。
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
WARC 分段大小上限:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
当前分段超过该字节数时开始新的 WARC 分段;留空或填 0 则保持单个文件。
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Najveæa velièina WARC segmenta:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Zapoèni novi WARC segment kada trenutni prijeðe ovaj broj bajtova; ostavite prazno ili 0 za jednu datoteku.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1044,3 +1044,7 @@ WARC segment size limit:
|
||||
Største størrelse på WARC-segment:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Begynd et nyt WARC-segment, når det aktuelle overstiger dette antal byte; lad feltet stå tomt eller skriv 0 for én fil.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Maximale Größe eines WARC-Segments:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Ein neues WARC-Segment beginnen, sobald das aktuelle diese Anzahl Bytes überschreitet; leer lassen oder 0 für eine einzige Datei.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
WARC-segmendi suurim maht:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Alusta uut WARC-segmenti, kui praegune ületab selle baitide arvu; jäta tühjaks või 0, et hoida üks fail.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1044,3 +1044,7 @@ WARC segment size limit:
|
||||
WARC segment size limit:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
WARC-osan enimmäiskoko:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Aloita uusi WARC-osa, kun nykyinen ylittää tämän tavumäärän; jätä tyhjäksi tai 0, jolloin tiedosto pysyy yhtenä.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1044,3 +1044,7 @@ WARC segment size limit:
|
||||
Taille maximale d'un segment WARC :
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Commencer un nouveau segment WARC dès que le courant dépasse ce nombre d'octets ; laissez vide ou 0 pour un fichier unique.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Μέγιστο μέγεθος τμήματος WARC:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Έναρξη νέου τμήματος WARC μόλις το τρέχον ξεπεράσει αυτόν τον αριθμό byte. Αφήστε κενό ή 0 για ένα ενιαίο αρχείο.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Dimensione massima del segmento WARC:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Inizia un nuovo segmento WARC quando quello corrente supera questo numero di byte; lascia vuoto o 0 per un solo file.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
WARC セグメントの最大サイズ:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
現在のセグメントがこのバイト数を超えたら新しい WARC セグメントを開始します。空欄または 0 で単一ファイルのままにします。
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||
@@ -1014,3 +1014,7 @@ WARC segment size limit:
|
||||
Íà¼ãîëåìà ãîëåìèíà íà WARC ñåãìåíò:
|
||||
Start a new WARC segment once the current one grows past this many bytes; leave blank or 0 to keep a single file.
|
||||
Çàïî÷íè íîâ WARC ñåãìåíò êîãà òåêîâíèîò <20>å ãî íàäìèíå îâî¼ áðî¼ áà¼òè; îñòàâåòå ïðàçíî èëè 0 çà åäíà äàòîòåêà.
|
||||
Host aliases:
|
||||
Host aliases:
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
Other hostnames serving this same site, folded onto one, one rule per line (e.g. www2.example.com,m.example.com=example.com).
|
||||
|
||||