mirror of
https://github.com/xroche/httrack.git
synced 2026-07-18 06:40:13 +03:00
Compare commits
1 Commits
master
...
fast-cache
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
caf210b295 |
8
.gitattributes
vendored
8
.gitattributes
vendored
@@ -1,8 +0,0 @@
|
|||||||
# Resource scripts are Windows tooling input and must stay CRLF: the engine has no
|
|
||||||
# encoding guard, so an autocrlf checkout could otherwise flatten them silently.
|
|
||||||
*.rc text eol=crlf
|
|
||||||
|
|
||||||
# The test scripts run under Git Bash on the Windows CI; a CRLF checkout makes
|
|
||||||
# bash die on $'\r' on every line of them.
|
|
||||||
*.test text eol=lf
|
|
||||||
*.sh text eol=lf
|
|
||||||
101
.github/workflows/ci.yml
vendored
101
.github/workflows/ci.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
build-essential clang autoconf automake libtool autoconf-archive \
|
build-essential clang autoconf automake libtool autoconf-archive \
|
||||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
zlib1g-dev libssl-dev
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: |
|
run: |
|
||||||
@@ -50,17 +50,12 @@ jobs:
|
|||||||
# committed generated files already let a plain checkout build.
|
# committed generated files already let a plain checkout build.
|
||||||
autoreconf -fi
|
autoreconf -fi
|
||||||
./configure
|
./configure
|
||||||
# a missing decoder would silently drop the coding from Accept-Encoding
|
|
||||||
grep -q "define HTS_USEBROTLI 1" config.h
|
|
||||||
grep -q "define HTS_USEZSTD 1" config.h
|
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: make -j"$(nproc)"
|
run: make -j"$(nproc)"
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: |
|
run: make check
|
||||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
|
||||||
make check -j"$jobs"
|
|
||||||
|
|
||||||
- name: Print the test log on failure
|
- name: Print the test log on failure
|
||||||
if: failure()
|
if: failure()
|
||||||
@@ -85,7 +80,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
build-essential autoconf automake libtool autoconf-archive \
|
build-essential autoconf automake libtool autoconf-archive \
|
||||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
zlib1g-dev libssl-dev
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: |
|
run: |
|
||||||
@@ -104,8 +99,7 @@ jobs:
|
|||||||
sudo find /usr/bin /usr/local/bin -maxdepth 1 -name 'python3*' \
|
sudo find /usr/bin /usr/local/bin -maxdepth 1 -name 'python3*' \
|
||||||
-exec mv {} {}.hidden \;
|
-exec mv {} {}.hidden \;
|
||||||
! command -v python3
|
! command -v python3
|
||||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
make check
|
||||||
make check -j"$jobs"
|
|
||||||
|
|
||||||
- name: Print the test log on failure
|
- name: Print the test log on failure
|
||||||
if: failure()
|
if: failure()
|
||||||
@@ -126,70 +120,25 @@ jobs:
|
|||||||
- name: Install build dependencies
|
- name: Install build dependencies
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
brew install autoconf automake libtool autoconf-archive brotli zstd
|
brew install autoconf automake libtool autoconf-archive
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
ssl="$(brew --prefix openssl@3)"
|
ssl="$(brew --prefix openssl@3)"
|
||||||
brewp="$(brew --prefix)"
|
|
||||||
autoreconf -fi
|
autoreconf -fi
|
||||||
./configure CPPFLAGS="-I${ssl}/include -I${brewp}/include" \
|
./configure CPPFLAGS="-I${ssl}/include" LDFLAGS="-L${ssl}/lib"
|
||||||
LDFLAGS="-L${ssl}/lib -L${brewp}/lib"
|
|
||||||
grep -q "define HTS_USEBROTLI 1" config.h
|
|
||||||
grep -q "define HTS_USEZSTD 1" config.h
|
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: make -j"$(sysctl -n hw.ncpu)"
|
run: make -j"$(sysctl -n hw.ncpu)"
|
||||||
|
|
||||||
- name: Add loopback aliases (macOS lacks 127.0.0.2/.3)
|
|
||||||
# 19_local-connect-fallback needs the dead 127.0.0.2/.3 to refuse
|
|
||||||
# instantly like Linux; alias them onto lo0 so they don't stall to timeout.
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
sudo ifconfig lo0 alias 127.0.0.2 up
|
|
||||||
sudo ifconfig lo0 alias 127.0.0.3 up
|
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: |
|
run: make check
|
||||||
jobs=$(( $(sysctl -n hw.ncpu) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
|
||||||
make check -j"$jobs"
|
|
||||||
|
|
||||||
- name: Print the test log on failure
|
- name: Print the test log on failure
|
||||||
if: failure()
|
if: failure()
|
||||||
run: cat tests/test-suite.log 2>/dev/null || true
|
run: cat tests/test-suite.log 2>/dev/null || true
|
||||||
|
|
||||||
# Runtime smoke of the WebHTTrack launcher on macOS: it carries a Darwin-only
|
|
||||||
# browser path (open -W) and nothing else exercises htsserver. Install into a
|
|
||||||
# temp prefix, then check webhttrack brings up htsserver and serves the UI.
|
|
||||||
webhttrack-macos:
|
|
||||||
name: webhttrack smoke (macOS arm64)
|
|
||||||
runs-on: macos-14
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v6
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Install build dependencies
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
brew install autoconf automake libtool autoconf-archive brotli zstd
|
|
||||||
|
|
||||||
- name: Build and install into a temp prefix
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
ssl="$(brew --prefix openssl@3)"
|
|
||||||
brewp="$(brew --prefix)"
|
|
||||||
autoreconf -fi
|
|
||||||
./configure CPPFLAGS="-I${ssl}/include -I${brewp}/include" \
|
|
||||||
LDFLAGS="-L${ssl}/lib -L${brewp}/lib" \
|
|
||||||
--prefix="$RUNNER_TEMP/inst"
|
|
||||||
make -j"$(sysctl -n hw.ncpu)"
|
|
||||||
make install
|
|
||||||
|
|
||||||
- name: Smoke-test webhttrack
|
|
||||||
run: bash tests/webhttrack-smoke.sh "$RUNNER_TEMP/inst"
|
|
||||||
|
|
||||||
# Portability/hardening: 32-bit (i386) build on the x86-64 runner via multilib
|
# Portability/hardening: 32-bit (i386) build on the x86-64 runner via multilib
|
||||||
# -- no extra hardware. Exercises the 32-bit size_t/pointer ABI, where size
|
# -- no extra hardware. Exercises the 32-bit size_t/pointer ABI, where size
|
||||||
# and bounds math can truncate or wrap in ways 64-bit never reveals (the axis
|
# and bounds math can truncate or wrap in ways 64-bit never reveals (the axis
|
||||||
@@ -210,8 +159,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
build-essential gcc-multilib autoconf automake libtool \
|
build-essential gcc-multilib autoconf automake libtool \
|
||||||
autoconf-archive zlib1g-dev:i386 libssl-dev:i386 \
|
autoconf-archive zlib1g-dev:i386 libssl-dev:i386
|
||||||
libbrotli-dev:i386 libzstd-dev:i386
|
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: |
|
run: |
|
||||||
@@ -223,9 +171,7 @@ jobs:
|
|||||||
run: make -j"$(nproc)"
|
run: make -j"$(nproc)"
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: |
|
run: make check
|
||||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
|
||||||
make check -j"$jobs"
|
|
||||||
|
|
||||||
- name: Print the test log on failure
|
- name: Print the test log on failure
|
||||||
if: failure()
|
if: failure()
|
||||||
@@ -252,7 +198,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
build-essential autoconf automake libtool autoconf-archive \
|
build-essential autoconf automake libtool autoconf-archive \
|
||||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
zlib1g-dev libssl-dev
|
||||||
|
|
||||||
- name: Configure (sanitized)
|
- name: Configure (sanitized)
|
||||||
run: |
|
run: |
|
||||||
@@ -280,9 +226,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ASAN_OPTIONS: detect_leaks=0:abort_on_error=1:halt_on_error=1:strict_string_checks=1:malloc_fill_byte=202:max_malloc_fill_size=2147483647:free_fill_byte=203:max_free_fill_size=2147483647
|
ASAN_OPTIONS: detect_leaks=0:abort_on_error=1:halt_on_error=1:strict_string_checks=1:malloc_fill_byte=202:max_malloc_fill_size=2147483647:free_fill_byte=203:max_free_fill_size=2147483647
|
||||||
UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
|
UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
|
||||||
run: |
|
run: make check
|
||||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
|
||||||
make check -j"$jobs"
|
|
||||||
|
|
||||||
- name: Print the test log on failure
|
- name: Print the test log on failure
|
||||||
if: failure()
|
if: failure()
|
||||||
@@ -328,8 +272,7 @@ jobs:
|
|||||||
# 01_engine-* only; zlib-dependent self-tests are named 01_zlib-* and
|
# 01_engine-* only; zlib-dependent self-tests are named 01_zlib-* and
|
||||||
# skipped here (uninstrumented libz floods MSan with false positives).
|
# skipped here (uninstrumented libz floods MSan with false positives).
|
||||||
tests="$(cd tests && ls 01_engine-*.test | tr '\n' ' ')"
|
tests="$(cd tests && ls 01_engine-*.test | tr '\n' ' ')"
|
||||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
make check TESTS="$tests"
|
||||||
make check -j"$jobs" TESTS="$tests"
|
|
||||||
|
|
||||||
- name: Print the test log on failure
|
- name: Print the test log on failure
|
||||||
if: failure()
|
if: failure()
|
||||||
@@ -354,7 +297,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
build-essential clang autoconf automake libtool autoconf-archive \
|
build-essential clang autoconf automake libtool autoconf-archive \
|
||||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
zlib1g-dev libssl-dev
|
||||||
|
|
||||||
- name: Configure (fuzzers, static)
|
- name: Configure (fuzzers, static)
|
||||||
run: |
|
run: |
|
||||||
@@ -404,9 +347,7 @@ jobs:
|
|||||||
run: make -j"$(nproc)"
|
run: make -j"$(nproc)"
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
run: |
|
run: make check
|
||||||
jobs=$(( $(nproc) * 2 )); [ "$jobs" -le 16 ] || jobs=16
|
|
||||||
make check -j"$jobs"
|
|
||||||
|
|
||||||
- name: Print the test log on failure
|
- name: Print the test log on failure
|
||||||
if: failure()
|
if: failure()
|
||||||
@@ -434,7 +375,7 @@ jobs:
|
|||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
ca-certificates git \
|
ca-certificates git \
|
||||||
build-essential autoconf automake libtool autoconf-archive \
|
build-essential autoconf automake libtool autoconf-archive \
|
||||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
|
zlib1g-dev libssl-dev \
|
||||||
debhelper devscripts lintian fakeroot
|
debhelper devscripts lintian fakeroot
|
||||||
|
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
@@ -478,7 +419,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
build-essential autoconf automake libtool autoconf-archive \
|
build-essential autoconf automake libtool autoconf-archive \
|
||||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
zlib1g-dev libssl-dev
|
||||||
|
|
||||||
- name: distcheck
|
- name: distcheck
|
||||||
run: |
|
run: |
|
||||||
@@ -554,16 +495,6 @@ jobs:
|
|||||||
- name: shfmt
|
- name: shfmt
|
||||||
run: shfmt -d -i 4 $SHELL_SCRIPTS
|
run: shfmt -d -i 4 $SHELL_SCRIPTS
|
||||||
|
|
||||||
# MSBuild rejects a malformed .vcxproj with a bare MSB4025 and no build, so
|
|
||||||
# catch it here in seconds rather than on a Windows runner minutes in.
|
|
||||||
- name: XML well-formedness (MSBuild project files)
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
for f in src/*.vcxproj; do
|
|
||||||
python3 -c "import sys,xml.dom.minidom; xml.dom.minidom.parse(sys.argv[1])" "$f"
|
|
||||||
echo "ok $f"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Check clang-format on CHANGED LINES ONLY. The engine predates clang-format
|
# Check clang-format on CHANGED LINES ONLY. The engine predates clang-format
|
||||||
# (it was shaped by an old Visual Studio formatter) and does not round-trip,
|
# (it was shaped by an old Visual Studio formatter) and does not round-trip,
|
||||||
# so we never reformat the whole tree -- only the lines a PR touches.
|
# so we never reformat the whole tree -- only the lines a PR touches.
|
||||||
|
|||||||
6
.github/workflows/codeql.yml
vendored
6
.github/workflows/codeql.yml
vendored
@@ -46,12 +46,6 @@ jobs:
|
|||||||
# fopen's umask-controlled 0666 is intended for mirror/cache/log
|
# fopen's umask-controlled 0666 is intended for mirror/cache/log
|
||||||
# output; the one credential file (cookies.txt) is kept 0600 on Unix.
|
# output; the one credential file (cookies.txt) is kept 0600 on Unix.
|
||||||
config: |
|
config: |
|
||||||
paths-ignore:
|
|
||||||
# Demo callback samples, not part of libhttrack.
|
|
||||||
- libtest
|
|
||||||
# ProxyTrack: a separate legacy binary with no auth surface; its
|
|
||||||
# recv/cache-parse code trips taint queries by design.
|
|
||||||
- src/proxy
|
|
||||||
query-filters:
|
query-filters:
|
||||||
- exclude:
|
- exclude:
|
||||||
id: cpp/world-writable-file-creation
|
id: cpp/world-writable-file-creation
|
||||||
|
|||||||
210
.github/workflows/windows-build.yml
vendored
210
.github/workflows/windows-build.yml
vendored
@@ -1,210 +0,0 @@
|
|||||||
# Windows build of the engine (VS2022 v143 + vcpkg): libhttrack, the CLI,
|
|
||||||
# webhttrack, proxytrack.
|
|
||||||
#
|
|
||||||
# The autotools CI covers the unix builds; this covers the MSVC one, which had
|
|
||||||
# no coverage at all and had drifted (the old .vcproj pinned OpenSSL 1.0.1j).
|
|
||||||
# libhttrack.dll is what the WinHTTrack GUI links against.
|
|
||||||
name: windows-build
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
libhttrack:
|
|
||||||
runs-on: windows-2022
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform: [x64, Win32]
|
|
||||||
configuration: [Release]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive # coucal lives in src/coucal
|
|
||||||
|
|
||||||
# Located through vswhere rather than microsoft/setup-msbuild: the repo
|
|
||||||
# only allows GitHub-owned actions.
|
|
||||||
- name: Find MSBuild
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
|
||||||
$msbuild = & $vswhere -latest -products * -requires Microsoft.Component.MSBuild `
|
|
||||||
-find MSBuild\**\Bin\MSBuild.exe | Select-Object -First 1
|
|
||||||
if (-not $msbuild) { throw "MSBuild not found" }
|
|
||||||
Write-Host "MSBuild: $msbuild"
|
|
||||||
"MSBUILD=$msbuild" | Out-File -FilePath $env:GITHUB_ENV -Append
|
|
||||||
|
|
||||||
- name: Enable vcpkg MSBuild integration
|
|
||||||
shell: pwsh
|
|
||||||
run: vcpkg integrate install
|
|
||||||
|
|
||||||
# httrack and webhttrack carry a ProjectReference to libhttrack, so building
|
|
||||||
# them builds it first; proxytrack is standalone.
|
|
||||||
- name: Build
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
foreach ($proj in @("libhttrack", "httrack", "webhttrack", "proxytrack")) {
|
|
||||||
& $env:MSBUILD "src\$proj.vcxproj" `
|
|
||||||
/m `
|
|
||||||
/p:Configuration=${{ matrix.configuration }} `
|
|
||||||
/p:Platform=${{ matrix.platform }} `
|
|
||||||
/p:VcpkgEnableManifest=true `
|
|
||||||
/flp:LogFile=msbuild-$proj.log`;Verbosity=normal
|
|
||||||
if ($LASTEXITCODE -ne 0) { throw "$proj failed" }
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
$dir = "src\${{ matrix.platform }}\${{ matrix.configuration }}"
|
|
||||||
$want = @("libhttrack.dll", "libhttrack.lib", "httrack.exe",
|
|
||||||
"webhttrack.exe", "proxytrack.exe")
|
|
||||||
foreach ($f in $want) {
|
|
||||||
if (-not (Test-Path "$dir\$f")) { throw "missing $dir\$f" }
|
|
||||||
Write-Host "found $dir\$f"
|
|
||||||
}
|
|
||||||
|
|
||||||
# A CRT split across the exe/DLL boundary links fine and crashes on the
|
|
||||||
# first cross-heap free, so assert both sides import the *same* vcruntime.
|
|
||||||
# Also assert the machine type: Test-Path alone would accept an x64 binary
|
|
||||||
# sitting in the Win32 output dir.
|
|
||||||
- name: Check the CRT is shared across the boundary
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
$dir = "src\${{ matrix.platform }}\${{ matrix.configuration }}"
|
|
||||||
$dumpbin = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" `
|
|
||||||
-latest -find VC\Tools\MSVC\**\bin\Host*\*\dumpbin.exe | Select-Object -First 1
|
|
||||||
if (-not $dumpbin) { throw "dumpbin not found" }
|
|
||||||
$wantMachine = if ("${{ matrix.platform }}" -eq "x64") { "x64" } else { "x86" }
|
|
||||||
|
|
||||||
function Get-Crt($path) {
|
|
||||||
$out = & $dumpbin /dependents /headers $path
|
|
||||||
if ($LASTEXITCODE -ne 0) { throw "dumpbin failed on $path" }
|
|
||||||
,@($out | Select-String -Pattern '^\s*(vcruntime\d+d?\.dll)$' |
|
|
||||||
ForEach-Object { $_.Matches[0].Groups[1].Value.ToLower() })
|
|
||||||
}
|
|
||||||
|
|
||||||
# Negative control: cmd.exe links the old msvcrt, not vcruntime140. If
|
|
||||||
# this came back non-empty the detector would match anything, and the
|
|
||||||
# assertion below would pass on a mismatched CRT too.
|
|
||||||
if ((Get-Crt "$env:SystemRoot\System32\cmd.exe").Count -ne 0) {
|
|
||||||
throw "negative control failed: the vcruntime detector matches anything"
|
|
||||||
}
|
|
||||||
|
|
||||||
$crts = @{}
|
|
||||||
foreach ($f in @("libhttrack.dll", "httrack.exe")) {
|
|
||||||
$crt = Get-Crt "$dir\$f"
|
|
||||||
if ($crt.Count -eq 0) { throw "$f imports no vcruntime: static or mismatched CRT" }
|
|
||||||
$crts[$f] = $crt
|
|
||||||
|
|
||||||
$hdr = & $dumpbin /headers "$dir\$f"
|
|
||||||
if (-not ($hdr | Select-String -SimpleMatch "machine ($wantMachine)")) {
|
|
||||||
throw "$f is not $wantMachine"
|
|
||||||
}
|
|
||||||
Write-Host "$f -> $($crt -join ',') ($wantMachine)"
|
|
||||||
}
|
|
||||||
|
|
||||||
$a = $crts["libhttrack.dll"] | Sort-Object
|
|
||||||
$b = $crts["httrack.exe"] | Sort-Object
|
|
||||||
if (Compare-Object $a $b) {
|
|
||||||
throw "CRT mismatch across the boundary: libhttrack.dll=$a httrack.exe=$b"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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
|
|
||||||
# used to run inline (codecs, cache, fsize).
|
|
||||||
# The *_local-* ones crawl the bundled Python server over loopback: the real
|
|
||||||
# TLS handshake, cache and file writer, which nothing else on Windows covers.
|
|
||||||
- name: Run the engine test suite (offline tests)
|
|
||||||
shell: bash
|
|
||||||
working-directory: tests
|
|
||||||
timeout-minutes: 45
|
|
||||||
run: |
|
|
||||||
set -u
|
|
||||||
bin="$(cygpath -u "$GITHUB_WORKSPACE")/src/${{ matrix.platform }}/${{ matrix.configuration }}"
|
|
||||||
export PATH="$bin:$PATH"
|
|
||||||
command -v httrack >/dev/null || { echo "::error::no httrack.exe in $bin"; exit 1; }
|
|
||||||
|
|
||||||
# httrack.exe is native, so MSYS rewrites any argument shaped like a
|
|
||||||
# POSIX path, and a URL path is shaped exactly like one: "/a/b.html"
|
|
||||||
# reached the engine as "C:/Program Files/Git/a/b.html". Switch that
|
|
||||||
# off, and hand the tests a TMPDIR that is already a Windows path.
|
|
||||||
export MSYS_NO_PATHCONV=1
|
|
||||||
export MSYS2_ARG_CONV_EXCL='*'
|
|
||||||
TMPDIR="$(cygpath -m "$RUNNER_TEMP")"
|
|
||||||
export TMPDIR
|
|
||||||
|
|
||||||
# Mirror what configure hands the suite. LC_ALL sets the codeset MSYS maps
|
|
||||||
# a UTF-8 mirror name onto UTF-16 with, which the intl crawls "test -f".
|
|
||||||
export HTTPS_SUPPORT=yes BROTLI_ENABLED=yes ZSTD_ENABLED=yes
|
|
||||||
export LC_ALL=C.UTF-8
|
|
||||||
|
|
||||||
# A wedged crawl must not eat the job's timeout budget. timeout(1)'s
|
|
||||||
# signals can't reap a native httrack.exe (MSYS signals don't reach it),
|
|
||||||
# so a hang orphaned processes that starved the runner; run_with_timeout
|
|
||||||
# TerminateProcess-es the whole tree. 600s clears the slowest multi-pass
|
|
||||||
# crawl (a few passes at --max-time=120 each).
|
|
||||||
. ./testlib.sh
|
|
||||||
|
|
||||||
pass=0 fail=0 skip=0 failed="" skipped=""
|
|
||||||
for t in 00_runnable.test 01_engine-*.test 01_zlib-*.test \
|
|
||||||
*_local-*.test 13_crawl_proxy_https.test 58_watchdog.test \
|
|
||||||
60_crawl-log-salvage.test; do
|
|
||||||
rc=0
|
|
||||||
run_with_timeout 600 bash "$t" >"$t.log" 2>&1 || rc=$?
|
|
||||||
case "$rc" in
|
|
||||||
0) pass=$((pass + 1)); echo "PASS $t" ;;
|
|
||||||
77) skip=$((skip + 1)) skipped="$skipped $t"; echo "SKIP $t" ;;
|
|
||||||
124)
|
|
||||||
fail=$((fail + 1)) failed="$failed $t"
|
|
||||||
echo "FAIL $t (timed out, tree killed)"
|
|
||||||
# Re-running a wedge traced would just hang again: salvage the
|
|
||||||
# killed crawl's own logs into the artifact instead.
|
|
||||||
dump_crawl_logs >>"$t.log"
|
|
||||||
tail -n 25 "$t.log" | sed 's/^/ /'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
fail=$((fail + 1)) failed="$failed $t"
|
|
||||||
echo "FAIL $t (exit $rc)"
|
|
||||||
# These assert with `test "$(...)" == "..." || exit 1`, which
|
|
||||||
# says nothing at all on failure. Re-run traced, still bounded.
|
|
||||||
run_with_timeout 600 bash -x "$t" >>"$t.log" 2>&1 || true
|
|
||||||
tail -n 25 "$t.log" | sed 's/^/ /'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
echo "ran=$((pass + fail + skip)) pass=$pass fail=$fail skip=$skip" |
|
|
||||||
tee -a "$GITHUB_STEP_SUMMARY"
|
|
||||||
|
|
||||||
# Every gate here exits 77, so an all-skipped suite would report green having
|
|
||||||
# tested nothing: pin the skips, and floor the passes in case the glob empties.
|
|
||||||
expected_skips=" 48_local-crange-memresume.test" # pending #581
|
|
||||||
[ "$pass" -ge 90 ] || { echo "::error::only $pass tests passed ($skip skipped)"; exit 1; }
|
|
||||||
[ "$skipped" = "$expected_skips" ] || { echo "::error::unexpected skips:$skipped"; exit 1; }
|
|
||||||
[ "$fail" -eq 0 ] || { echo "::error::failing:$failed"; exit 1; }
|
|
||||||
|
|
||||||
- name: Upload the test logs
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: engine-tests-${{ matrix.platform }}-${{ matrix.configuration }}
|
|
||||||
path: tests/*.log
|
|
||||||
if-no-files-found: warn
|
|
||||||
|
|
||||||
- name: Upload MSBuild logs
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: msbuild-${{ matrix.platform }}-${{ matrix.configuration }}
|
|
||||||
path: msbuild-*.log
|
|
||||||
if-no-files-found: ignore
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -43,6 +43,3 @@ Makefile
|
|||||||
|
|
||||||
# Python bytecode (tests/local-server.py).
|
# Python bytecode (tests/local-server.py).
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|
||||||
# Per-checkout Claude Code rules (symlink into a local sandbox).
|
|
||||||
/CLAUDE.local.md
|
|
||||||
|
|||||||
20
AGENTS.md
20
AGENTS.md
@@ -6,19 +6,8 @@ the operational checklist: toolchain, invariants, and how to ship a change.
|
|||||||
## Build & test
|
## Build & test
|
||||||
- Fresh clone first: `git submodule update --init src/coucal`
|
- Fresh clone first: `git submodule update --init src/coucal`
|
||||||
- `./bootstrap` (regenerates `configure` via `autoreconf`; needs autoconf,
|
- `./bootstrap` (regenerates `configure` via `autoreconf`; needs autoconf,
|
||||||
automake, libtool), then `bash configure && make -j"$(nproc)" && make check
|
automake, libtool), then `bash configure && make && make check`. Or run
|
||||||
-j"$(nproc)"`. Always pass `-j` to `make check`: the suite runs under
|
`sh build.sh` to do bootstrap + configure + make in one shot.
|
||||||
automake's parallel harness and each crawl test binds its own ephemeral-port
|
|
||||||
server, so `-j` never contends and a multi-minute serial run drops to
|
|
||||||
seconds. A new `.test` added to `$(TESTS)` is scheduled onto a free worker
|
|
||||||
automatically; only a test slower than the current longest raises the floor.
|
|
||||||
On a few-core Linux box, `-j` at 2x the core count is faster still: the tests
|
|
||||||
spend much of their wall time asleep (server trickles, httrack self-pacing),
|
|
||||||
so an idle core covers a sleeping one. CI uses `min(2*cores, 16)` on every
|
|
||||||
platform, macOS included: the test server raises its listen backlog
|
|
||||||
(`request_queue_size`) so macOS/BSD don't drop connections under a parallel
|
|
||||||
`-c16` bigcrawl the way Python's default backlog of 5 did.
|
|
||||||
Or run `sh build.sh` to do bootstrap + configure + make in one shot.
|
|
||||||
|
|
||||||
## Hard invariants
|
## Hard invariants
|
||||||
- **Generated autotools files are NOT in git.** `configure`, every
|
- **Generated autotools files are NOT in git.** `configure`, every
|
||||||
@@ -67,9 +56,8 @@ Before pushing, and when reviewing others, don't skim for bugs:
|
|||||||
- **Co-Authored-By is mandatory for AI-assisted commits.** Carry a
|
- **Co-Authored-By is mandatory for AI-assisted commits.** Carry a
|
||||||
`Co-Authored-By:` trailer naming the assistant. Attribute there, never in a
|
`Co-Authored-By:` trailer naming the assistant. Attribute there, never in a
|
||||||
PR-body footer.
|
PR-body footer.
|
||||||
- PRs are squash-merged: one commit per PR lands on master, built from the PR
|
- PRs land as a merge commit; every commit on the branch goes onto master, so
|
||||||
title and description, so those are what the history keeps. The branch's
|
keep each commit message clean and meaningful.
|
||||||
intermediate commits are not preserved.
|
|
||||||
|
|
||||||
## PR descriptions
|
## PR descriptions
|
||||||
- Plain concise prose; lead with what changed and why. No What/Why/How template.
|
- Plain concise prose; lead with what changed and why. No What/Why/How template.
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ with an AI assistant? The operational checklist is [AGENTS.md](AGENTS.md).
|
|||||||
## Pull requests
|
## Pull requests
|
||||||
|
|
||||||
- One change per PR. Small diffs merge fast.
|
- One change per PR. Small diffs merge fast.
|
||||||
- PRs are squash-merged: one commit per PR goes onto master, built from the PR
|
- PRs land as a merge commit, so the branch's commits go onto master as-is: keep
|
||||||
title and description, so those are the history. Explain *why* there.
|
each commit message clean and explain *why*.
|
||||||
- Be terse in the PR title and description: name the problem, not the fix, don't
|
- Be terse in the PR title and description: name the problem, not the fix, don't
|
||||||
restate the diff, and calibrate length to the change.
|
restate the diff, and calibrate length to the change.
|
||||||
- Add or update tests for engine changes (`tests/`), and keep CI green.
|
- Add or update tests for engine changes (`tests/`), and keep CI green.
|
||||||
|
|||||||
1
README
1
README
@@ -40,6 +40,7 @@ These are the principals limits of HTTrack for that moment. Note that we did not
|
|||||||
that would have solved them.
|
that would have solved them.
|
||||||
|
|
||||||
- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
||||||
|
- Some java classes may not find some files on them (class included)
|
||||||
- Cgi-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like -*cgi-bin*
|
- Cgi-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like -*cgi-bin*
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
28
configure.ac
28
configure.ac
@@ -1,6 +1,6 @@
|
|||||||
AC_PREREQ([2.71])
|
AC_PREREQ([2.71])
|
||||||
|
|
||||||
AC_INIT([httrack], [3.49.12], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
AC_INIT([httrack], [3.49.11], [roche+packaging@httrack.com], [httrack], [http://www.httrack.com/])
|
||||||
AC_COPYRIGHT([
|
AC_COPYRIGHT([
|
||||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||||
Copyright (C) 1998-2015 Xavier Roche and other contributors
|
Copyright (C) 1998-2015 Xavier Roche and other contributors
|
||||||
@@ -29,11 +29,11 @@ AC_CONFIG_SRCDIR(src/httrack.c)
|
|||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_CONFIG_HEADERS(config.h)
|
AC_CONFIG_HEADERS(config.h)
|
||||||
AM_INIT_AUTOMAKE([subdir-objects])
|
AM_INIT_AUTOMAKE([subdir-objects])
|
||||||
# 3:4:0: 3.49.12 tail-appends one field (why_url) to httrackp and otherwise only
|
# 3:3:0: 3.49.11 only adds enum values, macros and inline helpers to the
|
||||||
# deletes dead comments; no struct layout or exported signature broke vs 3.49.11,
|
# installed headers (no struct layout or exported signature changed vs
|
||||||
# so it stays soname .so.3; bump revision.
|
# 3.49.10), so it stays soname .so.3; bump revision.
|
||||||
# (3:0:0 was the htsblk mime-buffer widening, the ABI break that moved .so.2 -> .so.3.)
|
# (3:0:0 was the htsblk mime-buffer widening, the ABI break that moved .so.2 -> .so.3.)
|
||||||
VERSION_INFO="3:4:0"
|
VERSION_INFO="3:3:0"
|
||||||
AM_MAINTAINER_MODE
|
AM_MAINTAINER_MODE
|
||||||
AC_USE_SYSTEM_EXTENSIONS
|
AC_USE_SYSTEM_EXTENSIONS
|
||||||
|
|
||||||
@@ -64,6 +64,16 @@ AC_SUBST(LT_CV_OBJDIR,$lt_cv_objdir)
|
|||||||
# Export version info
|
# Export version info
|
||||||
AC_SUBST(VERSION_INFO)
|
AC_SUBST(VERSION_INFO)
|
||||||
|
|
||||||
|
# Versioned plugin name for dlopen() in hts_create_opt(); soname major is
|
||||||
|
# libtool's current - age, so this tracks VERSION_INFO bumps automatically.
|
||||||
|
HTS_SONAME_MAJOR=$((${VERSION_INFO%%:*} - ${VERSION_INFO##*:}))
|
||||||
|
case "$host_os" in
|
||||||
|
darwin*) HTS_LIBHTSJAVA_NAME="libhtsjava.$HTS_SONAME_MAJOR.dylib" ;;
|
||||||
|
*) HTS_LIBHTSJAVA_NAME="libhtsjava.so.$HTS_SONAME_MAJOR" ;;
|
||||||
|
esac
|
||||||
|
AC_DEFINE_UNQUOTED([HTS_LIBHTSJAVA_NAME], ["$HTS_LIBHTSJAVA_NAME"],
|
||||||
|
[Versioned libhtsjava runtime name, derived from VERSION_INFO])
|
||||||
|
|
||||||
### Default CFLAGS
|
### Default CFLAGS
|
||||||
DEFAULT_CFLAGS="-Wall -Wformat -Wformat-security \
|
DEFAULT_CFLAGS="-Wall -Wformat -Wformat-security \
|
||||||
-Wmultichar -Wwrite-strings -Wcast-qual -Wcast-align \
|
-Wmultichar -Wwrite-strings -Wcast-qual -Wcast-align \
|
||||||
@@ -109,8 +119,8 @@ case "$CFLAGS" in
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# Force libc back into DT_NEEDED for libraries that reach it only through
|
# Force libc back into DT_NEEDED for libraries that reach it only through
|
||||||
# libhttrack (the libtest callbacks), but only with a GNU-style linker; Apple
|
# libhttrack (libhtsjava, the libtest callbacks), but only with a GNU-style
|
||||||
# ld rejects these flags and links libSystem unconditionally.
|
# linker; Apple ld rejects these flags and links libSystem unconditionally.
|
||||||
AX_CHECK_LINK_FLAG([-Wl,--push-state,--no-as-needed,-lc,--pop-state],
|
AX_CHECK_LINK_FLAG([-Wl,--push-state,--no-as-needed,-lc,--pop-state],
|
||||||
[LIBC_FORCE_LINK="-Wl,--push-state,--no-as-needed,-lc,--pop-state"])
|
[LIBC_FORCE_LINK="-Wl,--push-state,--no-as-needed,-lc,--pop-state"])
|
||||||
AC_SUBST([LIBC_FORCE_LINK])
|
AC_SUBST([LIBC_FORCE_LINK])
|
||||||
@@ -173,10 +183,6 @@ AC_CHECK_HEADERS([execinfo.h])
|
|||||||
### zlib
|
### zlib
|
||||||
CHECK_ZLIB()
|
CHECK_ZLIB()
|
||||||
|
|
||||||
### brotli and zstd content codings (optional)
|
|
||||||
CHECK_BROTLI()
|
|
||||||
CHECK_ZSTD()
|
|
||||||
|
|
||||||
### OpenSSL is explicitly enabled/disabled ?
|
### OpenSSL is explicitly enabled/disabled ?
|
||||||
AC_MSG_CHECKING(whether to enable https support)
|
AC_MSG_CHECKING(whether to enable https support)
|
||||||
AC_ARG_ENABLE([https],
|
AC_ARG_ENABLE([https],
|
||||||
|
|||||||
10
debian/changelog
vendored
10
debian/changelog
vendored
@@ -1,13 +1,3 @@
|
|||||||
httrack (3.49.12-1) unstable; urgency=medium
|
|
||||||
|
|
||||||
* New upstream release: security and crawl-correctness fixes (remote stack
|
|
||||||
overflow in Content-Type/-Encoding parsing, fuzzer-found parser over-reads,
|
|
||||||
world-readable cookies.txt, filter-pattern denial of service) plus a new
|
|
||||||
--why filter diagnostic; full list in history.txt.
|
|
||||||
* Build with _FORTIFY_SOURCE and -fstack-protector-strong.
|
|
||||||
|
|
||||||
-- Xavier Roche <xavier@debian.org> Fri, 10 Jul 2026 21:11:09 +0200
|
|
||||||
|
|
||||||
httrack (3.49.11-1) unstable; urgency=medium
|
httrack (3.49.11-1) unstable; urgency=medium
|
||||||
|
|
||||||
* New upstream release: crawl correctness and security fixes (network-facing
|
* New upstream release: crawl correctness and security fixes (network-facing
|
||||||
|
|||||||
2
debian/control
vendored
2
debian/control
vendored
@@ -2,7 +2,7 @@ Source: httrack
|
|||||||
Section: web
|
Section: web
|
||||||
Maintainer: Xavier Roche <roche@httrack.com>
|
Maintainer: Xavier Roche <roche@httrack.com>
|
||||||
Standards-Version: 4.7.4
|
Standards-Version: 4.7.4
|
||||||
Build-Depends: debhelper-compat (= 14), autoconf, autoconf-archive, automake, libtool, zlib1g-dev, libssl-dev, libbrotli-dev, libzstd-dev
|
Build-Depends: debhelper-compat (= 14), autoconf, autoconf-archive, automake, libtool, zlib1g-dev, libssl-dev
|
||||||
Rules-Requires-Root: no
|
Rules-Requires-Root: no
|
||||||
Homepage: http://www.httrack.com
|
Homepage: http://www.httrack.com
|
||||||
Vcs-Git: https://github.com/xroche/httrack.git
|
Vcs-Git: https://github.com/xroche/httrack.git
|
||||||
|
|||||||
5
debian/copyright
vendored
5
debian/copyright
vendored
@@ -7,8 +7,9 @@ Files: *
|
|||||||
Copyright: 1998-2026 Xavier Roche and other contributors
|
Copyright: 1998-2026 Xavier Roche and other contributors
|
||||||
License: GPL-3+
|
License: GPL-3+
|
||||||
Comment:
|
Comment:
|
||||||
htsbasenet.h links against the system OpenSSL library (originally by Eric
|
The engine includes contributions from Yann Philippot (src/htsjava.c,
|
||||||
Young); no OpenSSL/SSLeay code is bundled here.
|
src/htsjava.h). htsbasenet.h links against the system OpenSSL library
|
||||||
|
(originally by Eric Young); no OpenSSL/SSLeay code is bundled here.
|
||||||
|
|
||||||
Files: src/minizip/*
|
Files: src/minizip/*
|
||||||
Copyright: 1998-2010 Gilles Vollant
|
Copyright: 1998-2010 Gilles Vollant
|
||||||
|
|||||||
1
debian/libhttrack-dev.files
vendored
1
debian/libhttrack-dev.files
vendored
@@ -1,4 +1,5 @@
|
|||||||
usr/include/httrack
|
usr/include/httrack
|
||||||
usr/lib/*/libhttrack.{so}
|
usr/lib/*/libhttrack.{so}
|
||||||
|
usr/lib/*/libhtsjava.{so}
|
||||||
usr/share/httrack/libtest
|
usr/share/httrack/libtest
|
||||||
usr/lib/*/httrack/libtest
|
usr/lib/*/httrack/libtest
|
||||||
|
|||||||
1
debian/libhttrack3.files
vendored
1
debian/libhttrack3.files
vendored
@@ -1,2 +1,3 @@
|
|||||||
usr/lib/*/libhttrack.so.3*
|
usr/lib/*/libhttrack.so.3*
|
||||||
|
usr/lib/*/libhtsjava.so.3*
|
||||||
usr/share/httrack/templates
|
usr/share/httrack/templates
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
# libFuzzer harnesses; built only with --enable-fuzzers (requires clang).
|
# libFuzzer harnesses; built only with --enable-fuzzers (requires clang).
|
||||||
if FUZZERS
|
if FUZZERS
|
||||||
noinst_PROGRAMS = fuzz-charset fuzz-meta fuzz-idna fuzz-entities \
|
noinst_PROGRAMS = fuzz-charset fuzz-meta fuzz-idna fuzz-entities \
|
||||||
fuzz-unescape fuzz-filters fuzz-url fuzz-header fuzz-cachendx \
|
fuzz-unescape fuzz-filters fuzz-url fuzz-header fuzz-cachendx
|
||||||
fuzz-htsparse
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
@@ -26,7 +25,6 @@ fuzz_filters_SOURCES = fuzz-filters.c fuzz.h
|
|||||||
fuzz_url_SOURCES = fuzz-url.c fuzz.h
|
fuzz_url_SOURCES = fuzz-url.c fuzz.h
|
||||||
fuzz_header_SOURCES = fuzz-header.c fuzz.h
|
fuzz_header_SOURCES = fuzz-header.c fuzz.h
|
||||||
fuzz_cachendx_SOURCES = fuzz-cachendx.c fuzz.h
|
fuzz_cachendx_SOURCES = fuzz-cachendx.c fuzz.h
|
||||||
fuzz_htsparse_SOURCES = fuzz-htsparse.c fuzz.h
|
|
||||||
|
|
||||||
# List corpus files explicitly: automake does not expand EXTRA_DIST globs.
|
# List corpus files explicitly: automake does not expand EXTRA_DIST globs.
|
||||||
EXTRA_DIST = README.md run-fuzzers.sh \
|
EXTRA_DIST = README.md run-fuzzers.sh \
|
||||||
@@ -39,12 +37,9 @@ EXTRA_DIST = README.md run-fuzzers.sh \
|
|||||||
corpus/filters/filter.bin corpus/filters/filter-size.bin \
|
corpus/filters/filter.bin corpus/filters/filter-size.bin \
|
||||||
corpus/filters/regress-empty-subject-unique.bin \
|
corpus/filters/regress-empty-subject-unique.bin \
|
||||||
corpus/filters/redos-star-classes.bin \
|
corpus/filters/redos-star-classes.bin \
|
||||||
corpus/filters/regress-classdepth-timeout.bin \
|
|
||||||
corpus/url/http-url.txt corpus/url/relative-path.txt \
|
corpus/url/http-url.txt corpus/url/relative-path.txt \
|
||||||
corpus/url/regress-file-empty-path.txt corpus/url/regress-long-path-abort.txt \
|
corpus/url/regress-file-empty-path.txt corpus/url/regress-long-path-abort.txt \
|
||||||
corpus/header/full-response.txt corpus/header/redirect.txt \
|
corpus/header/full-response.txt corpus/header/redirect.txt \
|
||||||
corpus/cachendx/new-format.txt corpus/cachendx/old-format.txt \
|
corpus/cachendx/new-format.txt corpus/cachendx/old-format.txt \
|
||||||
corpus/cachendx/regress-overadvance.bin \
|
corpus/cachendx/regress-overadvance.bin \
|
||||||
corpus/cachendx/regress-truncated-entry.bin \
|
corpus/cachendx/regress-truncated-entry.bin
|
||||||
corpus/htsparse/basic.html corpus/htsparse/script-inscript.html \
|
|
||||||
corpus/htsparse/meta-usemap.html corpus/htsparse/malformed.html
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html><head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<base href="http://example.com/dir/">
|
|
||||||
<title>Seed</title>
|
|
||||||
<link rel="stylesheet" href="style.css">
|
|
||||||
<script src="app.js"></script>
|
|
||||||
</head><body>
|
|
||||||
<h1>Hi</h1>
|
|
||||||
<a href="page2.html">next</a>
|
|
||||||
<a href="http://other.example.org/x?y=1#frag">abs</a>
|
|
||||||
<img src="pic.png" srcset="a.png 1x, b.png 2x">
|
|
||||||
<script>var u="inline.html"; document.write('<a href="gen.html">g</a>');</script>
|
|
||||||
<form action="/cgi/submit"><input name="q"></form>
|
|
||||||
</body></html>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<a href="unclosed.html
|
|
||||||
<img src='mix"ed.png>
|
|
||||||
<a href=noquote.html >bare</a>
|
|
||||||
<!-- comment <a href="incomment.html"> -->
|
|
||||||
<a href="tab newline
|
|
||||||
.html">wsp</a>
|
|
||||||
<script>unterminated "string and <a href=
|
|
||||||
<a href=
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<html><head>
|
|
||||||
<meta http-equiv="refresh" content="0; url=redir.html">
|
|
||||||
<base href="http://h/b/">
|
|
||||||
<link rel="alternate" href="feed.xml">
|
|
||||||
</head><body background="page-bg.jpg">
|
|
||||||
<img src="map.png" usemap="#m">
|
|
||||||
<map name="m"><area href="area1.html" coords="0,0,10,10"></map>
|
|
||||||
<applet code="A.class" codebase="applets/"><param name="src" value="p.dat"></applet>
|
|
||||||
<object data="o.swf"><embed src="e.svg"></object>
|
|
||||||
<a href="http://ent/e.html">entity</a>
|
|
||||||
</body></html>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<html><body>
|
|
||||||
<script type="text/javascript">
|
|
||||||
var a = "http://x/1.html", b = 'q\'uote', c = "/*not*/comment";
|
|
||||||
// line "with" quotes and http://y/2.html
|
|
||||||
/* block 'with' <a href="notparsed"> */
|
|
||||||
var re = /a\/b\//g;
|
|
||||||
document.write('<img src="w1.png">');
|
|
||||||
document.writeln("<a href='w2.html'>k</a>");
|
|
||||||
element.onclick = "location='onh.html'";
|
|
||||||
</script>
|
|
||||||
<a href="after.html" onmouseover="go('ev.html')">x</a>
|
|
||||||
<div style="background:url(bg.png)">z</div>
|
|
||||||
</body></html>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<meta content="text/html; charset=gb2312" http-equiv="content-type">
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<meta charset='utf-8
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<meta charset = utf-8 />
|
|
||||||
@@ -1,175 +0,0 @@
|
|||||||
/* ------------------------------------------------------------ */
|
|
||||||
/*
|
|
||||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
|
||||||
Copyright (C) 2026 Xavier Roche and other contributors
|
|
||||||
|
|
||||||
SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Please visit our Website: http://www.httrack.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Fuzz the real htsparse() over a mocked engine: the minimal crawl state
|
|
||||||
httpmirror() builds, then a page walked through the parser and discarded. The
|
|
||||||
str/stre wiring below mirrors htsparse()'s call site in htscore.c; update it
|
|
||||||
in lockstep if those structs gain a field the parser reads. */
|
|
||||||
#include "fuzz.h"
|
|
||||||
|
|
||||||
#include "httrack-library.h"
|
|
||||||
#include "htscore.h"
|
|
||||||
#include "htsback.h"
|
|
||||||
#include "htshash.h"
|
|
||||||
#include "htsrobots.h"
|
|
||||||
#include "htsparse.h"
|
|
||||||
#include "htsmodules.h"
|
|
||||||
#include "coucal.h"
|
|
||||||
|
|
||||||
/* htsparse ignores str.addLink on the internal parse; stub it. */
|
|
||||||
static int fuzz_addlink(htsmoduleStruct *str, char *link) {
|
|
||||||
(void) str;
|
|
||||||
(void) link;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
|
||||||
static int inited = 0;
|
|
||||||
|
|
||||||
httrackp *opt;
|
|
||||||
cache_back cache;
|
|
||||||
hash_struct hash;
|
|
||||||
robots_wizard robots;
|
|
||||||
struct_back *sback;
|
|
||||||
char **filters = NULL;
|
|
||||||
int filptr = 0;
|
|
||||||
|
|
||||||
htsblk r;
|
|
||||||
htsmoduleStruct str;
|
|
||||||
htsmoduleStructExtended stre;
|
|
||||||
int ptr, error = 0, store_errpage = 0;
|
|
||||||
int makeindex_done = 0, makeindex_links = 0;
|
|
||||||
FILE *makeindex_fp = NULL;
|
|
||||||
char makeindex_firstlink[HTS_URLMAXSIZE * 2] = "";
|
|
||||||
LLint stat_fragment = 0, makestat_total = 0;
|
|
||||||
int makestat_lnk = 0;
|
|
||||||
char base[HTS_URLMAXSIZE * 2] = "";
|
|
||||||
char codebase[HTS_URLMAXSIZE * 2] = "";
|
|
||||||
char err_msg[1024] = "";
|
|
||||||
|
|
||||||
if (!inited) {
|
|
||||||
hts_init();
|
|
||||||
inited = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
opt = hts_create_opt();
|
|
||||||
opt->log = opt->errlog = NULL;
|
|
||||||
opt->robots = 0;
|
|
||||||
|
|
||||||
memset(&cache, 0, sizeof(cache));
|
|
||||||
cache.type = 0; /* no on-disk cache */
|
|
||||||
cache.hashtable = coucal_new(0);
|
|
||||||
cache.cached_tests = coucal_new(0);
|
|
||||||
coucal_value_is_malloc(cache.cached_tests, 1);
|
|
||||||
|
|
||||||
memset(&robots, 0, sizeof(robots));
|
|
||||||
strcpybuff(robots.adr, "!");
|
|
||||||
opt->robotsptr = &robots;
|
|
||||||
|
|
||||||
opt->maxfilter = maximum(opt->maxfilter, 128);
|
|
||||||
filters_init(&filters, opt->maxfilter, 0);
|
|
||||||
opt->filters.filters = &filters;
|
|
||||||
opt->filters.filptr = &filptr;
|
|
||||||
|
|
||||||
opt->hash = &hash;
|
|
||||||
hts_record_init(opt);
|
|
||||||
hash_init(opt, &hash, opt->urlhack);
|
|
||||||
hash.liens = (const lien_url *const *const *) &opt->liens;
|
|
||||||
|
|
||||||
sback = back_new(opt, opt->maxsoc * 32 + 1024);
|
|
||||||
|
|
||||||
/* ptr=1 (index 1 is the parsed page) selects full HTML parsing + the
|
|
||||||
rewriter; urladr()/urlfil()/savename() alias heap(ptr), save=/dev/null. */
|
|
||||||
hts_record_link(opt, "example.com", "/", "/dev/null", "", "", NULL);
|
|
||||||
hts_record_link(opt, "example.com", "/index.html", "/dev/null", "", "", NULL);
|
|
||||||
ptr = 1;
|
|
||||||
|
|
||||||
/* NUL-terminated in a size+1 alloc: htsparse one-past-reads onto the NUL. */
|
|
||||||
hts_init_htsblk(&r);
|
|
||||||
r.statuscode = 200;
|
|
||||||
r.size = (LLint) size;
|
|
||||||
r.adr = malloct(size + 1);
|
|
||||||
if (size)
|
|
||||||
memcpy(r.adr, data, size);
|
|
||||||
r.adr[size] = '\0';
|
|
||||||
strcpybuff(r.contenttype, "text/html");
|
|
||||||
|
|
||||||
memset(&str, 0, sizeof(str));
|
|
||||||
memset(&stre, 0, sizeof(stre));
|
|
||||||
str.err_msg = err_msg;
|
|
||||||
str.filename = heap(ptr)->sav;
|
|
||||||
str.mime = r.contenttype;
|
|
||||||
str.url_host = heap(ptr)->adr;
|
|
||||||
str.url_file = heap(ptr)->fil;
|
|
||||||
str.size = (int) r.size;
|
|
||||||
str.addLink = fuzz_addlink;
|
|
||||||
str.opt = opt;
|
|
||||||
str.sback = sback;
|
|
||||||
str.cache = &cache;
|
|
||||||
str.hashptr = &hash;
|
|
||||||
str.numero_passe = 0;
|
|
||||||
str.ptr_ = &ptr;
|
|
||||||
str.page_charset_ = NULL;
|
|
||||||
|
|
||||||
stre.r_ = &r;
|
|
||||||
stre.error_ = &error;
|
|
||||||
stre.exit_xh_ = &opt->state.exit_xh;
|
|
||||||
stre.store_errpage_ = &store_errpage;
|
|
||||||
stre.base = base;
|
|
||||||
stre.codebase = codebase;
|
|
||||||
stre.filters_ = &filters;
|
|
||||||
stre.filptr_ = &filptr;
|
|
||||||
stre.robots_ = &robots;
|
|
||||||
stre.hash_ = &hash;
|
|
||||||
stre.makeindex_done_ = &makeindex_done;
|
|
||||||
stre.makeindex_fp_ = &makeindex_fp;
|
|
||||||
stre.makeindex_links_ = &makeindex_links;
|
|
||||||
stre.makeindex_firstlink_ = makeindex_firstlink;
|
|
||||||
stre.template_header_ = "";
|
|
||||||
stre.template_body_ = "";
|
|
||||||
stre.template_footer_ = "";
|
|
||||||
stre.stat_fragment_ = &stat_fragment;
|
|
||||||
stre.makestat_time = 0;
|
|
||||||
stre.makestat_fp = NULL;
|
|
||||||
stre.makestat_total_ = &makestat_total;
|
|
||||||
stre.makestat_lnk_ = &makestat_lnk;
|
|
||||||
stre.maketrack_fp = NULL;
|
|
||||||
|
|
||||||
(void) htsparse(&str, &stre);
|
|
||||||
|
|
||||||
freet(r.adr);
|
|
||||||
back_delete_all(opt, &cache, sback);
|
|
||||||
back_free(&sback);
|
|
||||||
hash_free(&hash);
|
|
||||||
coucal_delete(&cache.hashtable);
|
|
||||||
coucal_delete(&cache.cached_tests);
|
|
||||||
checkrobots_free(&robots);
|
|
||||||
if (filters != NULL) {
|
|
||||||
if (filters[0] != NULL)
|
|
||||||
freet(filters[0]);
|
|
||||||
freet(filters);
|
|
||||||
}
|
|
||||||
hts_record_free(opt);
|
|
||||||
hts_free_opt(opt);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
17
history.txt
17
history.txt
@@ -4,23 +4,6 @@ HTTrack Website Copier release history:
|
|||||||
|
|
||||||
This file lists all changes and fixes that have been made for HTTrack
|
This file lists all changes and fixes that have been made for HTTrack
|
||||||
|
|
||||||
3.49-12
|
|
||||||
+ New: --why explains which filter rule accepts or rejects a given URL, then exits (#505)
|
|
||||||
+ Fixed: links carrying raw UTF-8 bytes were fetched double-encoded and 404'd (#516)
|
|
||||||
+ Fixed: an uncompressed body mislabeled as gzip no longer loses the page (#515)
|
|
||||||
+ Fixed: remote stack overflow and uninitialized read in Content-Type/-Encoding parsing (#506)
|
|
||||||
+ Fixed: several over-reads and a leak in the filter, URL and IDNA parsers (#499)
|
|
||||||
+ Fixed: bound the cache-index (.ndx) parser to its buffer (#507)
|
|
||||||
+ Fixed: catastrophic backtracking on '*'-heavy filter patterns (#513)
|
|
||||||
+ Fixed: cookies.txt was created world-readable (#511)
|
|
||||||
+ Fixed: a single corrupt cache entry no longer aborts the whole mirror (#494)
|
|
||||||
+ Fixed: cache-reconcile policy was broken for zip caches (#491, #493, #495)
|
|
||||||
+ Fixed: cancelling a crawl mid type-check no longer orphans .delayed placeholders (#496)
|
|
||||||
+ Fixed: detect URLs after the first inline script and in mid-tag attributes (#497)
|
|
||||||
+ Changed: build with _FORTIFY_SOURCE and -fstack-protector-strong (#504)
|
|
||||||
+ Changed: removed the pre-3.31 (.dat/.ndx) cache import (#512)
|
|
||||||
+ Changed: multiple internal hardening and build improvements (libFuzzer harnesses, CodeQL, dead-code removal)
|
|
||||||
|
|
||||||
3.49-11
|
3.49-11
|
||||||
+ New: parse robots.txt Allow rules and path wildcards per RFC 9309 (#452)
|
+ New: parse robots.txt Allow rules and path wildcards per RFC 9309 (#452)
|
||||||
+ New: advertise deflate in Accept-Encoding and decode deflate responses (#450)
|
+ New: advertise deflate in Accept-Encoding and decode deflate responses (#450)
|
||||||
|
|||||||
@@ -609,9 +609,10 @@ most mirrors do work. We still are working to improve the mirror quality of HTTr
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
</a><a NAME="Q2b">Q: <strong>Some Java applets do not work properly!</strong><br>
|
</a><a NAME="Q2b">Q: <strong>Some Java applets do not work properly!</strong><br>
|
||||||
A: <em>Java applets may not work in some cases, because HTTrack does not parse compiled class files to find
|
A: <em>Java applets may not work in some cases, for example if HTTrack failed to detect all included classes
|
||||||
the resources they load. Java applets often need to be online anyway, since remote files are fetched directly
|
or files called within the class file. Sometimes, Java applets need to be online, because remote files are
|
||||||
at runtime.<br>
|
directly caught. Finally, the site structure can be incompatible with the class (always try to keep the original site structure
|
||||||
|
when you want to get Java classes)<br>
|
||||||
If there is no way to make some classes work properly, you can exclude them with the filters.
|
If there is no way to make some classes work properly, you can exclude them with the filters.
|
||||||
They will be available, but only online.
|
They will be available, but only online.
|
||||||
</em>
|
</em>
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ Build options:
|
|||||||
Spider options:
|
Spider options:
|
||||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
|
bN accept cookies in cookies.txt (0=do not accept,* 1=accept) (--cookies[=N])
|
||||||
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (--check-type[=N])
|
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (--check-type[=N])
|
||||||
j *parse scripts (j0 don't parse) (--parse-java[=N])
|
j *parse Java Classes (j0 don't parse) (--parse-java[=N])
|
||||||
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) (--robots[=N])
|
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) (--robots[=N])
|
||||||
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies) (--http-10)
|
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies) (--http-10)
|
||||||
%B tolerant requests (accept bogus responses on some servers, but not standard!) (--tolerant)
|
%B tolerant requests (accept bogus responses on some servers, but not standard!) (--tolerant)
|
||||||
@@ -417,7 +417,7 @@ site. Specifically, the defauls are:
|
|||||||
X *purge old files after update (X0 keep delete)
|
X *purge old files after update (X0 keep delete)
|
||||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
||||||
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
||||||
j *parse scripts (j0 don't parse)
|
j *parse Java Classes (j0 don't parse)
|
||||||
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
||||||
C create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before)
|
C create/use a cache for updates and retries (C0 no cache,C1 cache is prioritary,* C2 test update before)
|
||||||
f *log file mode
|
f *log file mode
|
||||||
@@ -497,9 +497,9 @@ about your browser retaining them.
|
|||||||
<p align=justify> This causes different document types to be analyzed
|
<p align=justify> This causes different document types to be analyzed
|
||||||
differently.
|
differently.
|
||||||
|
|
||||||
<pre><b><i> j *parse scripts (j0 don't parse) </i></b></pre>
|
<pre><b><i> j *parse Java Classes (j0 don't parse) </i></b></pre>
|
||||||
|
|
||||||
<p align=justify> This causes scripts to be parsed looking for
|
<p align=justify> This causes Java class files to be parsed looking for
|
||||||
URLs.
|
URLs.
|
||||||
|
|
||||||
<pre><b><i> sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) </i></b></pre>
|
<pre><b><i> sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always) </i></b></pre>
|
||||||
@@ -1178,7 +1178,7 @@ accepted and sent back in order to allow access.
|
|||||||
Spider options:
|
Spider options:
|
||||||
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
bN accept cookies in cookies.txt (0=do not accept,* 1=accept)
|
||||||
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)
|
||||||
j *parse scripts (j0 don't parse)
|
j *parse Java Classes (j0 don't parse)
|
||||||
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always)
|
||||||
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies)
|
%h force HTTP/1.0 requests (reduce update features, only for old servers or proxies)
|
||||||
%B tolerant requests (accept bogus responses on some servers, but not standard!)
|
%B tolerant requests (accept bogus responses on some servers, but not standard!)
|
||||||
@@ -2451,10 +2451,12 @@ work. We still are working to improve the mirror quality of HTTrack.
|
|||||||
|
|
||||||
<p align=justify><b>Q: Some Java applets do not work properly! </b>
|
<p align=justify><b>Q: Some Java applets do not work properly! </b>
|
||||||
|
|
||||||
<p align=justify> A: Java applets may not work in some cases, because
|
<p align=justify> A: Java applets may not work in some cases, for
|
||||||
HTTrack does not parse compiled class files to find the resources they
|
example if HTTrack failed to detect all included classes or files called
|
||||||
load. Java applets often need to be online anyway, since remote files
|
within the class file. Sometimes, Java applets need to be online,
|
||||||
are fetched directly at runtime.
|
because remote files are directly caught. Finally, the site structure
|
||||||
|
can be incompatible with the class (always try to keep the original site
|
||||||
|
structure when you want to get Java classes)
|
||||||
|
|
||||||
<p align=justify> If there is no way to make some classes work properly,
|
<p align=justify> If there is no way to make some classes work properly,
|
||||||
you can exclude them with the filters. They will be available, but only
|
you can exclude them with the filters. They will be available, but only
|
||||||
|
|||||||
@@ -764,9 +764,9 @@ check, * u1 check but /, u2 check always)
|
|||||||
<td width="78%">
|
<td width="78%">
|
||||||
|
|
||||||
|
|
||||||
<p>*parse scripts (j0 don t parse, bitmask: |1 parse
|
<p>*parse Java Classes (j0 don t parse, bitmask: |1 parse
|
||||||
default, |4 don t parse .js |8 don t be aggressive)
|
default, |2 don t parse .class |4 don t parse .js |8 don t
|
||||||
(--parse-java[=N])</p></td></tr>
|
be aggressive) (--parse-java[=N])</p></td></tr>
|
||||||
<tr valign="top" align="left">
|
<tr valign="top" align="left">
|
||||||
<td width="11%"></td>
|
<td width="11%"></td>
|
||||||
<td width="6%">
|
<td width="6%">
|
||||||
@@ -889,8 +889,8 @@ only) (--protocol[=N])</p></td></tr>
|
|||||||
<td width="78%">
|
<td width="78%">
|
||||||
|
|
||||||
|
|
||||||
<p>disable a specific external mime module (-%w
|
<p>disable a specific external mime module (-%w htsswf -%w
|
||||||
httrack-plugin) (--disable-module <param>)</p></td></tr>
|
htsjava) (--disable-module <param>)</p></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p style="margin-left:11%; margin-top: 1em"><b>Browser
|
<p style="margin-left:11%; margin-top: 1em"><b>Browser
|
||||||
@@ -2175,6 +2175,10 @@ Several scripts generating complex filenames may not find
|
|||||||
them (ex:
|
them (ex:
|
||||||
img.src=’image’+a+Mobj.dst+’.gif’)</small></p>
|
img.src=’image’+a+Mobj.dst+’.gif’)</small></p>
|
||||||
|
|
||||||
|
<p style="margin-left:11%; margin-top: 1em"><small>- Some
|
||||||
|
java classes may not find some files on them (class
|
||||||
|
included)</small></p>
|
||||||
|
|
||||||
<p style="margin-left:11%; margin-top: 1em"><small>-
|
<p style="margin-left:11%; margin-top: 1em"><small>-
|
||||||
Cgi-bin links may not work properly in some cases
|
Cgi-bin links may not work properly in some cases
|
||||||
(parameters needed). To avoid them: use filters like
|
(parameters needed). To avoid them: use filters like
|
||||||
|
|||||||
@@ -288,8 +288,8 @@ This option define whether the engine has to abandon a host if a timeout/"too sl
|
|||||||
&P extended parsing, attempt to parse all links (even in unknown tags or Javascript)
|
&P extended parsing, attempt to parse all links (even in unknown tags or Javascript)
|
||||||
This option activates the extended parsing, that attempt to find links in unknown Html code/javascript
|
This option activates the extended parsing, that attempt to find links in unknown Html code/javascript
|
||||||
|
|
||||||
j *parse scripts (j0 don't parse)
|
j *parse Java Classes (j0 don't parse)
|
||||||
This option defines whether the engine has to parse scripts or not to catch included files
|
This option define whether the engine has to parse java files or not to catch included files
|
||||||
|
|
||||||
I *make an index (I0 don't make)
|
I *make an index (I0 don't make)
|
||||||
This option define whether the engine has to generate an index.html on the top directory
|
This option define whether the engine has to generate an index.html on the top directory
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ Note: the <i>Initialization</i>, <i>Main functions</i>, <i>Options handling</i>
|
|||||||
<li>the <tt>htsdefines.h</tt> prototype file, which describes callback function prototypes</li>
|
<li>the <tt>htsdefines.h</tt> prototype file, which describes callback function prototypes</li>
|
||||||
<li>the <tt>htsopt.h</tt> prototype file, which describes the full httrackp* structure</li>
|
<li>the <tt>htsopt.h</tt> prototype file, which describes the full httrackp* structure</li>
|
||||||
<li>the <tt>callbacks-example*.c</tt> files given in the httrack archive</li>
|
<li>the <tt>callbacks-example*.c</tt> files given in the httrack archive</li>
|
||||||
|
<li>the <tt>htsjava.c</tt> source file (the java class plugin ; overrides 'detect' and 'parse')</li>
|
||||||
<li>the example given at the end of this document</li>
|
<li>the example given at the end of this document</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ ${LANG_K3} : ${HTTRACK_WEB}
|
|||||||
|
|
||||||
<form>
|
<form>
|
||||||
<input type="button" value="OK" onClick="window.close();"
|
<input type="button" value="OK" onClick="window.close();"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -118,20 +118,20 @@ ${do:end-if}
|
|||||||
<form action="${thisfile}" name="form">
|
<form action="${thisfile}" name="form">
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr><td>${LANG_T2}</td><td>http://<input name="urladr"
|
<tr><td>${LANG_T2}</td><td>http://<input name="urladr"
|
||||||
title='${html:LANG_T10}' onMouseOver="info('${html:LANG_T10}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_T10}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
<tr><td colspan=2>
|
<tr><td colspan=2>
|
||||||
|
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<th>${LANG_T4}</th>
|
<th>${LANG_T4}</th>
|
||||||
<tr><td>${LANG_T5}:</td><td><input name="urllogin"
|
<tr><td>${LANG_T5}:</td><td><input name="urllogin"
|
||||||
title='${html:LANG_T12}' onMouseOver="info('${html:LANG_T12}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_T12}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
<tr><td>${LANG_T6}:</td><td><input name="urlpass"
|
<tr><td>${LANG_T6}:</td><td><input name="urlpass"
|
||||||
title='${html:LANG_T13}' onMouseOver="info('${html:LANG_T13}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_T13}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
<tr><td>${LANG_T7}:</td><td><input type="button" value="${LANG_T8}" onClick="alert('not yet implemented!')"
|
<tr><td>${LANG_T7}:</td><td><input type="button" value="${LANG_T8}" onClick="alert('not yet implemented!')"
|
||||||
title='${html:LANG_T14}' onMouseOver="info('${html:LANG_T14}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_T14}'); return true" onMouseOut="info(' '); return true"
|
||||||
></td></tr>
|
></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ ${do:end-if}
|
|||||||
|
|
||||||
<tr><td>
|
<tr><td>
|
||||||
<input type="button" value="OK" onClick="if (do_add()) { window.close(); }"
|
<input type="button" value="OK" onClick="if (do_add()) { window.close(); }"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -48,7 +48,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ function info(str) {
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr><td class="tabCtrl" align="left">
|
<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="_new"
|
||||||
title='${html:LANG_G21}' onMouseOver="info('${html:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${LANG_O16}...
|
${LANG_O16}...
|
||||||
</a>
|
</a>
|
||||||
@@ -67,7 +67,7 @@ ${LANG_O16}...
|
|||||||
<tr><td class="tabCtrl" align="left">
|
<tr><td class="tabCtrl" align="left">
|
||||||
<a style="background:black;color: white"
|
<a style="background:black;color: white"
|
||||||
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${HTTRACK_VERSIONID}&VersionStr=${HTTRACK_VERSION}&Platform=${HTS_PLATFORM}&LanguageId=${lang}" target="_new"
|
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${HTTRACK_VERSIONID}&VersionStr=${HTTRACK_VERSION}&Platform=${HTS_PLATFORM}&LanguageId=${lang}" target="_new"
|
||||||
title='${html:LANG_O17}' onMouseOver="info('${html:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${LANG_O17}...
|
${LANG_O17}...
|
||||||
</a>
|
</a>
|
||||||
@@ -78,7 +78,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<tr><td class="tabCtrl" align="left">
|
<tr><td class="tabCtrl" align="left">
|
||||||
<a style="background:black;color: white"
|
<a style="background:black;color: white"
|
||||||
href="/index.html" target="_new"
|
href="/index.html" target="_new"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${LANG_P16}
|
${LANG_P16}
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -113,7 +113,7 @@ ${LANG_THANKYOU}!
|
|||||||
|
|
||||||
<tr><td align="right">
|
<tr><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
||||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt1.html" target="_blank"
|
<a href="/step9_opt1.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -107,16 +107,16 @@ ${do:end-if}
|
|||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td><input type="checkbox" name="parseall" ${checked:parseall}
|
<tr><td><input type="checkbox" name="parseall" ${checked:parseall}
|
||||||
title='${html:LANG_I1}' onMouseOver="info('${html:LANG_I1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I31}</td></tr>
|
> ${LANG_I31}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="link" ${checked:link}
|
<tr><td><input type="checkbox" name="link" ${checked:link}
|
||||||
title='${html:LANG_I2}' onMouseOver="info('${html:LANG_I2}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I2}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I32}</td></tr>
|
> ${LANG_I32}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="testall" ${checked:testall}
|
<tr><td><input type="checkbox" name="testall" ${checked:testall}
|
||||||
title='${html:LANG_I2b}' onMouseOver="info('${html:LANG_I2b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I2b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I32b}</td></tr>
|
> ${LANG_I32b}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="htmlfirst" ${checked:htmlfirst}
|
<tr><td><input type="checkbox" name="htmlfirst" ${checked:htmlfirst}
|
||||||
title='${html:LANG_I2c}' onMouseOver="info('${html:LANG_I2c}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I2c}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I32c}</td></tr>
|
> ${LANG_I32c}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -125,12 +125,12 @@ ${do:end-if}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt7.html" target="_blank"
|
<a href="/step9_opt7.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt7.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt7.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -98,27 +98,17 @@ ${do:end-if}
|
|||||||
<input type="hidden" name="redirect" value="">
|
<input type="hidden" name="redirect" value="">
|
||||||
<input type="hidden" name="closeme" value="">
|
<input type="hidden" name="closeme" value="">
|
||||||
|
|
||||||
${LANG_PROXYTYPE}
|
|
||||||
<select name="proxytype"
|
|
||||||
title='${html:LANG_PROXYTYPETIP}' onMouseOver="info('${html:LANG_PROXYTYPETIP}'); return true" onMouseOut="info(' '); return true"
|
|
||||||
>
|
|
||||||
<option value=""${ztest:proxytype: selected:}>HTTP</option>
|
|
||||||
<option value="2"${test:proxytype::: selected}>HTTP (CONNECT tunnel)</option>
|
|
||||||
<option value="1"${test:proxytype:: selected}>SOCKS5</option>
|
|
||||||
</select>
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
${LANG_IOPT10}:
|
${LANG_IOPT10}:
|
||||||
<input name="prox" value="${prox}" size="32"
|
<input name="prox" value="${prox}" size="32"
|
||||||
title='${html:LANG_G14}' onMouseOver="info('${html:LANG_G14}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G14}'); return true" onMouseOut="info(' '); return true"
|
||||||
>:
|
>:
|
||||||
<input name="portprox" value="${portprox}" size="4"
|
<input name="portprox" value="${portprox}" size="4"
|
||||||
title='${html:LANG_G15}' onMouseOver="info('${html:LANG_G15}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G15}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<input type="checkbox" name="ftpprox" ${checked:ftpprox}
|
<input type="checkbox" name="ftpprox" ${checked:ftpprox}
|
||||||
title='${html:LANG_G15c}' onMouseOver="info('${html:LANG_G15c}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G15c}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I47c}
|
> ${LANG_I47c}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@@ -127,12 +117,12 @@ ${LANG_IOPT10}:
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt9.html" target="_blank"
|
<a href="/step9_opt9.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -112,97 +112,97 @@ ${LANG_W3}
|
|||||||
|
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext1" value="${ext1}"
|
<input name="ext1" value="${ext1}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime1" value="${mime1}"
|
<input name="mime1" value="${mime1}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext2" value="${ext2}"
|
<input name="ext2" value="${ext2}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime2" value="${mime2}"
|
<input name="mime2" value="${mime2}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext3" value="${ext3}"
|
<input name="ext3" value="${ext3}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime3" value="${mime3}"
|
<input name="mime3" value="${mime3}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext4" value="${ext4}"
|
<input name="ext4" value="${ext4}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime4" value="${mime4}"
|
<input name="mime4" value="${mime4}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext5" value="${ext5}"
|
<input name="ext5" value="${ext5}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime5" value="${mime5}"
|
<input name="mime5" value="${mime5}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext6" value="${ext6}"
|
<input name="ext6" value="${ext6}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime6" value="${mime6}"
|
<input name="mime6" value="${mime6}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext7" value="${ext7}"
|
<input name="ext7" value="${ext7}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime7" value="${mime7}"
|
<input name="mime7" value="${mime7}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td align="left">
|
<td align="left">
|
||||||
<input name="ext8" value="${ext8}"
|
<input name="ext8" value="${ext8}"
|
||||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
⇔
|
⇔
|
||||||
</td><td align="left">
|
</td><td align="left">
|
||||||
<input name="mime8" value="${mime8}"
|
<input name="mime8" value="${mime8}"
|
||||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
@@ -217,12 +217,12 @@ ${LANG_W3}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt5.html" target="_blank"
|
<a href="/step9_opt5.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -101,20 +101,20 @@ ${do:end-if}
|
|||||||
${LANG_I33}
|
${LANG_I33}
|
||||||
<br>
|
<br>
|
||||||
<select name="build"
|
<select name="build"
|
||||||
title='${html:LANG_I3}' onMouseOver="info('${html:LANG_I3}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I3}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:build:LISTDEF_3}
|
${listid:build:LISTDEF_3}
|
||||||
</select>
|
</select>
|
||||||
<input type="button" value="${LANG_O2}"
|
<input type="button" value="${LANG_O2}"
|
||||||
onClick="form.build.selectedIndex=14; window.open('option2b.html', 'option2b', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480').wparent=document; form.submit();"
|
onClick="form.build.selectedIndex=14; window.open('option2b.html', 'option2b', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480').wparent=document; form.submit();"
|
||||||
title='${html:LANG_I4}' onMouseOver="info('${html:LANG_I4}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I4}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
|
|
||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td>
|
<tr><td>
|
||||||
<select name="dos"
|
<select name="dos"
|
||||||
title='${html:LANG_I8} ${html:LANG_I8b}' onMouseOver="info('${html:LANG_I8}\r\n${LANG_I8b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I8}\r\n${LANG_I8b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<option value="0"${ztest:dos: selected::}> </option>
|
<option value="0"${ztest:dos: selected::}> </option>
|
||||||
<option value="1"${ztest:dos:: selected:}>${LANG_I37}</option>
|
<option value="1"${ztest:dos:: selected:}>${LANG_I37}</option>
|
||||||
@@ -122,19 +122,19 @@ ${listid:build:LISTDEF_3}
|
|||||||
</select>
|
</select>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr><td><input type="checkbox" name="errpage" ${checked:errpage}
|
<tr><td><input type="checkbox" name="errpage" ${checked:errpage}
|
||||||
title='${html:LANG_I9}' onMouseOver="info('${html:LANG_I9}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I9}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I38}</td></tr>
|
> ${LANG_I38}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="external" ${checked:external}
|
<tr><td><input type="checkbox" name="external" ${checked:external}
|
||||||
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I56}</td></tr>
|
> ${LANG_I56}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="hidepwd" ${checked:hidepwd}
|
<tr><td><input type="checkbox" name="hidepwd" ${checked:hidepwd}
|
||||||
title='${html:LANG_I30}' onMouseOver="info('${html:LANG_I30}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I30}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I66}</td></tr>
|
> ${LANG_I66}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="hidequery" ${checked:hidequery}
|
<tr><td><input type="checkbox" name="hidequery" ${checked:hidequery}
|
||||||
title='${html:LANG_I30b}' onMouseOver="info('${html:LANG_I30b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I30b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I67}</td></tr>
|
> ${LANG_I67}</td></tr>
|
||||||
<tr><td><input type="checkbox" name="nopurge" ${checked:nopurge}
|
<tr><td><input type="checkbox" name="nopurge" ${checked:nopurge}
|
||||||
title='${html:LANG_I1a}' onMouseOver="info('${html:LANG_I1a}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1a}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I57}</td></tr>
|
> ${LANG_I57}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -143,12 +143,12 @@ ${listid:build:LISTDEF_3}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt5.html" target="_blank"
|
<a href="/step9_opt5.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt5.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -107,12 +107,12 @@ ${LANG_Q3}
|
|||||||
${do:output-mode:html-urlescaped}
|
${do:output-mode:html-urlescaped}
|
||||||
onClick="if (confirm(str_replace(str_replace('${LANG_DIAL7}', '%20', ' '), '%0a', ' '))) { form.closeme.value=1; form.submit(); } return false;"
|
onClick="if (confirm(str_replace(str_replace('${LANG_DIAL7}', '%20', ' '), '%0a', ' '))) { form.closeme.value=1; form.submit(); } return false;"
|
||||||
${do:output-mode:}
|
${do:output-mode:}
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt10.html" target="_blank"
|
<a href="/step9_opt10.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt10.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt10.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,7 +104,7 @@ ${LANG_I40c}
|
|||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td><input type="checkbox" name="cache" ${checked:cache}
|
<tr><td><input type="checkbox" name="cache" ${checked:cache}
|
||||||
title='${html:LANG_I5}' onMouseOver="info('${html:LANG_I5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I5}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I34}</td></tr>
|
> ${LANG_I34}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
@@ -112,7 +112,7 @@ ${LANG_I40c}
|
|||||||
${LANG_I39}
|
${LANG_I39}
|
||||||
<br>
|
<br>
|
||||||
<select name="filter"
|
<select name="filter"
|
||||||
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:filter:LISTDEF_4}
|
${listid:filter:LISTDEF_4}
|
||||||
</select>
|
</select>
|
||||||
@@ -121,7 +121,7 @@ ${listid:filter:LISTDEF_4}
|
|||||||
${LANG_I40}
|
${LANG_I40}
|
||||||
<br>
|
<br>
|
||||||
<select name="travel"
|
<select name="travel"
|
||||||
title='${html:LANG_I11}' onMouseOver="info('${html:LANG_I11}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I11}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:travel:LISTDEF_5}
|
${listid:travel:LISTDEF_5}
|
||||||
</select>
|
</select>
|
||||||
@@ -130,7 +130,7 @@ ${listid:travel:LISTDEF_5}
|
|||||||
${LANG_I40b}
|
${LANG_I40b}
|
||||||
<br>
|
<br>
|
||||||
<select name="travel2"
|
<select name="travel2"
|
||||||
title='${html:LANG_I11b}' onMouseOver="info('${html:LANG_I11b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I11b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:travel2:LISTDEF_6}
|
${listid:travel2:LISTDEF_6}
|
||||||
</select>
|
</select>
|
||||||
@@ -139,7 +139,7 @@ ${listid:travel2:LISTDEF_6}
|
|||||||
${LANG_I40e}
|
${LANG_I40e}
|
||||||
<br>
|
<br>
|
||||||
<select name="travel3"
|
<select name="travel3"
|
||||||
title='${html:LANG_I11c}' onMouseOver="info('${html:LANG_I11c}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I11c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:travel3:LISTDEF_11}
|
${listid:travel3:LISTDEF_11}
|
||||||
</select>
|
</select>
|
||||||
@@ -148,7 +148,7 @@ ${listid:travel3:LISTDEF_11}
|
|||||||
<!-- checkboxes -->
|
<!-- checkboxes -->
|
||||||
<table border="0" width="100%" cellspacing="0">
|
<table border="0" width="100%" cellspacing="0">
|
||||||
<tr><td><input type="checkbox" name="windebug" ${checked:windebug}
|
<tr><td><input type="checkbox" name="windebug" ${checked:windebug}
|
||||||
title='${html:LANG_I1h}' onMouseOver="info('${html:LANG_I1h}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1h}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I40d}</td></tr>
|
> ${LANG_I40d}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
@@ -158,12 +158,12 @@ ${listid:travel3:LISTDEF_11}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt3.html" target="_blank"
|
<a href="/step9_opt3.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,11 +104,11 @@ ${do:end-if}
|
|||||||
${LANG_I44}
|
${LANG_I44}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="connexion" value="${connexion}" size="4"
|
<input name="connexion" value="${connexion}" size="4"
|
||||||
title='${html:LANG_I12}' onMouseOver="info('${html:LANG_I12}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I12}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr><tr><td></td><td>
|
</td></tr><tr><td></td><td>
|
||||||
<input type="checkbox" name="ka" ${checked:ka}
|
<input type="checkbox" name="ka" ${checked:ka}
|
||||||
title='${html:LANG_I47f}' onMouseOver="info('${html:LANG_I47f}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I47f}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I47e}
|
> ${LANG_I47e}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -116,11 +116,11 @@ ${LANG_I44}
|
|||||||
${LANG_I47d}
|
${LANG_I47d}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="timeout" value="${timeout}" size="4"
|
<input name="timeout" value="${timeout}" size="4"
|
||||||
title='${html:LANG_I13}' onMouseOver="info('${html:LANG_I13}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I13}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr><tr><td></td><td>
|
</td></tr><tr><td></td><td>
|
||||||
<input type="checkbox" name="remt" ${checked:remt}
|
<input type="checkbox" name="remt" ${checked:remt}
|
||||||
title='${html:LANG_I14}' onMouseOver="info('${html:LANG_I14}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I14}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I45}
|
> ${LANG_I45}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ ${LANG_I47d}
|
|||||||
${LANG_I48}
|
${LANG_I48}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="retry" value="${retry}" size="4"
|
<input name="retry" value="${retry}" size="4"
|
||||||
title='${html:LANG_I17}' onMouseOver="info('${html:LANG_I17}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I17}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -136,11 +136,11 @@ ${LANG_I48}
|
|||||||
${LANG_I46}
|
${LANG_I46}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="rate" value="${rate}" size="4"
|
<input name="rate" value="${rate}" size="4"
|
||||||
title='${html:LANG_I15}' onMouseOver="info('${html:LANG_I15}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I15}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr><tr><td></td><td>
|
</td></tr><tr><td></td><td>
|
||||||
<input type="checkbox" name="rems" ${checked:rems}
|
<input type="checkbox" name="rems" ${checked:rems}
|
||||||
title='${html:LANG_I16}' onMouseOver="info('${html:LANG_I16}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I16}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I47}
|
> ${LANG_I47}
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -151,12 +151,12 @@ ${LANG_I46}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt2.html" target="_blank"
|
<a href="/step9_opt2.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,7 +104,7 @@ ${do:end-if}
|
|||||||
${LANG_G32}
|
${LANG_G32}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="depth" value="${depth}" size="4"
|
<input name="depth" value="${depth}" size="4"
|
||||||
title='${html:LANG_I1g}' onMouseOver="info('${html:LANG_I1g}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1g}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ ${LANG_G32}
|
|||||||
${LANG_G32b}
|
${LANG_G32b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="depth2" value="${depth2}" size="4"
|
<input name="depth2" value="${depth2}" size="4"
|
||||||
title='${html:LANG_I1g2}' onMouseOver="info('${html:LANG_I1g2}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1g2}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ ${LANG_G32b}
|
|||||||
${LANG_I50}
|
${LANG_I50}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxhtml" value="${maxhtml}" size="4"
|
<input name="maxhtml" value="${maxhtml}" size="4"
|
||||||
title='${html:LANG_I18}' onMouseOver="info('${html:LANG_I18}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I18}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ ${LANG_I50}
|
|||||||
${LANG_I50b}
|
${LANG_I50b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="othermax" value="${othermax}" size="4"
|
<input name="othermax" value="${othermax}" size="4"
|
||||||
title='${html:LANG_I19}' onMouseOver="info('${html:LANG_I19}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I19}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ ${LANG_I50b}
|
|||||||
${LANG_I51}
|
${LANG_I51}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="sizemax" value="${sizemax}" size="4"
|
<input name="sizemax" value="${sizemax}" size="4"
|
||||||
title='${html:LANG_I20}' onMouseOver="info('${html:LANG_I20}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I20}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -144,15 +144,7 @@ ${LANG_I51}
|
|||||||
${LANG_I65}
|
${LANG_I65}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="pausebytes" value="${pausebytes}" size="4"
|
<input name="pausebytes" value="${pausebytes}" size="4"
|
||||||
title='${html:LANG_I20b}' onMouseOver="info('${html:LANG_I20b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I20b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
|
||||||
</td></tr>
|
|
||||||
|
|
||||||
<tr><td>
|
|
||||||
${LANG_PAUSEFILES}
|
|
||||||
</td><td>
|
|
||||||
<input name="pausefiles" value="${pausefiles}" size="8"
|
|
||||||
title='${html:LANG_PAUSEFILESTIP}' onMouseOver="info('${html:LANG_PAUSEFILESTIP}'); return true" onMouseOut="info(' '); return true"
|
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -160,7 +152,7 @@ ${LANG_PAUSEFILES}
|
|||||||
${LANG_I52}
|
${LANG_I52}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxtime" value="${maxtime}" size="4"
|
<input name="maxtime" value="${maxtime}" size="4"
|
||||||
title='${html:LANG_I21}' onMouseOver="info('${html:LANG_I21}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I21}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -168,7 +160,7 @@ ${LANG_I52}
|
|||||||
${LANG_I54}
|
${LANG_I54}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxrate" value="${maxrate}" size="4"
|
<input name="maxrate" value="${maxrate}" size="4"
|
||||||
title='${html:LANG_I22}' onMouseOver="info('${html:LANG_I22}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I22}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -176,7 +168,7 @@ ${LANG_I54}
|
|||||||
${LANG_I64}
|
${LANG_I64}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxconn" value="${maxconn}" size="4"
|
<input name="maxconn" value="${maxconn}" size="4"
|
||||||
title='${html:LANG_I22b}' onMouseOver="info('${html:LANG_I22b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I22b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -184,7 +176,7 @@ ${LANG_I64}
|
|||||||
${LANG_I64b}
|
${LANG_I64b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="maxlinks" value="${maxlinks}" size="4"
|
<input name="maxlinks" value="${maxlinks}" size="4"
|
||||||
title='${html:LANG_I22c}' onMouseOver="info('${html:LANG_I22c}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I22c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -193,12 +185,12 @@ ${LANG_I64b}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt8.html" target="_blank"
|
<a href="/step9_opt8.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt8.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt8.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -104,7 +104,7 @@ ${do:end-if}
|
|||||||
${LANG_I43}
|
${LANG_I43}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="user" value="${user}" size="60"
|
<input name="user" value="${user}" size="60"
|
||||||
title='${html:LANG_I23}' onMouseOver="info('${html:LANG_I23}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I23}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ ${LANG_I43}
|
|||||||
${LANG_I43b}
|
${LANG_I43b}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="footer" value="${footer}" size="60"
|
<input name="footer" value="${footer}" size="60"
|
||||||
title='${html:LANG_I23b}' onMouseOver="info('${html:LANG_I23b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I23b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
|
|
||||||
@@ -123,12 +123,12 @@ ${LANG_I43b}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt4.html" target="_blank"
|
<a href="/step9_opt4.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt4.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt4.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -102,7 +102,7 @@ ${do:end-if}
|
|||||||
${LANG_B10}
|
${LANG_B10}
|
||||||
</tt>
|
</tt>
|
||||||
<textarea name="url2" cols="60" rows="8"
|
<textarea name="url2" cols="60" rows="8"
|
||||||
title='${html:LANG_C3}' onMouseOver="info('${html:LANG_C3}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_C3}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${url2}</textarea>
|
>${url2}</textarea>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
@@ -115,12 +115,12 @@ ${LANG_B13}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt6.html" target="_blank"
|
<a href="/step9_opt6.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt6.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt6.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -99,77 +99,50 @@ ${do:end-if}
|
|||||||
<input type="hidden" name="closeme" value="">
|
<input type="hidden" name="closeme" value="">
|
||||||
|
|
||||||
<input type="checkbox" name="cookies" ${checked:cookies}
|
<input type="checkbox" name="cookies" ${checked:cookies}
|
||||||
title='${html:LANG_I1b}' onMouseOver="info('${html:LANG_I1b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I58}
|
> ${LANG_I58}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
${LANG_COOKIEFILE}
|
|
||||||
<input name="cookiesfile" value="${cookiesfile}" size="40"
|
|
||||||
title='${html:LANG_COOKIEFILETIP}' onMouseOver="info('${html:LANG_COOKIEFILETIP}'); return true" onMouseOut="info(' '); return true"
|
|
||||||
>
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
${LANG_I59}
|
${LANG_I59}
|
||||||
<br>
|
<br>
|
||||||
<select name="checktype"
|
<select name="checktype"
|
||||||
title='${html:LANG_I1c}' onMouseOver="info('${html:LANG_I1c}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:checktype:LISTDEF_7}
|
${listid:checktype:LISTDEF_7}
|
||||||
</select>
|
</select>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="parsejava" ${checked:parsejava}
|
<input type="checkbox" name="parsejava" ${checked:parsejava}
|
||||||
title='${html:LANG_I1d}' onMouseOver="info('${html:LANG_I1d}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1d}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I60}
|
> ${LANG_I60}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
${LANG_I55}
|
${LANG_I55}
|
||||||
<br>
|
<br>
|
||||||
<select name="robots"
|
<select name="robots"
|
||||||
title='${html:LANG_I28}' onMouseOver="info('${html:LANG_I28}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I28}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:robots:LISTDEF_8}
|
${listid:robots:LISTDEF_8}
|
||||||
</select>
|
</select>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="updhack" ${checked:updhack}
|
<input type="checkbox" name="updhack" ${checked:updhack}
|
||||||
title='${html:LANG_I1k}' onMouseOver="info('${html:LANG_I1k}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1k}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I62b}
|
> ${LANG_I62b}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="urlhack" ${checked:urlhack}
|
<input type="checkbox" name="urlhack" ${checked:urlhack}
|
||||||
title='${html:LANG_I1k2}' onMouseOver="info('${html:LANG_I1k2}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1k2}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I62b2}
|
> ${LANG_I62b2}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="keepwww" ${checked:keepwww}
|
|
||||||
title='${html:LANG_KEEPWWWTIP}' onMouseOver="info('${html:LANG_KEEPWWWTIP}'); return true" onMouseOut="info(' '); return true"
|
|
||||||
> ${LANG_KEEPWWW}
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
<input type="checkbox" name="keepslashes" ${checked:keepslashes}
|
|
||||||
title='${html:LANG_KEEPSLASHESTIP}' onMouseOver="info('${html:LANG_KEEPSLASHESTIP}'); return true" onMouseOut="info(' '); return true"
|
|
||||||
> ${LANG_KEEPSLASHES}
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
<input type="checkbox" name="keepqueryorder" ${checked:keepqueryorder}
|
|
||||||
title='${html:LANG_KEEPQUERYORDERTIP}' onMouseOver="info('${html:LANG_KEEPQUERYORDERTIP}'); return true" onMouseOut="info(' '); return true"
|
|
||||||
> ${LANG_KEEPQUERYORDER}
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
${LANG_STRIPQUERY}
|
|
||||||
<input name="stripquery" value="${stripquery}" size="40"
|
|
||||||
title='${html:LANG_STRIPQUERYTIP}' onMouseOver="info('${html:LANG_STRIPQUERYTIP}'); return true" onMouseOut="info(' '); return true"
|
|
||||||
>
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
<input type="checkbox" name="toler" ${checked:toler}
|
<input type="checkbox" name="toler" ${checked:toler}
|
||||||
title='${html:LANG_I1i}' onMouseOver="info('${html:LANG_I1i}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1i}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I62}
|
> ${LANG_I62}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="http10" ${checked:http10}
|
<input type="checkbox" name="http10" ${checked:http10}
|
||||||
title='${html:LANG_I1j}' onMouseOver="info('${html:LANG_I1j}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1j}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I63}
|
> ${LANG_I63}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@@ -179,12 +152,12 @@ ${LANG_STRIPQUERY}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step9_opt9.html" target="_blank"
|
<a href="/step9_opt9.html" target="_blank"
|
||||||
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step9_opt9.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
|||||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT1}' onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option1.html" onClick="form.redirect.value='option1.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT1}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT1}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT2}' onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option2.html" onClick="form.redirect.value='option2.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT2}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT2}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT3}' onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option3.html" onClick="form.redirect.value='option3.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT3}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT3}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT4}' onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option4.html" onClick="form.redirect.value='option4.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT4}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT4}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT5}' onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option5.html" onClick="form.redirect.value='option5.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT5}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT5}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT11}' onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option11.html" onClick="form.redirect.value='option11.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT11}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT11}</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT6}' onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option6.html" onClick="form.redirect.value='option6.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT6}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT6}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT7}' onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option7.html" onClick="form.redirect.value='option7.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT7}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT7}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT8}' onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option8.html" onClick="form.redirect.value='option8.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT8}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT8}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT9}' onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option9.html" onClick="form.redirect.value='option9.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT9}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT9}</a></td>
|
||||||
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" title='${html:LANG_IOPT10}' onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
<td class="tabCtrl" align="center"><a style="background:black;color: white" href="option10.html" onClick="form.redirect.value='option10.html'; form.submit(); return false;" align="center" onMouseOver="info('${html:LANG_IOPT10}'); return true" onMouseOut="info(' '); return true">${LANG_IOPT10}</a></td>
|
||||||
<td class="tabCtrl" align="center"> </td>
|
<td class="tabCtrl" align="center"> </td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -99,32 +99,32 @@ ${do:end-if}
|
|||||||
<input type="hidden" name="closeme" value="">
|
<input type="hidden" name="closeme" value="">
|
||||||
|
|
||||||
<input type="checkbox" name="cache2" ${checked:cache2}
|
<input type="checkbox" name="cache2" ${checked:cache2}
|
||||||
title='${html:LANG_I1e}' onMouseOver="info('${html:LANG_I1e}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1e}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I61}
|
> ${LANG_I61}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="norecatch" ${checked:norecatch}
|
<input type="checkbox" name="norecatch" ${checked:norecatch}
|
||||||
title='${html:LANG_I5b}' onMouseOver="info('${html:LANG_I5b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I5b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I34b}
|
> ${LANG_I34b}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="logf" ${checked:logf}
|
<input type="checkbox" name="logf" ${checked:logf}
|
||||||
title='${html:LANG_I7}' onMouseOver="info('${html:LANG_I7}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I7}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I36}
|
> ${LANG_I36}
|
||||||
<select name="logtype"
|
<select name="logtype"
|
||||||
title='${html:LANG_I1f}' onMouseOver="info('${html:LANG_I1f}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I1f}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:logtype:LISTDEF_9}
|
${listid:logtype:LISTDEF_9}
|
||||||
</select>
|
</select>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="index" ${checked:index}
|
<input type="checkbox" name="index" ${checked:index}
|
||||||
title='${html:LANG_I6}' onMouseOver="info('${html:LANG_I6}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I6}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I35}
|
> ${LANG_I35}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<input type="checkbox" name="index2" ${checked:index2}
|
<input type="checkbox" name="index2" ${checked:index2}
|
||||||
title='${html:LANG_I6b}' onMouseOver="info('${html:LANG_I6b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_I6b}'); return true" onMouseOut="info(' '); return true"
|
||||||
> ${LANG_I35b}
|
> ${LANG_I35b}
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
@@ -133,12 +133,12 @@ ${listid:logtype:LISTDEF_9}
|
|||||||
<tr><td align="left">
|
<tr><td align="left">
|
||||||
<input type="submit" value="${LANG_OK}"
|
<input type="submit" value="${LANG_OK}"
|
||||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="button" value="${LANG_CANCEL}"
|
<input type="button" value="${LANG_CANCEL}"
|
||||||
onClick="window.close();"
|
onClick="window.close();"
|
||||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ function no_refresh() {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -152,20 +152,20 @@ ${LANG_H20} ${info.currentjob}
|
|||||||
|
|
||||||
<table border="0" width="100%">
|
<table border="0" width="100%">
|
||||||
|
|
||||||
<tr><td>${info.state[0]}</td><td>${info.name[0]}</td><td>${info.file[0]}</td><td>${info.size[0]}/${info.sizetot[0]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[0]}'; form.submit()" title='${html:LANG_H6}' onMouseOver="info('${html:LANG_H6}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[0]}</td><td>${info.name[0]}</td><td>${info.file[0]}</td><td>${info.size[0]}/${info.sizetot[0]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[0]}'; form.submit()" onMouseOver="info('${html:LANG_H6}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[1]}</td><td>${info.name[1]}</td><td>${info.file[1]}</td><td>${info.size[1]}/${info.sizetot[1]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[1]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[1]}</td><td>${info.name[1]}</td><td>${info.file[1]}</td><td>${info.size[1]}/${info.sizetot[1]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[1]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[2]}</td><td>${info.name[2]}</td><td>${info.file[2]}</td><td>${info.size[2]}/${info.sizetot[2]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[2]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[2]}</td><td>${info.name[2]}</td><td>${info.file[2]}</td><td>${info.size[2]}/${info.sizetot[2]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[2]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[3]}</td><td>${info.name[3]}</td><td>${info.file[3]}</td><td>${info.size[3]}/${info.sizetot[3]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[3]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[3]}</td><td>${info.name[3]}</td><td>${info.file[3]}</td><td>${info.size[3]}/${info.sizetot[3]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[3]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[4]}</td><td>${info.name[4]}</td><td>${info.file[4]}</td><td>${info.size[4]}/${info.sizetot[4]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[4]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[4]}</td><td>${info.name[4]}</td><td>${info.file[4]}</td><td>${info.size[4]}/${info.sizetot[4]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[4]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[5]}</td><td>${info.name[5]}</td><td>${info.file[5]}</td><td>${info.size[5]}/${info.sizetot[5]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[5]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[5]}</td><td>${info.name[5]}</td><td>${info.file[5]}</td><td>${info.size[5]}/${info.sizetot[5]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[5]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[6]}</td><td>${info.name[6]}</td><td>${info.file[6]}</td><td>${info.size[6]}/${info.sizetot[6]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[6]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[6]}</td><td>${info.name[6]}</td><td>${info.file[6]}</td><td>${info.size[6]}/${info.sizetot[6]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[6]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[7]}</td><td>${info.name[7]}</td><td>${info.file[7]}</td><td>${info.size[7]}/${info.sizetot[7]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[7]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[7]}</td><td>${info.name[7]}</td><td>${info.file[7]}</td><td>${info.size[7]}/${info.sizetot[7]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[7]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[8]}</td><td>${info.name[8]}</td><td>${info.file[8]}</td><td>${info.size[8]}/${info.sizetot[8]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[8]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[8]}</td><td>${info.name[8]}</td><td>${info.file[8]}</td><td>${info.size[8]}/${info.sizetot[8]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[8]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[9]}</td><td>${info.name[9]}</td><td>${info.file[9]}</td><td>${info.size[9]}/${info.sizetot[9]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[9]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[9]}</td><td>${info.name[9]}</td><td>${info.file[9]}</td><td>${info.size[9]}/${info.sizetot[9]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[9]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[10]}</td><td>${info.name[10]}</td><td>${info.file[10]}</td><td>${info.size[10]}/${info.sizetot[10]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[10]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[10]}</td><td>${info.name[10]}</td><td>${info.file[10]}</td><td>${info.size[10]}/${info.sizetot[10]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[10]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[11]}</td><td>${info.name[11]}</td><td>${info.file[11]}</td><td>${info.size[11]}/${info.sizetot[11]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[11]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[11]}</td><td>${info.name[11]}</td><td>${info.file[11]}</td><td>${info.size[11]}/${info.sizetot[11]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[11]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[12]}</td><td>${info.name[12]}</td><td>${info.file[12]}</td><td>${info.size[12]}/${info.sizetot[12]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[12]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[12]}</td><td>${info.name[12]}</td><td>${info.file[12]}</td><td>${info.size[12]}/${info.sizetot[12]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[12]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
<tr><td>${info.state[13]}</td><td>${info.name[13]}</td><td>${info.file[13]}</td><td>${info.size[13]}/${info.sizetot[13]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[13]}'; form.submit()" title='${html:LANG_H7}' onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
<tr><td>${info.state[13]}</td><td>${info.name[13]}</td><td>${info.file[13]}</td><td>${info.size[13]}/${info.sizetot[13]}</td><td><input type="submit" value="${LANG_H15}" onClick="form.command.value='cancel-file=${info.url_sav[13]}'; form.submit()" onMouseOver="info('${html:LANG_H7}'); return true" onMouseOut="info(' '); return true"></td></tr>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ ${LANG_H20} ${info.currentjob}
|
|||||||
|
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input type="submit" value=" ${LANG_V4} "
|
<input type="submit" value=" ${LANG_V4} "
|
||||||
title='${html:LANG_D3}' onMouseOver="disable_timer(); info('${LANG_D3}'); return true"
|
onMouseOver="disable_timer(); info('${LANG_D3}'); return true"
|
||||||
onMouseOut="info(' '); enable_timer(); return true"
|
onMouseOut="info(' '); enable_timer(); return true"
|
||||||
onClick="if (do_confirm('${LANG_G1}')) { form.command.value='cancel'; form.submit(); } return false"
|
onClick="if (do_confirm('${LANG_G1}')) { form.command.value='cancel'; form.submit(); } return false"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_O1}' onMouseOver="info('${html:html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -64,7 +64,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -93,7 +93,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step1.html" target="_blank"
|
<a href="/step1.html" target="_blank"
|
||||||
onClick="window.open('/step1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step1.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -129,21 +129,15 @@ ${do:copy:NoPwdInPages:hidepwd}
|
|||||||
${do:copy:NoQueryStrings:hidequery}
|
${do:copy:NoQueryStrings:hidequery}
|
||||||
${do:copy:NoPurgeOldFiles:nopurge}
|
${do:copy:NoPurgeOldFiles:nopurge}
|
||||||
${do:copy:Cookies:cookies}
|
${do:copy:Cookies:cookies}
|
||||||
${do:copy:CookiesFile:cookiesfile}
|
|
||||||
${do:copy:CheckType:checktype}
|
${do:copy:CheckType:checktype}
|
||||||
${do:copy:ParseJava:parsejava}
|
${do:copy:ParseJava:parsejava}
|
||||||
${do:copy:HTTP10:http10}
|
${do:copy:HTTP10:http10}
|
||||||
${do:copy:TolerantRequests:toler}
|
${do:copy:TolerantRequests:toler}
|
||||||
${do:copy:UpdateHack:updhack}
|
${do:copy:UpdateHack:updhack}
|
||||||
${do:copy:URLHack:urlhack}
|
${do:copy:URLHack:urlhack}
|
||||||
${do:copy:KeepWww:keepwww}
|
|
||||||
${do:copy:KeepSlashes:keepslashes}
|
|
||||||
${do:copy:KeepQueryOrder:keepqueryorder}
|
|
||||||
${do:copy:StripQuery:stripquery}
|
|
||||||
${do:copy:StoreAllInCache:cache2}
|
${do:copy:StoreAllInCache:cache2}
|
||||||
${do:copy:LogType:logtype}
|
${do:copy:LogType:logtype}
|
||||||
${do:copy:UseHTTPProxyForFTP:ftpprox}
|
${do:copy:UseHTTPProxyForFTP:ftpprox}
|
||||||
${do:copy:ProxyType:proxytype}
|
|
||||||
${do:copy:Build:build}
|
${do:copy:Build:build}
|
||||||
${do:copy:PrimaryScan:filter}
|
${do:copy:PrimaryScan:filter}
|
||||||
${do:copy:Travel:travel}
|
${do:copy:Travel:travel}
|
||||||
@@ -154,7 +148,6 @@ ${do:copy:MaxHtml:maxhtml}
|
|||||||
${do:copy:MaxOther:othermax}
|
${do:copy:MaxOther:othermax}
|
||||||
${do:copy:MaxAll:sizemax}
|
${do:copy:MaxAll:sizemax}
|
||||||
${do:copy:MaxWait:pausebytes}
|
${do:copy:MaxWait:pausebytes}
|
||||||
${do:copy:PauseFiles:pausefiles}
|
|
||||||
${do:copy:Sockets:connexion}
|
${do:copy:Sockets:connexion}
|
||||||
${do:copy:Retry:retry}
|
${do:copy:Retry:retry}
|
||||||
${do:copy:MaxTime:maxtime}
|
${do:copy:MaxTime:maxtime}
|
||||||
@@ -218,7 +211,7 @@ ${do:loadhash}
|
|||||||
|
|
||||||
${LANG_S11}
|
${LANG_S11}
|
||||||
<input name="projname" value="${projname}"
|
<input name="projname" value="${projname}"
|
||||||
title='${html:LANG_S1}' onMouseOver="info('${html:html:LANG_S1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_S1}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
@@ -233,7 +226,7 @@ ${do:loadhash}
|
|||||||
</select>
|
</select>
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="projcateg" value="${projcateg}"
|
<input name="projcateg" value="${projcateg}"
|
||||||
title='${html:LANG_S5}' onMouseOver="info('${html:html:LANG_S5}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_S5}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
|
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
@@ -241,7 +234,7 @@ ${do:loadhash}
|
|||||||
<br>
|
<br>
|
||||||
${LANG_S12}
|
${LANG_S12}
|
||||||
<input name="path" value="${path}"
|
<input name="path" value="${path}"
|
||||||
title='${html:LANG_S2}' onMouseOver="info('${html:html:LANG_S2}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_S2}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
<input type="button" value="refresh" onClick="form.redirect.value='step2.html'; form.submit()">
|
<input type="button" value="refresh" onClick="form.redirect.value='step2.html'; form.submit()">
|
||||||
|
|
||||||
@@ -250,11 +243,11 @@ ${do:loadhash}
|
|||||||
<tr><td>
|
<tr><td>
|
||||||
<table width="100%" border="0"><tr><td align="left">
|
<table width="100%" border="0"><tr><td align="left">
|
||||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='index.html'; form.submit()"
|
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='index.html'; form.submit()"
|
||||||
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> " onClick="return checkname();" default
|
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> " onClick="return checkname();" default
|
||||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ function do_check_child() {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -73,7 +73,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -102,7 +102,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step2.html" target="_blank"
|
<a href="/step2.html" target="_blank"
|
||||||
onClick="window.open('/step2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step2.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -118,7 +118,7 @@ ${do:end-if}
|
|||||||
<tr><td>
|
<tr><td>
|
||||||
${LANG_G31}
|
${LANG_G31}
|
||||||
<select name="todo"
|
<select name="todo"
|
||||||
title='${html:LANG_G9}' onMouseOver="info('${html:LANG_G9}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G9}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${listid:todo:LISTDEF_10}
|
${listid:todo:LISTDEF_10}
|
||||||
</select>
|
</select>
|
||||||
@@ -131,12 +131,12 @@ ${do:end-if}
|
|||||||
</td><td>
|
</td><td>
|
||||||
<input type="button" value="${LANG_G43}"
|
<input type="button" value="${LANG_G43}"
|
||||||
onClick="doOpenWindow()"
|
onClick="doOpenWindow()"
|
||||||
title='${html:LANG_G24b}' onMouseOver="info('${html:LANG_G24b}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G24b}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
<br>
|
<br>
|
||||||
<textarea name="urls" cols="50" rows="8"
|
<textarea name="urls" cols="50" rows="8"
|
||||||
title='${html:LANG_G11}' onMouseOver="info('${html:LANG_G11}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G11}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
${do:output-mode:html}
|
${do:output-mode:html}
|
||||||
${urls}
|
${urls}
|
||||||
@@ -150,7 +150,7 @@ ${do:output-mode:}
|
|||||||
${LANG_URLLIST}:
|
${LANG_URLLIST}:
|
||||||
</td><td>
|
</td><td>
|
||||||
<input name="filelist" value="${filelist}" size="40"
|
<input name="filelist" value="${filelist}" size="40"
|
||||||
title='${html:LANG_G24c}' onMouseOver="info('${html:LANG_G24c}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G24c}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ ${do:output-mode:}
|
|||||||
${LANG_G41}
|
${LANG_G41}
|
||||||
</td><td>
|
</td><td>
|
||||||
<input type="button" value="${LANG_G40}" onClick="window.open('option1.html', 'option1', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
<input type="button" value="${LANG_G40}" onClick="window.open('option1.html', 'option1', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_G24}' onMouseOver="info('${html:LANG_G24}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_G24}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
@@ -170,11 +170,11 @@ ${do:output-mode:}
|
|||||||
<tr><td align="right">
|
<tr><td align="right">
|
||||||
<table width="100%" border="0"><tr><td align="left">
|
<table width="100%" border="0"><tr><td align="left">
|
||||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='step2.html'; form.submit()"
|
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='step2.html'; form.submit()"
|
||||||
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
||||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ function info(str) {
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/server/file.html" target="_blank"
|
<a href="/server/file.html" target="_blank"
|
||||||
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/file.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O1}
|
${LANG_O1}
|
||||||
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td id="subTitle" align="right">
|
<td id="subTitle" align="right">
|
||||||
<a href="/index.html" target="_blank"
|
<a href="/index.html" target="_blank"
|
||||||
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/server/help.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
style="color:#FFFFFF"
|
style="color:#FFFFFF"
|
||||||
>
|
>
|
||||||
${LANG_O5}
|
${LANG_O5}
|
||||||
@@ -84,7 +84,7 @@ ${do:if-file-exists:html/index.html}
|
|||||||
<td>
|
<td>
|
||||||
<a href="/step3.html" target="_blank"
|
<a href="/step3.html" target="_blank"
|
||||||
onClick="window.open('/step3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
onClick="window.open('/step3.html', 'help', 'toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, width=640, height=480'); return false"
|
||||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||||
>${LANG_TIPHELP}</a>
|
>${LANG_TIPHELP}</a>
|
||||||
</td>
|
</td>
|
||||||
${do:end-if}
|
${do:end-if}
|
||||||
@@ -178,12 +178,6 @@ ${do:end-if}
|
|||||||
${test:parsejava:--parse-java=0:}
|
${test:parsejava:--parse-java=0:}
|
||||||
${test:updhack:--updatehack}
|
${test:updhack:--updatehack}
|
||||||
${test:urlhack:--urlhack=0:--urlhack}
|
${test:urlhack:--urlhack=0:--urlhack}
|
||||||
${test:keepwww:--keep-www-prefix}
|
|
||||||
${test:keepslashes:--keep-double-slashes}
|
|
||||||
${test:keepqueryorder:--keep-query-order}
|
|
||||||
${test:cookiesfile:--cookies-file "}${html:cookiesfile}${test:cookiesfile:"}
|
|
||||||
${test:pausefiles:--pause "}${pausefiles}${test:pausefiles:"}
|
|
||||||
${test:stripquery:--strip-query "}${html:stripquery}${test:stripquery:"}
|
|
||||||
${test:toler:--tolerant}
|
${test:toler:--tolerant}
|
||||||
${test:http10:--http-10}
|
${test:http10:--http-10}
|
||||||
${test:cache2:--store-all-in-cache}
|
${test:cache2:--store-all-in-cache}
|
||||||
@@ -192,7 +186,7 @@ ${do:end-if}
|
|||||||
${test:logtype:::--extra-log:--debug-log}
|
${test:logtype:::--extra-log:--debug-log}
|
||||||
${test:index:--index=0:}
|
${test:index:--index=0:}
|
||||||
${test:index2:--search-index=0:--search-index}
|
${test: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}${prox}${test:prox:\3A}${portprox}${test:prox:"}
|
${test:prox:--proxy "}${prox}${test:prox:\3A}${portprox}${test:prox:"}
|
||||||
${test:ftpprox:--httpproxy-ftp=0:--httpproxy-ftp}
|
${test:ftpprox:--httpproxy-ftp=0:--httpproxy-ftp}
|
||||||
</textarea>
|
</textarea>
|
||||||
|
|
||||||
@@ -225,21 +219,15 @@ NoPwdInPages=${ztest:hidepwd:0:1}
|
|||||||
NoQueryStrings=${ztest:hidequery:0:1}
|
NoQueryStrings=${ztest:hidequery:0:1}
|
||||||
NoPurgeOldFiles=${ztest:nopurge:0:1}
|
NoPurgeOldFiles=${ztest:nopurge:0:1}
|
||||||
Cookies=${ztest:cookies:0:1}
|
Cookies=${ztest:cookies:0:1}
|
||||||
CookiesFile=${cookiesfile}
|
|
||||||
CheckType=${ztest:checktype:0:1:2}
|
CheckType=${ztest:checktype:0:1:2}
|
||||||
ParseJava=${ztest:parsejava:0:1}
|
ParseJava=${ztest:parsejava:0:1}
|
||||||
HTTP10=${ztest:http10:0:1}
|
HTTP10=${ztest:http10:0:1}
|
||||||
TolerantRequests=${ztest:toler:0:1}
|
TolerantRequests=${ztest:toler:0:1}
|
||||||
UpdateHack=${ztest:updhack:0:1}
|
UpdateHack=${ztest:updhack:0:1}
|
||||||
URLHack=${ztest:urlhack:0:1}
|
URLHack=${ztest:urlhack:0:1}
|
||||||
KeepWww=${ztest:keepwww:0:1}
|
|
||||||
KeepSlashes=${ztest:keepslashes:0:1}
|
|
||||||
KeepQueryOrder=${ztest:keepqueryorder:0:1}
|
|
||||||
StripQuery=${stripquery}
|
|
||||||
StoreAllInCache=${ztest:cache2:0:1}
|
StoreAllInCache=${ztest:cache2:0:1}
|
||||||
LogType=${logtype}
|
LogType=${logtype}
|
||||||
UseHTTPProxyForFTP=${ztest:ftpprox:0:1}
|
UseHTTPProxyForFTP=${ztest:ftpprox:0:1}
|
||||||
ProxyType=${proxytype}
|
|
||||||
Build=${build}
|
Build=${build}
|
||||||
PrimaryScan=${filter}
|
PrimaryScan=${filter}
|
||||||
Travel=${travel}
|
Travel=${travel}
|
||||||
@@ -250,7 +238,6 @@ MaxHtml=${maxhtml}
|
|||||||
MaxOther=${othermax}
|
MaxOther=${othermax}
|
||||||
MaxAll=${sizemax}
|
MaxAll=${sizemax}
|
||||||
MaxWait=${pausebytes}
|
MaxWait=${pausebytes}
|
||||||
PauseFiles=${pausefiles}
|
|
||||||
Sockets=${connexion}
|
Sockets=${connexion}
|
||||||
Retry=${retry}
|
Retry=${retry}
|
||||||
MaxTime=${maxtime}
|
MaxTime=${maxtime}
|
||||||
@@ -298,11 +285,11 @@ ${do:output-mode:}
|
|||||||
</td></tr><tr><td>
|
</td></tr><tr><td>
|
||||||
<table width="100%" border="0"><tr><td align="left">
|
<table width="100%" border="0"><tr><td align="left">
|
||||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.command.value=''; form.redirect.value='step3.html'; form.submit()"
|
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.command.value=''; form.redirect.value='step3.html'; form.submit()"
|
||||||
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td><td align="right">
|
</td><td align="right">
|
||||||
<input name="nextBtn" type="submit" value=" ${LANG_J9} >> "
|
<input name="nextBtn" type="submit" value=" ${LANG_J9} >> "
|
||||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||||
>
|
>
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
|
|||||||
@@ -118,8 +118,8 @@ h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
|||||||
<br>Avoid "never", because the local mirror could be bogus
|
<br>Avoid "never", because the local mirror could be bogus
|
||||||
</small><br><br>
|
</small><br><br>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<li>Parse scripts</li>
|
<li>Parse java files</li>
|
||||||
<br><small>Must the engine parse scripts to seek included filenames?
|
<br><small>Must the engine parse .java files (java classes) to seek included filenames?
|
||||||
<br>It is checked by default
|
<br>It is checked by default
|
||||||
</small><br><br>
|
</small><br><br>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|||||||
28
lang.def
28
lang.def
@@ -1006,31 +1006,3 @@ LANG_SERVEND
|
|||||||
Server terminated
|
Server terminated
|
||||||
LANG_FATALERR
|
LANG_FATALERR
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
LANG_PROXYTYPE
|
|
||||||
Proxy type:
|
|
||||||
LANG_PROXYTYPETIP
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
LANG_COOKIEFILE
|
|
||||||
Load cookies from file:
|
|
||||||
LANG_COOKIEFILETIP
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
LANG_PAUSEFILES
|
|
||||||
Pause between files:
|
|
||||||
LANG_PAUSEFILESTIP
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
LANG_KEEPWWW
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
LANG_KEEPWWWTIP
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
LANG_KEEPSLASHES
|
|
||||||
Keep double slashes in URLs
|
|
||||||
LANG_KEEPSLASHESTIP
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
LANG_KEEPQUERYORDER
|
|
||||||
Keep the original query-string order
|
|
||||||
LANG_KEEPQUERYORDERTIP
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
LANG_STRIPQUERY
|
|
||||||
Strip query keys:
|
|
||||||
LANG_STRIPQUERYTIP
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ pt:7
|
|||||||
ro:25
|
ro:25
|
||||||
ru:8
|
ru:8
|
||||||
sk:20
|
sk:20
|
||||||
sl:24
|
si:24
|
||||||
sv:17
|
sv:17
|
||||||
tr:10
|
tr:10
|
||||||
uk:22
|
uk:22
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Ñúðâúðúò íå îòãîâàðÿ
|
Ñúðâúðúò íå îòãîâàðÿ
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Ôàòàëíà ãðåøêà ïðè ñúçäàâàíåòî íà òîçè îãëåäàëåí ñàéò
|
Ôàòàëíà ãðåøêà ïðè ñúçäàâàíåòî íà òîçè îãëåäàëåí ñàéò
|
||||||
Proxy type:
|
|
||||||
Òèï íà ïðîêñè:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Ïðîòîêîë íà ïðîêñè. HTTP: ñòàíäàðòíî ïðîêñè. HTTP (CONNECT òóíåë): èçïðàùà âñÿêà çàÿâêà ïðåç CONNECT òóíåë, çà ïðîêñè ïîääúðæàùè ñàìî CONNECT êàòî HTTPTunnelPort íà Tor. SOCKS5: ïîðò ïî ïîäðàçáèðàíå 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Çàðåæäàíå íà 'áèñêâèòêè' îò ôàéë:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Ïðåäâàðèòåëíî çàðåæäàíå íà 'áèñêâèòêè' îò ôàéë Netscape cookies.txt ïðåäè îáõîæäàíåòî.
|
|
||||||
Pause between files:
|
|
||||||
Ïàóçà ìåæäó ôàéëîâåòå:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Ñëó÷àéíî çàáàâÿíå ìåæäó èçòåãëÿíèÿòà íà ôàéëîâå, â ñåêóíäè. Èçïîëçâàéòå MIN:MAX çà ñëó÷àåí äèàïàçîí (íàïðèìåð 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Çàïàçâàíå íà ïðåôèêñà www. (áåç ñëèâàíå íà www.host ñ host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
www.host è host äà íå ñå òðåòèðàò êàòî åäèí è ñúù ñàéò.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Çàïàçâàíå íà äâîéíèòå íàêëîíåíè ÷åðòè â URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Áåç ïðåìàõâàíå íà ïîâòàðÿùèòå ñå íàêëîíåíè ÷åðòè â URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Çàïàçâàíå íà îðèãèíàëíèÿ ðåä íà ïàðàìåòðèòå â çàÿâêàòà
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Áåç ïðåíàðåæäàíå íà ïàðàìåòðèòå íà çàÿâêàòà ïðè ïðåìàõâàíå íà äóáëèðàíè URL.
|
|
||||||
Strip query keys:
|
|
||||||
Ïðåìàõâàíå íà êëþ÷îâå îò çàÿâêàòà:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Êëþ÷îâå îò çàÿâêàòà, ðàçäåëåíè ñúñ çàïåòàÿ, êîèòî äà ñå ïðåìàõíàò îò èìåòî íà çàïèñàíèÿ ôàéë (íàïðèìåð sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Servidor desconectado
|
Servidor desconectado
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Ha ocurrido un error fatal durante esta copia
|
Ha ocurrido un error fatal durante esta copia
|
||||||
Proxy type:
|
|
||||||
Tipo de proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protocolo del proxy. HTTP: proxy estándar. HTTP (túnel CONNECT): envía cada petición a través de un túnel CONNECT, para proxys que solo admiten CONNECT como el HTTPTunnelPort de Tor. SOCKS5: puerto predeterminado 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Cargar cookies desde un archivo:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Precargar cookies desde un archivo Netscape cookies.txt antes de comenzar la descarga.
|
|
||||||
Pause between files:
|
|
||||||
Pausa entre archivos:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Retardo aleatorio entre descargas de archivos, en segundos. Use MIN:MAX para un rango aleatorio (p. ej. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Mantener el prefijo www. (no combinar www.host con host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
No tratar www.host y host como el mismo sitio.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Mantener las barras dobles en las URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
No colapsar las barras duplicadas en las URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Mantener el orden original de la query string
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
No reordenar los parámetros de la query string al deduplicar las URL.
|
|
||||||
Strip query keys:
|
|
||||||
Eliminar claves de query string:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Claves de query string, separadas por comas, que se eliminarán del nombre de los archivos guardados (p. ej. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Typ proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protokol proxy. HTTP: standardní proxy. HTTP (tunel CONNECT): odešle každý požadavek pøes tunel CONNECT, pro proxy podporující jen CONNECT jako HTTPTunnelPort v Toru. SOCKS5: výchozí port 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Naèíst cookies ze souboru:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Naèíst cookies ze souboru Netscape cookies.txt pøed zahájením stahování.
|
|
||||||
Pause between files:
|
|
||||||
Prodleva mezi soubory:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Náhodná prodleva mezi stahováním souborù, v sekundách. Pro náhodný rozsah použijte MIN:MAX (napø. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Zachovat pøedponu www. (nesluèovat www.host s host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Nepovažovat www.host a host za stejný web.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Zachovat dvojitá lomítka v URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Nesluèovat opakovaná lomítka v URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Zachovat pùvodní poøadí øetìzce dotazu
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Nemìnit poøadí parametrù øetìzce dotazu pøi odstraòování duplicitních URL.
|
|
||||||
Strip query keys:
|
|
||||||
Odebrat klíèe dotazu:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Klíèe dotazu oddìlené èárkami, které se vynechají z pojmenování ukládaných souborù (napø. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
伺服器已終止
|
伺服器已終止
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
這鏡像發生了不可回復的錯誤
|
這鏡像發生了不可回復的錯誤
|
||||||
Proxy type:
|
|
||||||
proxy 類型:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
代理協定。HTTP:標準代理。HTTP(CONNECT 隧道):透過 CONNECT 隧道傳送每個請求,用於僅支援 CONNECT 的代理,例如 Tor 的 HTTPTunnelPort。SOCKS5:預設連接埠 1080。
|
|
||||||
Load cookies from file:
|
|
||||||
從檔案載入 cookies:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
在抓取前從 Netscape 格式的 cookies.txt 檔案預先載入 cookies。
|
|
||||||
Pause between files:
|
|
||||||
檔案之間暫停:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
檔案下載之間的隨機延遲(秒)。使用 MIN:MAX 指定隨機範圍 (例如 2:8)。
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
保留 www. 前綴 (不將 www.host 與 host 合併)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
不將 www.host 與 host 視為同一站點。
|
|
||||||
Keep double slashes in URLs
|
|
||||||
保留 URL 中的雙斜線
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
不合併 URL 中重複的斜線。
|
|
||||||
Keep the original query-string order
|
|
||||||
保留查詢字串的原始順序
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
在對 URL 去重時不重新排列查詢字串參數。
|
|
||||||
Strip query keys:
|
|
||||||
移除查詢鍵:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
以逗號分隔的查詢鍵,將其從儲存檔案的命名中移除 (例如 sid,utm_source)。
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
代理类型:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
代理协议。HTTP:标准代理。HTTP(CONNECT 隧道):通过 CONNECT 隧道发送每个请求,用于仅支持 CONNECT 的代理,例如 Tor 的 HTTPTunnelPort。SOCKS5:默认端口 1080。
|
|
||||||
Load cookies from file:
|
|
||||||
从文件加载 cookies:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
在抓取前从 Netscape 格式的 cookies.txt 文件预加载 cookies。
|
|
||||||
Pause between files:
|
|
||||||
文件间暂停:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
文件下载之间的随机延迟(秒)。使用 MIN:MAX 指定随机范围 (例如 2:8)。
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
保留 www. 前缀 (不将 www.host 与 host 合并)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
不把 www.host 和 host 视为同一站点。
|
|
||||||
Keep double slashes in URLs
|
|
||||||
保留 URL 中的双斜杠
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
不合并 URL 中重复的斜杠。
|
|
||||||
Keep the original query-string order
|
|
||||||
保留查询字符串的原始顺序
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
在对 URL 去重时不重新排列查询字符串参数。
|
|
||||||
Strip query keys:
|
|
||||||
剥离查询键:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
用逗号分隔的查询键,将其从保存文件的命名中删除 (例如 sid,utm_source)。
|
|
||||||
|
|||||||
@@ -930,31 +930,3 @@ Server terminated
|
|||||||
Poslužitelj je razriješen
|
Poslužitelj je razriješen
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Tijekom ovog zrcaljenja je nastala fatalna pogreška
|
Tijekom ovog zrcaljenja je nastala fatalna pogreška
|
||||||
Proxy type:
|
|
||||||
Vrsta posrednika:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protokol posrednika. HTTP: standardni posrednik. HTTP (CONNECT tunel): ¹alje svaki zahtjev kroz CONNECT tunel, za posrednike koji podr¾avaju samo CONNECT poput Torovog HTTPTunnelPorta. SOCKS5: zadani port 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Uèitati kolaèiæe iz datoteke:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Prije zrcaljenja uèitati kolaèiæe iz datoteke Netscape cookies.txt.
|
|
||||||
Pause between files:
|
|
||||||
Stanka izmeðu datoteka:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Nasumièna odgoda izmeðu preuzimanja datoteka, u sekundama. Za nasumièni raspon koristiti MIN:MAX (npr. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Zadr¾ati www. predmetak (ne spajati www.host s host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
www.host i host ne smatrati istim web-mjestom.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Zadr¾ati dvostruke kose crte u URL-ovima
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Ne sa¾imati ponovljene kose crte u URL-ovima.
|
|
||||||
Keep the original query-string order
|
|
||||||
Zadr¾ati izvorni redoslijed teksta za upite
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Ne mijenjati redoslijed parametara teksta za upite pri uklanjanju dvostrukih URL-ova.
|
|
||||||
Strip query keys:
|
|
||||||
Ukloniti kljuèeve upita:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Zarezom odvojeni kljuèevi upita koji se izostavljaju iz naziva spremljenih datoteka (npr. sid,utm_source).
|
|
||||||
|
|||||||
@@ -976,31 +976,3 @@ Click on this notification to restart the interrupted mirror
|
|||||||
Klik på denne notifikation for at genstarte den afbrudte spejlkopiering
|
Klik på denne notifikation for at genstarte den afbrudte spejlkopiering
|
||||||
HTTrack: could not save profile for '%s'!
|
HTTrack: could not save profile for '%s'!
|
||||||
HTTrack: kunne ikke gemme profil for '%s'!
|
HTTrack: kunne ikke gemme profil for '%s'!
|
||||||
Proxy type:
|
|
||||||
Proxytype:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxyprotokol. HTTP: standardproxy. HTTP (CONNECT-tunnel): sender hver forespørgsel gennem en CONNECT-tunnel, til proxyer der kun understøtter CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Indlæs cookies fra fil:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Indlæs cookies fra en Netscape cookies.txt-fil, før crawlingen starter.
|
|
||||||
Pause between files:
|
|
||||||
Pause mellem filer:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Tilfældig forsinkelse mellem filoverførsler, i sekunder. Brug MIN:MAX for et tilfældigt interval (f.eks. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Behold www.-præfikset (sammenlæg ikke www.host med host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Behandl ikke www.host og host som det samme websted.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Behold dobbelte skråstreger i URL'er
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Sammenfold ikke gentagne skråstreger i URL'er.
|
|
||||||
Keep the original query-string order
|
|
||||||
Behold den oprindelige rækkefølge i forespørgselsstrengen
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Omorden ikke forespørgselsstrengens parametre, når dublerede URL'er fjernes.
|
|
||||||
Strip query keys:
|
|
||||||
Fjern forespørgselsnøgler:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Kommaseparerede forespørgselsnøgler, der udelades i navngivningen af gemte filer (f.eks. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Der Server wurde beendet
|
Der Server wurde beendet
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Fataler Fehler während der Webseiten-Kopie
|
Fataler Fehler während der Webseiten-Kopie
|
||||||
Proxy type:
|
|
||||||
Proxy-Typ:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxy-Protokoll. HTTP: normaler Proxy. HTTP (CONNECT-Tunnel): sendet jede Anfrage durch einen CONNECT-Tunnel, für Proxys, die nur CONNECT unterstützen, wie Tors HTTPTunnelPort. SOCKS5: Standardport 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Cookies aus Datei laden:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Cookies aus einer Netscape-cookies.txt-Datei laden, bevor das Crawlen beginnt.
|
|
||||||
Pause between files:
|
|
||||||
Pause zwischen Dateien:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Zufällige Verzögerung zwischen Datei-Downloads, in Sekunden. MIN:MAX für einen Zufallsbereich verwenden (z. B. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
www.-Präfix beibehalten (www.host nicht mit host zusammenführen)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
www.host und host nicht als dieselbe Website behandeln.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Doppelte Schrägstriche in URLs beibehalten
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Doppelte Schrägstriche in URLs nicht zusammenführen.
|
|
||||||
Keep the original query-string order
|
|
||||||
Ursprüngliche Reihenfolge des Query-Strings beibehalten
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Query-String-Parameter beim Entfernen doppelter URLs nicht neu anordnen.
|
|
||||||
Strip query keys:
|
|
||||||
Query-Schlüssel entfernen:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Kommagetrennte Query-Schlüssel, die bei der Benennung gespeicherter Dateien entfallen (z. B. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Proxy tüüp:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Puhverserveri protokoll. HTTP: tavaline puhverserver. HTTP (CONNECT-tunnel): saadab iga päringu läbi CONNECT-tunneli, ainult CONNECT-it toetavate puhverserverite jaoks nagu Tori HTTPTunnelPort. SOCKS5: vaikeport 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Lae küpsised failist:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Lae küpsised eelnevalt Netscape cookies.txt failist enne kopeerimist.
|
|
||||||
Pause between files:
|
|
||||||
Paus failide vahel:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Juhuslik viivitus failide allalaadimiste vahel, sekundites. Juhusliku vahemiku jaoks kasuta MIN:MAX (nt 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Säilita www. eesliide (ära ühenda www.host ja host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Ära käsitle www.host ja host sama saidina.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Säilita topeltkaldkriipsud URL-ides
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Ära ühenda korduvaid kaldkriipse URL-ides.
|
|
||||||
Keep the original query-string order
|
|
||||||
Säilita päringustringi algne järjekord
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Ära järjesta päringustringi parameetreid ümber URL-ide korduste eemaldamisel.
|
|
||||||
Strip query keys:
|
|
||||||
Eemalda päringuvõtmed:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Komadega eraldatud päringuvõtmed, mis jäetakse salvestatud faili nimest välja (nt sid,utm_source).
|
|
||||||
|
|||||||
@@ -976,31 +976,3 @@ Click on this notification to restart the interrupted mirror
|
|||||||
Click on this notification to restart the interrupted mirror
|
Click on this notification to restart the interrupted mirror
|
||||||
HTTrack: could not save profile for '%s'!
|
HTTrack: could not save profile for '%s'!
|
||||||
HTTrack: could not save profile for '%s'!
|
HTTrack: could not save profile for '%s'!
|
||||||
Proxy type:
|
|
||||||
Proxy type:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Load cookies from file:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Pause between files:
|
|
||||||
Pause between files:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Keep the original query-string order
|
|
||||||
Keep the original query-string order
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Strip query keys:
|
|
||||||
Strip query keys:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
|
|||||||
@@ -930,31 +930,4 @@ Server terminated
|
|||||||
Palvelin lopetettu
|
Palvelin lopetettu
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Tällä peilillä tapahtui vakava virhe
|
Tällä peilillä tapahtui vakava virhe
|
||||||
Proxy type:
|
|
||||||
Välityspalvelimen tyyppi:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Välityspalvelimen protokolla. HTTP: tavallinen välityspalvelin. HTTP (CONNECT-tunneli): lähettää jokaisen pyynnön CONNECT-tunnelin kautta, vain CONNECT-yhteyksiä tukeville välityspalvelimille kuten Torin HTTPTunnelPort. SOCKS5: oletusportti 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Lataa evästeet tiedostosta:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Lataa evästeet Netscape cookies.txt -tiedostosta ennen sivuston läpikäyntiä.
|
|
||||||
Pause between files:
|
|
||||||
Tauko tiedostojen välillä:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Satunnainen viive tiedostolatausten välillä, sekunteina. Käytä muotoa MIN:MAX satunnaista väliä varten (esim. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Säilytä www.-etuliite (älä yhdistä www.host- ja host-osoitteita)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Älä käsittele www.host- ja host-osoitteita samana sivustona.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Säilytä kaksoiskenoviivat URL-osoitteissa
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Älä yhdistä toistuvia kenoviivoja URL-osoitteissa.
|
|
||||||
Keep the original query-string order
|
|
||||||
Säilytä kyselymerkkijonon alkuperäinen järjestys
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Älä järjestä kyselymerkkijonon parametreja uudelleen, kun URL-osoitteiden kaksoiskappaleet poistetaan.
|
|
||||||
Strip query keys:
|
|
||||||
Poista kyselyavaimet:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Pilkuin erotellut kyselyavaimet, jotka jätetään pois tallennettujen tiedostojen nimeämisestä (esim. sid,utm_source).
|
|
||||||
|
|||||||
@@ -976,31 +976,3 @@ Build a mail archive
|
|||||||
Construire une archive mail
|
Construire une archive mail
|
||||||
Default referer URL
|
Default referer URL
|
||||||
Champ referer par défaut
|
Champ referer par défaut
|
||||||
Proxy type:
|
|
||||||
Type de proxy :
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protocole du proxy. HTTP : proxy standard. HTTP (tunnel CONNECT) : envoie chaque requête via un tunnel CONNECT, pour les proxys acceptant uniquement CONNECT comme le HTTPTunnelPort de Tor. SOCKS5 : port par défaut 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Charger les cookies depuis un fichier :
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Précharger les cookies depuis un fichier Netscape cookies.txt avant la copie du site.
|
|
||||||
Pause between files:
|
|
||||||
Pause entre les fichiers :
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Délai aléatoire entre les téléchargements de fichiers, en secondes. Utilisez MIN:MAX pour une plage aléatoire (par ex. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Conserver le préfixe www. (ne pas fusionner www.host avec host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Ne pas traiter www.host et host comme le même site.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Conserver les doubles barres obliques dans les URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Ne pas réduire les barres obliques en double dans les URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Conserver l'ordre d'origine de la query string
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Ne pas réordonner les paramètres de la query string lors de la déduplication des URL.
|
|
||||||
Strip query keys:
|
|
||||||
Supprimer les clés de query string :
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Clés de query string à retirer du nommage des fichiers enregistrés, séparées par des virgules (par ex. sid,utm_source).
|
|
||||||
|
|||||||
@@ -930,31 +930,3 @@ Server terminated
|
|||||||
Ακυρώθηκε από τον εξυπηρετητή
|
Ακυρώθηκε από τον εξυπηρετητή
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Ένα καταστροφικό σφάλμα προκλήθηκε κατά την αντιγραφή αυτού του τόπου
|
Ένα καταστροφικό σφάλμα προκλήθηκε κατά την αντιγραφή αυτού του τόπου
|
||||||
Proxy type:
|
|
||||||
Τύπος proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Πρωτόκολλο διαμεσολαβητή. HTTP: τυπικός διαμεσολαβητής. HTTP (σήραγγα CONNECT): στέλνει κάθε αίτημα μέσω σήραγγας CONNECT, για διαμεσολαβητές που υποστηρίζουν μόνο CONNECT όπως το HTTPTunnelPort του Tor. SOCKS5: προεπιλεγμένη θύρα 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Φόρτωση cookies από αρχείο:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Προφόρτωση των cookies από ένα αρχείο Netscape cookies.txt πριν την ανίχνευση.
|
|
||||||
Pause between files:
|
|
||||||
Παύση μεταξύ αρχείων:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Τυχαία καθυστέρηση μεταξύ των λήψεων αρχείων, σε δευτερόλεπτα. Χρησιμοποιήστε MIN:MAX για τυχαίο εύρος (π.χ. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Διατήρηση του προθέματος www. (χωρίς συγχώνευση του www.host με το host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Να μην θεωρούνται τα www.host και host ως ο ίδιος ιστότοπος.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Διατήρηση των διπλών καθέτων στα URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Να μην συμπτύσσονται οι διπλές κάθετοι στα URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Διατήρηση της αρχικής σειράς του ερωτήματος αναζήτησης
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Να μην αναδιατάσσονται οι παράμετροι του ερωτήματος αναζήτησης κατά την αφαίρεση διπλότυπων URL.
|
|
||||||
Strip query keys:
|
|
||||||
Αφαίρεση κλειδιών ερωτήματος:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Κλειδιά ερωτήματος χωρισμένα με κόμμα, που θα αφαιρεθούν από την ονομασία των αποθηκευμένων αρχείων (π.χ. sid,utm_source).
|
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ Create error logging and report files
|
|||||||
Crea file di log per segnalare errori e informazioni
|
Crea file di log per segnalare errori e informazioni
|
||||||
Generate DOS 8-3 filenames ONLY
|
Generate DOS 8-3 filenames ONLY
|
||||||
Genera solo nomi di file in formato 8.3
|
Genera solo nomi di file in formato 8.3
|
||||||
Generate ISO9660 filenames ONLY for CDROM medias
|
Generate ISO 9660 filenames ONLY for CDROM medias
|
||||||
Genera nomi di file in formato ISO9660 per i CDROM
|
Genera nomi di file in formato ISO9660 per i CDROM
|
||||||
Do not create HTML error pages
|
Do not create HTML error pages
|
||||||
Non generare pagine d'errore HTML
|
Non generare pagine d'errore HTML
|
||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Server disconnesso
|
Server disconnesso
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Si è verificato un errore fatale durante la copia
|
Si è verificato un errore fatale durante la copia
|
||||||
Proxy type:
|
|
||||||
Tipo di proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protocollo del proxy. HTTP: proxy standard. HTTP (tunnel CONNECT): invia ogni richiesta attraverso un tunnel CONNECT, per proxy che supportano solo CONNECT come l'HTTPTunnelPort di Tor. SOCKS5: porta predefinita 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Carica i cookie da un file:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Precarica i cookie da un file Netscape cookies.txt prima della copia.
|
|
||||||
Pause between files:
|
|
||||||
Pausa tra i file:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Ritardo casuale tra i download dei file, in secondi. Usa MIN:MAX per un intervallo casuale (ad es. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Mantieni il prefisso www. (non unire www.host con host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Non trattare www.host e host come lo stesso sito.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Mantieni le doppie barre negli URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Non ridurre le barre duplicate negli URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Mantieni l'ordine originale della query string
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Non riordinare i parametri della query string durante la deduplicazione degli URL.
|
|
||||||
Strip query keys:
|
|
||||||
Rimuovi chiavi della query string:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Chiavi della query string, separate da virgole, da rimuovere dai nomi dei file salvati (ad es. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
プロキシの種類:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
プロキシのプロトコル。HTTP: 標準のプロキシ。HTTP (CONNECT トンネル): すべてのリクエストを CONNECT トンネル経由で送信します。Tor の HTTPTunnelPort のような CONNECT のみのプロキシ用です。SOCKS5: 既定ポート 1080。
|
|
||||||
Load cookies from file:
|
|
||||||
クッキーをファイルから読み込む:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
クロールを開始する前に Netscape の cookies.txt ファイルからクッキーを読み込みます。
|
|
||||||
Pause between files:
|
|
||||||
ファイル間の待機:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
ファイルのダウンロード間のランダムな遅延(秒)。範囲を指定するには MIN:MAX を使用します (例: 2:8)。
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
www. プレフィックスを保持する (www.host と host を統合しない)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
www.host と host を同じサイトとして扱いません。
|
|
||||||
Keep double slashes in URLs
|
|
||||||
URL 内の二重スラッシュを保持する
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
URL 内の連続したスラッシュをまとめません。
|
|
||||||
Keep the original query-string order
|
|
||||||
クエリ文字列の元の順序を保持する
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
URL の重複排除時にクエリ文字列のパラメータを並べ替えません。
|
|
||||||
Strip query keys:
|
|
||||||
削除するクエリキー:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
保存ファイル名の生成から除外するクエリキーをカンマ区切りで指定します (例: sid,utm_source)。
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Ñåðâåðîò å ïðåêèíàò
|
Ñåðâåðîò å ïðåêèíàò
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Íàñòàíà ôàòàëíà ãðåøêà ïðè îâî¼ mirror
|
Íàñòàíà ôàòàëíà ãðåøêà ïðè îâî¼ mirror
|
||||||
Proxy type:
|
|
||||||
ÂØß ÝÐ ßàÞÚáØ:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
¿àÞâÞÚÞÛ ÝÐ ßàÞÚáØ. HTTP: áâÐÝÔÐàÔÕÝ ßàÞÚáØ. HTTP (âãÝÕÛ CONNECT): ÓÞ ØáßàÐüÐ áÕÚÞÕ ÑÐàÐúÕ ßàÕÚã âãÝÕÛ CONNECT, ×Ð ßàÞÚáØ èâÞ ßÞÔÔàÖãÒÐÐâ áÐÜÞ CONNECT ÚÐÚÞ HTTPTunnelPort ÝÐ Tor. SOCKS5: áâÐÝÔÐàÔÝÐ ßÞàâÐ 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
²çØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
¾ÔÝÐßàÕÔ ÒçØâÐø ÚÞÛÐçØúÐ ÞÔ ÔÐâÞâÕÚÐ Netscape cookies.txt ßàÕÔ ßàÕ×ÕÜÐúÕâÞ.
|
|
||||||
Pause between files:
|
|
||||||
¿Ðã×Ð ÜÕóã ÔÐâÞâÕÚØ:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
ÁÛãçÐøÝÞ ÔÞæÝÕúÕ ÜÕóã ßàÕ×ÕÜÐúÐâÐ ÝÐ ÔÐâÞâÕÚØ, ÒÞ áÕÚãÝÔØ. ºÞàØáâØ MIN:MAX ×Ð áÛãçÐÕÝ ÞßáÕÓ (ÝÐ ßàØÜÕà 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
·ÐÔàÖØ ÓÞ ßàÕäØÚáÞâ www. (ÝÕ áßÞøãÒÐø www.host áÞ host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
½Õ âàÕâØàÐø ÓØ www.host Ø host ÚÐÚÞ Øáâ áÐøâ.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
·ÐÔàÖØ ÓØ ÔÒÞøÝØâÕ ÚÞáØ æàâØ ÒÞ URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
½Õ ÞâáâàÐÝãÒÐø ÓØ ßÞÒâÞàÕÝØâÕ ÚÞáØ æàâØ ÒÞ URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
·ÐÔàÖØ ÓÞ Ø×ÒÞàÝØÞâ àÕÔÞáÛÕÔ ÝÐ ßÐàÐÜÕâàØâÕ ÒÞ ÑÐàÐúÕâÞ
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
½Õ ÜÕÝãÒÐø ÓÞ àÕÔÞáÛÕÔÞâ ÝÐ ßÐàÐÜÕâàØâÕ ÝÐ ÑÐàÐúÕâÞ ßàØ ÞâáâàÐÝãÒÐúÕ ÔãßÛØÚÐâØ URL.
|
|
||||||
Strip query keys:
|
|
||||||
¾âáâàÐÝØ ÚÛãçÕÒØ ÞÔ ÑÐàÐúÕâÞ:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
ºÛãçÕÒØ ÞÔ ÑÐàÐúÕâÞ, ÞÔÔÕÛÕÝØ áÞ ×ÐߨàÚÐ, èâÞ áÕ ÞâáâàÐÝãÒÐÐâ ÞÔ ØÜÕâÞ ÝÐ ×ÐçãÒÐÝÐâÐ ÔÐâÞâÕÚÐ (ÝÐ ßàØÜÕà sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
A kiszolgáló befejezte a kapcsolatot
|
A kiszolgáló befejezte a kapcsolatot
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Végzetes hiba történt a tükrözés közben
|
Végzetes hiba történt a tükrözés közben
|
||||||
Proxy type:
|
|
||||||
Proxy típusa:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxy protokoll. HTTP: szabványos proxy. HTTP (CONNECT alagút): minden kérést CONNECT alagúton keresztül küld, a csak CONNECT-et támogató proxykhoz, mint a Tor HTTPTunnelPortja. SOCKS5: alapértelmezett port 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Sütik betöltése fájlból:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Sütik elõzetes betöltése egy Netscape cookies.txt fájlból a tükrözés elõtt.
|
|
||||||
Pause between files:
|
|
||||||
Szünet a fájlok között:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Véletlenszerû késleltetés a fájlletöltések között, másodpercben. Véletlen tartományhoz használja a MIN:MAX formát (pl. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
A www. elõtag megtartása (ne vonja össze a www.host és a host címet)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Ne kezelje a www.host és a host címet ugyanazon webhelyként.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Dupla perjelek megtartása az URL-ekben
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Ne vonja össze az ismétlõdõ perjeleket az URL-ekben.
|
|
||||||
Keep the original query-string order
|
|
||||||
Az eredeti lekérdezési szöveg sorrendjének megtartása
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Ne rendezze át a lekérdezési szöveg paramétereit az ismétlõdõ URL-ek kiszûrésekor.
|
|
||||||
Strip query keys:
|
|
||||||
Lekérdezési kulcsok eltávolítása:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Vesszõvel elválasztott lekérdezési kulcsok, amelyeket el kell hagyni a mentett fájl elnevezésébõl (pl. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Server beeindigd
|
Server beeindigd
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Een fatale fout is opgetreden tijdens deze spiegeling
|
Een fatale fout is opgetreden tijdens deze spiegeling
|
||||||
Proxy type:
|
|
||||||
Proxytype:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxyprotocol. HTTP: standaardproxy. HTTP (CONNECT-tunnel): stuurt elke aanvraag via een CONNECT-tunnel, voor proxy's die alleen CONNECT ondersteunen zoals Tors HTTPTunnelPort. SOCKS5: standaardpoort 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Cookies uit bestand laden:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Cookies vooraf laden uit een Netscape cookies.txt-bestand voordat het crawlen begint.
|
|
||||||
Pause between files:
|
|
||||||
Pauze tussen bestanden:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Willekeurige vertraging tussen bestandsdownloads, in seconden. Gebruik MIN:MAX voor een willekeurig bereik (bijv. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
www.-voorvoegsel behouden (www.host niet samenvoegen met host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Behandel www.host en host niet als dezelfde site.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Dubbele schuine strepen in URL's behouden
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Dubbele schuine strepen in URL's niet samenvoegen.
|
|
||||||
Keep the original query-string order
|
|
||||||
Oorspronkelijke volgorde van de query string behouden
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Query string-parameters niet herordenen bij het ontdubbelen van URL's.
|
|
||||||
Strip query keys:
|
|
||||||
Query-sleutels verwijderen:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Door komma's gescheiden query-sleutels die bij het benoemen van opgeslagen bestanden worden weggelaten (bijv. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Proxytype:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxyprotokoll. HTTP: standard proxy. HTTP (CONNECT-tunnel): sender hver forespørsel gjennom en CONNECT-tunnel, for proxyer som bare støtter CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Last inn cookies fra fil:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Last inn cookies fra en Netscape cookies.txt-fil før crawlingen starter.
|
|
||||||
Pause between files:
|
|
||||||
Pause mellom filer:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Tilfeldig forsinkelse mellom filnedlastinger, i sekunder. Bruk MIN:MAX for et tilfeldig intervall (f.eks. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Behold www.-prefikset (slå ikke sammen www.host med host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Behandle ikke www.host og host som samme nettsted.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Behold doble skråstreker i URL-er
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Slå ikke sammen gjentatte skråstreker i URL-er.
|
|
||||||
Keep the original query-string order
|
|
||||||
Behold den opprinnelige rekkefølgen i spørrestrengen
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Endre ikke rekkefølgen på spørrestrengens parametere når dupliserte URL-er fjernes.
|
|
||||||
Strip query keys:
|
|
||||||
Fjern spørrenøkler:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Kommaseparerte spørrenøkler som utelates i navngivingen av lagrede filer (f.eks. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Serwer zakonczyl prace
|
Serwer zakonczyl prace
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Podczas tworzenia lustra wydarzyl sie fatalny blad.
|
Podczas tworzenia lustra wydarzyl sie fatalny blad.
|
||||||
Proxy type:
|
|
||||||
Typ proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protokó³ proxy. HTTP: standardowe proxy. HTTP (tunel CONNECT): wysy³a ka¿de ¿±danie przez tunel CONNECT, dla proxy obs³uguj±cych tylko CONNECT, jak HTTPTunnelPort w Torze. SOCKS5: port domy¶lny 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Wczytaj ciasteczka z pliku:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Wczytaj ciasteczka z pliku Netscape cookies.txt przed rozpoczêciem pobierania.
|
|
||||||
Pause between files:
|
|
||||||
Pauza miêdzy plikami:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Losowe opó¼nienie miêdzy pobieraniem plików, w sekundach. U¿yj MIN:MAX dla losowego zakresu (np. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Zachowaj przedrostek www. (nie ³±cz www.host z host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Nie traktuj www.host i host jako tej samej witryny.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Zachowaj podwójne uko¶niki w adresach URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Nie scalaj powtórzonych uko¶ników w adresach URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Zachowaj oryginaln± kolejno¶æ ci±gu zapytania
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Nie zmieniaj kolejno¶ci parametrów zapytania podczas usuwania duplikatów adresów URL.
|
|
||||||
Strip query keys:
|
|
||||||
Usuñ klucze zapytania:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Rozdzielone przecinkami klucze zapytania pomijane przy nazywaniu zapisanych plików (np. sid,utm_source).
|
|
||||||
|
|||||||
@@ -918,7 +918,7 @@ normal\nextended\ndebug
|
|||||||
normal\nextendido\ncorrigir
|
normal\nextendido\ncorrigir
|
||||||
Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download
|
Download web site(s)\nDownload web site(s) + questions\nGet individual files\nDownload all sites in pages (multiple mirror)\nTest links in pages (bookmark test)\n* Continue interrupted download\n* Update existing download
|
||||||
Copiar site(s) da Web\nCopiar site(s) interativos da Web (perguntas)\nReceber arquivos específicos\nCopiar todas as páginas do site (alternação múltipla)\nTestar links nas páginas (testar indicador)\n* Retomar download interrompido\n* Atualizar download existente
|
Copiar site(s) da Web\nCopiar site(s) interativos da Web (perguntas)\nReceber arquivos específicos\nCopiar todas as páginas do site (alternação múltipla)\nTestar links nas páginas (testar indicador)\n* Retomar download interrompido\n* Atualizar download existente
|
||||||
Relative URI / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL
|
Relative URL / Absolute URL (default)\nAbsolute URL / Absolute URL\nAbsolute URI / Absolute URL\nOriginal URL / Original URL
|
||||||
URI Relativa / URL Absoluta (padrão)\nURL Absoluta / URL Absoluta\nURI Absoluta / URL Absoluta\nURL Original / URL Original
|
URI Relativa / URL Absoluta (padrão)\nURL Absoluta / URL Absoluta\nURI Absoluta / URL Absoluta\nURL Original / URL Original
|
||||||
Open Source offline browser
|
Open Source offline browser
|
||||||
Abrir origem offline no navegador
|
Abrir origem offline no navegador
|
||||||
@@ -976,31 +976,3 @@ Click on this notification to restart the interrupted mirror
|
|||||||
Clique nesta notificação para reiniciar o espelho interrompido
|
Clique nesta notificação para reiniciar o espelho interrompido
|
||||||
HTTrack: could not save profile for '%s'!
|
HTTrack: could not save profile for '%s'!
|
||||||
HTTrack: não foi possível salvar o perfil para '%s'!
|
HTTrack: não foi possível salvar o perfil para '%s'!
|
||||||
Proxy type:
|
|
||||||
Tipo de proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protocolo do proxy. HTTP: proxy padrão. HTTP (túnel CONNECT): envia cada requisição através de um túnel CONNECT, para proxies que só suportam CONNECT como o HTTPTunnelPort do Tor. SOCKS5: porta padrão 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Carregar cookies de um arquivo:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Pré-carregar cookies de um arquivo Netscape cookies.txt antes de iniciar a cópia.
|
|
||||||
Pause between files:
|
|
||||||
Pausa entre arquivos:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Atraso aleatório entre downloads de arquivos, em segundos. Use MIN:MAX para um intervalo aleatório (ex.: 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Manter o prefixo www. (não mesclar www.host com host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Não tratar www.host e host como o mesmo site.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Manter as barras duplas nas URLs
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Não reduzir as barras duplicadas nas URLs.
|
|
||||||
Keep the original query-string order
|
|
||||||
Manter a ordem original da query string
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Não reordenar os parâmetros da query string ao remover URLs duplicadas.
|
|
||||||
Strip query keys:
|
|
||||||
Remover chaves da query string:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Chaves da query string, separadas por vírgulas, a serem removidas da nomeação dos arquivos salvos (ex.: sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Tipo de proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protocolo do proxy. HTTP: proxy padrão. HTTP (túnel CONNECT): envia cada pedido através de um túnel CONNECT, para proxies que só suportam CONNECT como o HTTPTunnelPort do Tor. SOCKS5: porta predefinida 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Carregar cookies de um ficheiro:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Pré-carregar cookies de um ficheiro Netscape cookies.txt antes de iniciar a cópia.
|
|
||||||
Pause between files:
|
|
||||||
Pausa entre ficheiros:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Atraso aleatório entre transferências de ficheiros, em segundos. Utilize MIN:MAX para um intervalo aleatório (por ex. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Manter o prefixo www. (não combinar www.host com host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Não tratar www.host e host como o mesmo site.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Manter as barras duplas nos URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Não reduzir as barras duplicadas nos URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Manter a ordem original da query string
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Não reordenar os parâmetros da query string ao eliminar URL duplicados.
|
|
||||||
Strip query keys:
|
|
||||||
Remover chaves da query string:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Chaves da query string, separadas por vírgulas, a remover da nomeação dos ficheiros guardados (por ex. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Server terminat
|
Server terminat
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
A survenit o eroare fatală în timpul acestei clonări.
|
A survenit o eroare fatală în timpul acestei clonări.
|
||||||
Proxy type:
|
|
||||||
Tip proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protocol proxy. HTTP: proxy standard. HTTP (tunel CONNECT): trimite fiecare cerere printr-un tunel CONNECT, pentru proxy care accepta doar CONNECT precum HTTPTunnelPort al lui Tor. SOCKS5: port implicit 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Încarca cookies dintr-un fisier:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Preîncarca cookies dintr-un fisier Netscape cookies.txt înainte de copiere.
|
|
||||||
Pause between files:
|
|
||||||
Pauza între fisiere:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Întârziere aleatoare între descarcari de fisiere, în secunde. Folositi MIN:MAX pentru un interval aleatoriu (de ex. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Pastreaza prefixul www. (nu combina www.host cu host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Nu trata www.host si host ca fiind acelasi site.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Pastreaza barele duble din URL-uri
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Nu comprima barele duplicate din URL-uri.
|
|
||||||
Keep the original query-string order
|
|
||||||
Pastreaza ordinea originala din query string
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Nu reordona parametrii din query string la eliminarea URL-urilor duplicate.
|
|
||||||
Strip query keys:
|
|
||||||
Elimina cheile din query string:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Chei din query string, separate prin virgula, de eliminat din denumirea fisierelor salvate (de ex. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Server terminated
|
Server terminated
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Âî âðåìÿ òåêóùåé çàêà÷êè ïðîèçîøëà ôàòàëüíàÿ îøèáêà
|
Âî âðåìÿ òåêóùåé çàêà÷êè ïðîèçîøëà ôàòàëüíàÿ îøèáêà
|
||||||
Proxy type:
|
|
||||||
Òèï ïðîêñè:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Ïðîòîêîë ïðîêñè. HTTP: îáû÷íûé ïðîêñè. HTTP (òóííåëü CONNECT): îòïðàâëÿåò êàæäûé çàïðîñ ÷åðåç òóííåëü CONNECT, äëÿ ïðîêñè, ïîääåðæèâàþùèõ òîëüêî CONNECT, íàïðèìåð HTTPTunnelPort â Tor. SOCKS5: ïîðò ïî óìîë÷àíèþ 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Çàãðóçèòü cookies èç ôàéëà:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Ïðåäâàðèòåëüíî çàãðóçèòü cookies èç ôàéëà Netscape cookies.txt ïåðåä çàêà÷êîé.
|
|
||||||
Pause between files:
|
|
||||||
Ïàóçà ìåæäó ôàéëàìè:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Ñëó÷àéíàÿ çàäåðæêà ìåæäó çàêà÷êàìè ôàéëîâ, â ñåêóíäàõ. Èñïîëüçóéòå MIN:MAX äëÿ ñëó÷àéíîãî äèàïàçîíà (íàïðèìåð, 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Ñîõðàíÿòü ïðåôèêñ www. (íå îáúåäèíÿòü www.host ñ host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Íå ñ÷èòàòü www.host è host îäíèì è òåì æå ñàéòîì.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Ñîõðàíÿòü äâîéíûå ñëýøè â URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Íå óäàëÿòü ïîâòîðÿþùèåñÿ ñëýøè â URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Ñîõðàíÿòü èñõîäíûé ïîðÿäîê ïàðàìåòðîâ çàïðîñà
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Íå ìåíÿòü ïîðÿäîê ïàðàìåòðîâ ñòðîêè çàïðîñà ïðè óäàëåíèè äóáëèêàòîâ URL.
|
|
||||||
Strip query keys:
|
|
||||||
Óäàëÿòü êëþ÷è çàïðîñà:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Êëþ÷è çàïðîñà ÷åðåç çàïÿòóþ, óäàëÿåìûå èç èìåíè ñîõðàíÿåìîãî ôàéëà (íàïðèìåð, sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Typ proxy:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protokol proxy. HTTP: ¹tandardné proxy. HTTP (tunel CONNECT): odo¹le ka¾dú po¾iadavku cez tunel CONNECT, pre proxy podporujúce len CONNECT ako HTTPTunnelPort v Tore. SOCKS5: predvolený port 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Naèíta» cookies zo súboru:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Naèíta» cookies zo súboru Netscape cookies.txt pred zaèatím s»ahovania.
|
|
||||||
Pause between files:
|
|
||||||
Prestávka medzi súbormi:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Náhodné oneskorenie medzi s»ahovaním súborov, v sekundách. Pre náhodný rozsah pou¾ite MIN:MAX (napr. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Zachova» predponu www. (nezluèova» www.host s host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Nepova¾ova» www.host a host za tú istú lokalitu.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Zachova» dvojité lomky v URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Nezluèova» opakované lomky v URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Zachova» pôvodné poradie re»azca dotazu
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Nemeni» poradie parametrov re»azca dotazu pri odstraòovaní duplicitných URL.
|
|
||||||
Strip query keys:
|
|
||||||
Odstráni» kµúèe dotazu:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Kµúèe dotazu oddelené èiarkami, ktoré sa vynechajú z pomenovania ukladaných súborov (napr. sid,utm_source).
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Slovenian
|
|||||||
LANGUAGE_FILE
|
LANGUAGE_FILE
|
||||||
Slovenian
|
Slovenian
|
||||||
LANGUAGE_ISO
|
LANGUAGE_ISO
|
||||||
sl
|
si
|
||||||
LANGUAGE_AUTHOR
|
LANGUAGE_AUTHOR
|
||||||
Jadran Rudec,iur.\r\njrudec@email.si \r\n
|
Jadran Rudec,iur.\r\njrudec@email.si \r\n
|
||||||
LANGUAGE_CHARSET
|
LANGUAGE_CHARSET
|
||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Vrsta proxyja:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Protokol proxy. HTTP: standardni proxy. HTTP (tunel CONNECT): poslje vsako zahtevo skozi tunel CONNECT, za posrednike, ki podpirajo samo CONNECT, kot je HTTPTunnelPort v Toru. SOCKS5: privzeta vrata 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Nalozi piskotke iz datoteke:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Predhodno nalozi piskotke iz datoteke Netscape cookies.txt pred zajemanjem.
|
|
||||||
Pause between files:
|
|
||||||
Premor med datotekami:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Nakljucni zamik med prenosi datotek, v sekundah. Za nakljucni obseg uporabite MIN:MAX (npr. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Ohrani predpono www. (ne zdruzi www.host z host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
www.host in host ne obravnavaj kot isto spletno mesto.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Ohrani dvojne posevnice v URL-jih
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Ne zdruzuj podvojenih posevnic v URL-jih.
|
|
||||||
Keep the original query-string order
|
|
||||||
Ohrani izvirni vrstni red poizvedovalnega niza
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Pri odstranjevanju podvojenih URL-jev ne spreminjaj vrstnega reda parametrov poizvedbe.
|
|
||||||
Strip query keys:
|
|
||||||
Odstrani kljuce poizvedbe:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Z vejicami loceni kljuci poizvedbe, ki se izpustijo pri poimenovanju shranjenih datotek (npr. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Proxytyp:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxyprotokoll. HTTP: standardproxy. HTTP (CONNECT-tunnel): skickar varje begäran genom en CONNECT-tunnel, för proxyservrar som bara stöder CONNECT som Tors HTTPTunnelPort. SOCKS5: standardport 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Läs in cookies från fil:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Läs in cookies från en Netscape cookies.txt-fil innan crawlningen börjar.
|
|
||||||
Pause between files:
|
|
||||||
Paus mellan filer:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Slumpmässig fördröjning mellan filnedladdningar, i sekunder. Använd MIN:MAX för ett slumpmässigt intervall (t.ex. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Behåll www.-prefixet (slå inte ihop www.host med host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Behandla inte www.host och host som samma webbplats.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Behåll dubbla snedstreck i URL:er
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Slå inte ihop upprepade snedstreck i URL:er.
|
|
||||||
Keep the original query-string order
|
|
||||||
Behåll frågesträngens ursprungliga ordning
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Ändra inte ordningen på frågesträngens parametrar när dubbletter av URL:er tas bort.
|
|
||||||
Strip query keys:
|
|
||||||
Ta bort frågenycklar:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Kommaseparerade frågenycklar som utelämnas vid namngivningen av sparade filer (t.ex. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Sunucu sonlandýrdý
|
Sunucu sonlandýrdý
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Bu yansýlama iþlemi sýrasýnda ölümcül bir hata oluþtu
|
Bu yansýlama iþlemi sýrasýnda ölümcül bir hata oluþtu
|
||||||
Proxy type:
|
|
||||||
Proxy türü:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proxy protokolü. HTTP: standart proxy. HTTP (CONNECT tüneli): her isteði bir CONNECT tüneli üzerinden gönderir; Tor'un HTTPTunnelPort gibi yalnýzca CONNECT destekleyen proxy'ler için. SOCKS5: varsayýlan baðlantý noktasý 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Çerezleri dosyadan yükle:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Taramadan önce bir Netscape cookies.txt dosyasýndan çerezleri önceden yükle.
|
|
||||||
Pause between files:
|
|
||||||
Dosyalar arasýnda bekleme:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Dosya indirmeleri arasýnda saniye cinsinden rastgele gecikme. Rastgele bir aralýk için MIN:MAX kullanýn (örn. 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
www. önekini koru (www.host ile host'u birleþtirme)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
www.host ve host'u ayný site olarak deðerlendirme.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
URL'lerdeki çift eðik çizgileri koru
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
URL'lerdeki yinelenen eðik çizgileri birleþtirme.
|
|
||||||
Keep the original query-string order
|
|
||||||
Özgün sorgu dizesi sýrasýný koru
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
URL'lerin yinelenenlerini ayýklarken sorgu dizesi parametrelerini yeniden sýralama.
|
|
||||||
Strip query keys:
|
|
||||||
Sorgu anahtarlarýný çýkar:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Kaydedilen dosya adlandýrmasýndan çýkarýlacak, virgülle ayrýlmýþ sorgu anahtarlarý (örn. sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
|
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
|
|
||||||
Proxy type:
|
|
||||||
Òèï ïðîêñ³:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Ïðîòîêîë ïðîêñ³. HTTP: ñòàíäàðòíèé ïðîêñ³. HTTP (òóíåëü CONNECT): íàäñèëຠêîæåí çàïèò ÷åðåç òóíåëü CONNECT, äëÿ ïðîêñ³, ùî ï³äòðèìóþòü ëèøå CONNECT, ÿê-îò HTTPTunnelPort ó Tor. SOCKS5: ïîðò çà çàìîâ÷óâàííÿì 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Çàâàíòàæèòè cookies ç ôàéëó:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Ïîïåðåäíüî çàâàíòàæèòè cookies ç ôàéëó Netscape cookies.txt ïåðåä çàâàíòàæåííÿì.
|
|
||||||
Pause between files:
|
|
||||||
Ïàóçà ì³æ ôàéëàìè:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Âèïàäêîâà çàòðèìêà ì³æ çàâàíòàæåííÿìè ôàéë³â, ó ñåêóíäàõ. Âèêîðèñòîâóéòå MIN:MAX äëÿ âèïàäêîâîãî ä³àïàçîíó (íàïðèêëàä, 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
Çáåð³ãàòè ïðåô³êñ www. (íå îá'ºäíóâàòè www.host ç host)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
Íå ââàæàòè www.host ³ host îäíèì ³ òèì ñàìèì ñàéòîì.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
Çáåð³ãàòè ïîäâ³éí³ ñëåø³ â URL
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
Íå âèäàëÿòè ïîâòîðþâàí³ ñëåø³ â URL.
|
|
||||||
Keep the original query-string order
|
|
||||||
Çáåð³ãàòè ïî÷àòêîâèé ïîðÿäîê ïàðàìåòð³â çàïèòó
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
Íå çì³íþâàòè ïîðÿäîê ïàðàìåòð³â ðÿäêà çàïèòó ï³ä ÷àñ óñóíåííÿ äóáë³êàò³â URL.
|
|
||||||
Strip query keys:
|
|
||||||
Âèëó÷àòè êëþ÷³ çàïèòó:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Êëþ÷³ çàïèòó ÷åðåç êîìó, ÿê³ âèëó÷àþòüñÿ ç ³ìåí³ çáåðåæåíîãî ôàéëó (íàïðèêëàä, sid,utm_source).
|
|
||||||
|
|||||||
@@ -928,31 +928,3 @@ Server terminated
|
|||||||
Server terminated
|
Server terminated
|
||||||
A fatal error has occurred during this mirror
|
A fatal error has occurred during this mirror
|
||||||
Joriy ko’chirish vaqtida jiddiy xatolik yuz berdi
|
Joriy ko’chirish vaqtida jiddiy xatolik yuz berdi
|
||||||
Proxy type:
|
|
||||||
Proksi turi:
|
|
||||||
Proxy protocol. HTTP: standard proxy. HTTP (CONNECT tunnel): sends every request through a CONNECT tunnel, for CONNECT-only proxies like Tor's HTTPTunnelPort. SOCKS5: default port 1080.
|
|
||||||
Proksi protokoli. HTTP: oddiy proksi. HTTP (CONNECT tuneli): har bir so'rovni CONNECT tuneli orqali yuboradi; faqat CONNECT'ni qo'llab-quvvatlaydigan proksilar uchun, masalan Tor HTTPTunnelPort. SOCKS5: standart port 1080.
|
|
||||||
Load cookies from file:
|
|
||||||
Fayldan cookies yuklamoq:
|
|
||||||
Preload cookies from a Netscape cookies.txt file before crawling.
|
|
||||||
Ko’chirib olishdan oldin Netscape cookies.txt faylidan cookies’ni oldindan yuklamoq.
|
|
||||||
Pause between files:
|
|
||||||
Fayllar orasidagi pauza:
|
|
||||||
Random delay between file downloads, in seconds. Use MIN:MAX for a random range (e.g. 2:8).
|
|
||||||
Fayllarni ko’chirib olish orasidagi tasodifiy kechikish, soniyalarda. Tasodifiy diapazon uchun MIN:MAX dan foydalaning (masalan, 2:8).
|
|
||||||
Keep the www. prefix (do not merge www.host with host)
|
|
||||||
www. prefiksini saqlash (www.host ni host bilan birlashtirmaslik)
|
|
||||||
Do not treat www.host and host as the same site.
|
|
||||||
www.host va host ni bir xil sayt deb hisoblamaslik.
|
|
||||||
Keep double slashes in URLs
|
|
||||||
URL lardagi qo’sh sleshlarni saqlash
|
|
||||||
Do not collapse duplicate slashes in URLs.
|
|
||||||
URL lardagi takroriy sleshlarni olib tashlamaslik.
|
|
||||||
Keep the original query-string order
|
|
||||||
So’rov satrining asl tartibini saqlash
|
|
||||||
Do not reorder query-string parameters when deduplicating URLs.
|
|
||||||
URL dublikatlarini olib tashlashda so’rov satri parametrlari tartibini o’zgartirmaslik.
|
|
||||||
Strip query keys:
|
|
||||||
Olib tashlanadigan so’rov kalitlari:
|
|
||||||
Comma-separated query keys to drop from the saved-file naming (e.g. sid,utm_source).
|
|
||||||
Saqlangan fayl nomidan olib tashlanadigan, vergul bilan ajratilgan so’rov kalitlari (masalan, sid,utm_source).
|
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
dnl @synopsis CHECK_BROTLI()
|
|
||||||
dnl @synopsis CHECK_ZSTD()
|
|
||||||
dnl
|
|
||||||
dnl Look for libbrotlidec and libzstd, the decoders for the "br" and "zstd"
|
|
||||||
dnl HTTP content codings. Both are optional: a missing library only drops the
|
|
||||||
dnl coding from Accept-Encoding. --with-brotli=DIR / --with-zstd=DIR point at a
|
|
||||||
dnl prefix; --without-brotli / --without-zstd disable the coding; the default
|
|
||||||
dnl is to use the library when it is found.
|
|
||||||
dnl
|
|
||||||
dnl Define HTS_USEBROTLI / HTS_USEZSTD to 1 or 0, and substitute BROTLI_LIBS /
|
|
||||||
dnl ZSTD_LIBS.
|
|
||||||
|
|
||||||
dnl CHECK_CODEC(name, NAME, header, library, symbol, companion-libs)
|
|
||||||
AC_DEFUN([CHECK_CODEC], [
|
|
||||||
AC_ARG_WITH([$1],
|
|
||||||
[AS_HELP_STRING([--with-$1@<:@=DIR@:>@],[Enable the $1 content coding @<:@default=auto@:>@])],
|
|
||||||
[codec_want=$withval], [codec_want=auto])
|
|
||||||
$2_LIBS=""
|
|
||||||
codec_have=no
|
|
||||||
if test "$codec_want" != "no"; then
|
|
||||||
codec_old_cppflags="$CPPFLAGS"
|
|
||||||
codec_old_ldflags="$LDFLAGS"
|
|
||||||
codec_dir=no
|
|
||||||
if test "$codec_want" != "yes" -a "$codec_want" != "auto"; then
|
|
||||||
codec_dir=yes
|
|
||||||
# An explicit prefix is authoritative: if the header is not under
|
|
||||||
# it, error rather than silently pick a system copy.
|
|
||||||
if test ! -f "$codec_want/include/$3"; then
|
|
||||||
AC_MSG_ERROR([$1 requested at $codec_want but $codec_want/include/$3 is missing])
|
|
||||||
fi
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$codec_want/include"
|
|
||||||
LDFLAGS="$LDFLAGS -L$codec_want/lib"
|
|
||||||
fi
|
|
||||||
AC_CHECK_HEADER([$3], [codec_h=yes], [codec_h=no])
|
|
||||||
AC_CHECK_LIB([$4], [$5], [codec_lib=yes], [codec_lib=no], [$6])
|
|
||||||
CPPFLAGS="$codec_old_cppflags"
|
|
||||||
LDFLAGS="$codec_old_ldflags"
|
|
||||||
if test "$codec_h" = "yes" -a "$codec_lib" = "yes"; then
|
|
||||||
codec_have=yes
|
|
||||||
$2_LIBS="-l$4 $6"
|
|
||||||
if test "$codec_dir" = "yes"; then
|
|
||||||
$2_LIBS="-L$codec_want/lib -l$4 $6"
|
|
||||||
# The rest of configure still needs the header path.
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$codec_want/include"
|
|
||||||
fi
|
|
||||||
elif test "$codec_want" != "auto"; then
|
|
||||||
AC_MSG_ERROR([$1 requested but lib$4/$3 not found])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_MSG_CHECKING([whether to enable the $1 content coding])
|
|
||||||
AC_MSG_RESULT([$codec_have])
|
|
||||||
if test "$codec_have" = "yes"; then
|
|
||||||
AC_DEFINE([HTS_USE$2], [1], [Define to 1 to decode the $1 content coding])
|
|
||||||
else
|
|
||||||
AC_DEFINE([HTS_USE$2], [0], [Define to 1 to decode the $1 content coding])
|
|
||||||
fi
|
|
||||||
AC_SUBST([$2_LIBS])
|
|
||||||
AC_SUBST([$2_ENABLED], [$codec_have])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl brotlidec needs brotlicommon (the static dictionary) for a fully-static link.
|
|
||||||
AC_DEFUN([CHECK_BROTLI],
|
|
||||||
[CHECK_CODEC([brotli], [BROTLI], [brotli/decode.h], [brotlidec], [BrotliDecoderDecompressStream], [-lbrotlicommon])])
|
|
||||||
|
|
||||||
AC_DEFUN([CHECK_ZSTD],
|
|
||||||
[CHECK_CODEC([zstd], [ZSTD], [zstd.h], [zstd], [ZSTD_decompressStream], [])])
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" This file is generated by man/makeman.sh; do not edit by hand.
|
.\" This file is generated by man/makeman.sh; do not edit by hand.
|
||||||
.\" SPDX-License-Identifier: GPL-3.0-or-later
|
.\" SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
.TH httrack 1 "16 July 2026" "httrack website copier"
|
.TH httrack 1 "07 July 2026" "httrack website copier"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
httrack \- offline browser : copy websites to a local directory
|
httrack \- offline browser : copy websites to a local directory
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -135,7 +135,7 @@ continue an interrupted mirror using the cache (\-\-continue)
|
|||||||
mirror ALL links located in the first level pages (mirror links) (\-\-mirrorlinks)
|
mirror ALL links located in the first level pages (mirror links) (\-\-mirrorlinks)
|
||||||
.SS Proxy options:
|
.SS Proxy options:
|
||||||
.IP \-P
|
.IP \-P
|
||||||
proxy use (\-P [socks5://|connect://][user:pass@]proxy:port) (\-\-proxy <param>)
|
proxy use (\-P proxy:port or \-P user:pass@proxy:port) (\-\-proxy <param>)
|
||||||
.IP \-%f
|
.IP \-%f
|
||||||
*use proxy for ftp (f0 don't use) (\-\-httpproxy\-ftp[=N])
|
*use proxy for ftp (f0 don't use) (\-\-httpproxy\-ftp[=N])
|
||||||
.IP \-%b
|
.IP \-%b
|
||||||
@@ -165,7 +165,7 @@ pause transfer if N bytes reached, and wait until lock file is deleted (\-\-max\
|
|||||||
.IP \-cN
|
.IP \-cN
|
||||||
number of multiple connections (*c8) (\-\-sockets[=N])
|
number of multiple connections (*c8) (\-\-sockets[=N])
|
||||||
.IP \-TN
|
.IP \-TN
|
||||||
timeout, number of seconds after a non\-responding link is shutdown; also bounds host name resolution (\-\-timeout[=N])
|
timeout, number of seconds after a non\-responding link is shutdown (\-\-timeout[=N])
|
||||||
.IP \-RN
|
.IP \-RN
|
||||||
number of retries, in case of timeout or non\-fatal errors (*R1) (\-\-retries[=N])
|
number of retries, in case of timeout or non\-fatal errors (*R1) (\-\-retries[=N])
|
||||||
.IP \-JN
|
.IP \-JN
|
||||||
@@ -224,7 +224,7 @@ explain which filter rule accepts or rejects a URL, then exit (\-\-why <param>)
|
|||||||
.IP \-u
|
.IP \-u
|
||||||
check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (\-\-check\-type[=N])
|
check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (\-\-check\-type[=N])
|
||||||
.IP \-j
|
.IP \-j
|
||||||
*parse scripts (j0 don't parse, bitmask: |1 parse default, |4 don't parse .js |8 don't be aggressive) (\-\-parse\-java[=N])
|
*parse Java Classes (j0 don't parse, bitmask: |1 parse default, |2 don't parse .class |4 don't parse .js |8 don't be aggressive) (\-\-parse\-java[=N])
|
||||||
.IP \-sN
|
.IP \-sN
|
||||||
follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules)) (\-\-robots[=N])
|
follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules)) (\-\-robots[=N])
|
||||||
.IP \-%h
|
.IP \-%h
|
||||||
@@ -248,7 +248,7 @@ can also be used to force a specific file type: \-\-assume foo.cgi=text/html
|
|||||||
.IP \-@iN
|
.IP \-@iN
|
||||||
internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only) (\-\-protocol[=N])
|
internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only) (\-\-protocol[=N])
|
||||||
.IP \-%w
|
.IP \-%w
|
||||||
disable a specific external mime module (\-%w httrack\-plugin) (\-\-disable\-module <param>)
|
disable a specific external mime module (\-%w htsswf \-%w htsjava) (\-\-disable\-module <param>)
|
||||||
.SS Browser ID:
|
.SS Browser ID:
|
||||||
.IP \-F
|
.IP \-F
|
||||||
user\-agent field sent in HTTP headers (\-F "user\-agent name") (\-\-user\-agent <param>)
|
user\-agent field sent in HTTP headers (\-F "user\-agent name") (\-\-user\-agent <param>)
|
||||||
@@ -514,6 +514,8 @@ that would have solved them.
|
|||||||
.SM
|
.SM
|
||||||
\- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
\- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
||||||
.SM
|
.SM
|
||||||
|
\- Some java classes may not find some files on them (class included)
|
||||||
|
.SM
|
||||||
\- Cgi\-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like \-*cgi\-bin*
|
\- Cgi\-bin links may not work properly in some cases (parameters needed). To avoid them: use filters like \-*cgi\-bin*
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Please reports bugs to
|
Please reports bugs to
|
||||||
|
|||||||
@@ -44,13 +44,11 @@ httrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
|||||||
proxytrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
proxytrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
||||||
htsserver_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
htsserver_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
||||||
|
|
||||||
lib_LTLIBRARIES = libhttrack.la
|
lib_LTLIBRARIES = libhttrack.la libhtsjava.la
|
||||||
|
|
||||||
htsserver_SOURCES = htsserver.c htsserver.h htsweb.c htsweb.h \
|
htsserver_SOURCES = htsserver.c htsserver.h htsweb.c htsweb.h
|
||||||
htsurlport.c htsurlport.h
|
|
||||||
proxytrack_SOURCES = proxy/main.c \
|
proxytrack_SOURCES = proxy/main.c \
|
||||||
proxy/proxytrack.c proxy/store.c \
|
proxy/proxytrack.c proxy/store.c \
|
||||||
htsurlport.c htsurlport.h \
|
|
||||||
coucal/coucal.c htsmd5.c md5.c \
|
coucal/coucal.c htsmd5.c md5.c \
|
||||||
minizip/ioapi.c minizip/mztools.c minizip/unzip.c minizip/zip.c
|
minizip/ioapi.c minizip/mztools.c minizip/unzip.c minizip/zip.c
|
||||||
|
|
||||||
@@ -60,10 +58,10 @@ whttrackrun_SCRIPTS = webhttrack
|
|||||||
libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
||||||
htscache_selftest.c htsdns_selftest.c htsselftest.c \
|
htscache_selftest.c htsdns_selftest.c htsselftest.c \
|
||||||
htscatchurl.c htsfilters.c htsftp.c htshash.c coucal/coucal.c \
|
htscatchurl.c htsfilters.c htsftp.c htshash.c coucal/coucal.c \
|
||||||
htshelp.c htslib.c htsurlport.c htscoremain.c \
|
htshelp.c htslib.c htscoremain.c \
|
||||||
htsname.c htsrobots.c htstools.c htswizard.c \
|
htsname.c htsrobots.c htstools.c htswizard.c \
|
||||||
htsalias.c htsthread.c htsindex.c htsbauth.c \
|
htsalias.c htsthread.c htsindex.c htsbauth.c \
|
||||||
htsmd5.c htscodec.c htsproxy.c htszlib.c htswrap.c htsconcat.c \
|
htsmd5.c htszlib.c htswrap.c htsconcat.c \
|
||||||
htsmodules.c htscharset.c punycode.c htsencoding.c htssniff.c \
|
htsmodules.c htscharset.c punycode.c htsencoding.c htssniff.c \
|
||||||
md5.c \
|
md5.c \
|
||||||
minizip/ioapi.c minizip/mztools.c minizip/unzip.c minizip/zip.c \
|
minizip/ioapi.c minizip/mztools.c minizip/unzip.c minizip/zip.c \
|
||||||
@@ -71,23 +69,28 @@ libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
|||||||
htsbasenet.h htsbauth.h htscache.h htscache_selftest.h htsdns_selftest.h htsselftest.h htscatchurl.h \
|
htsbasenet.h htsbauth.h htscache.h htscache_selftest.h htsdns_selftest.h htsselftest.h htscatchurl.h \
|
||||||
htsconfig.h htscore.h htsparse.h htscoremain.h htsdefines.h \
|
htsconfig.h htscore.h htsparse.h htscoremain.h htsdefines.h \
|
||||||
htsfilters.h htsftp.h htsglobal.h htshash.h coucal/coucal.h \
|
htsfilters.h htsftp.h htsglobal.h htshash.h coucal/coucal.h \
|
||||||
htshelp.h htsindex.h htslib.h htsurlport.h htsmd5.h \
|
htshelp.h htsindex.h htslib.h htsmd5.h \
|
||||||
htsmodules.h htsname.h htsnet.h htssniff.h \
|
htsmodules.h htsname.h htsnet.h htssniff.h \
|
||||||
htsopt.h htsrobots.h htsthread.h \
|
htsopt.h htsrobots.h htsthread.h \
|
||||||
htstools.h htswizard.h htswrap.h htscodec.h htsproxy.h htszlib.h \
|
htstools.h htswizard.h htswrap.h htszlib.h \
|
||||||
htsstrings.h htsarrays.h httrack-library.h \
|
htsstrings.h htsarrays.h httrack-library.h \
|
||||||
htscharset.h punycode.h htsencoding.h \
|
htscharset.h punycode.h htsencoding.h \
|
||||||
htsentities.h htsentities.sh htsbasiccharsets.sh htscodepages.h \
|
htsentities.h htsentities.sh htsbasiccharsets.sh htscodepages.h \
|
||||||
md5.h coucal/murmurhash3.h \
|
md5.h coucal/murmurhash3.h \
|
||||||
minizip/crypt.h minizip/ioapi.h minizip/mztools.h minizip/unzip.h minizip/zip.h
|
minizip/crypt.h minizip/ioapi.h minizip/mztools.h minizip/unzip.h minizip/zip.h
|
||||||
libhttrack_la_LIBADD = $(THREADS_LIBS) $(ZLIB_LIBS) $(BROTLI_LIBS) $(ZSTD_LIBS) $(OPENSSL_LIBS) $(DL_LIBS) $(SOCKET_LIBS) $(ICONV_LIBS)
|
libhttrack_la_LIBADD = $(THREADS_LIBS) $(ZLIB_LIBS) $(OPENSSL_LIBS) $(DL_LIBS) $(SOCKET_LIBS) $(ICONV_LIBS)
|
||||||
libhttrack_la_CFLAGS = $(AM_CFLAGS) -DLIBHTTRACK_EXPORTS -DZLIB_CONST
|
libhttrack_la_CFLAGS = $(AM_CFLAGS) -DLIBHTTRACK_EXPORTS -DZLIB_CONST
|
||||||
libhttrack_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(VERSION_INFO)
|
libhttrack_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(VERSION_INFO)
|
||||||
|
|
||||||
|
libhtsjava_la_SOURCES = htsjava.c htsjava.h
|
||||||
|
libhtsjava_la_LIBADD = $(THREADS_LIBS) $(DL_LIBS) libhttrack.la
|
||||||
|
# This thin JNI wrapper reaches libc only through libhttrack, so the direct
|
||||||
|
# libc edge is dropped from DT_NEEDED (library-not-linked-against-libc). Force
|
||||||
|
# libc back as a dependency; configure gates the flag since only a GNU-style
|
||||||
|
# linker accepts it (LIBC_FORCE_LINK is empty on e.g. macOS).
|
||||||
|
libhtsjava_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(VERSION_INFO) $(LIBC_FORCE_LINK)
|
||||||
|
|
||||||
EXTRA_DIST = httrack.h webhttrack \
|
EXTRA_DIST = httrack.h webhttrack \
|
||||||
version.rc \
|
|
||||||
libhttrack.rc \
|
|
||||||
httrack.rc \
|
|
||||||
coucal/murmurhash3.h.diff \
|
coucal/murmurhash3.h.diff \
|
||||||
coucal/murmurhash3.h.orig \
|
coucal/murmurhash3.h.orig \
|
||||||
minizip/iowin32.c \
|
minizip/iowin32.c \
|
||||||
@@ -110,13 +113,13 @@ EXTRA_DIST = httrack.h webhttrack \
|
|||||||
proxy/proxystrings.h \
|
proxy/proxystrings.h \
|
||||||
proxy/proxytrack.h \
|
proxy/proxytrack.h \
|
||||||
proxy/store.h \
|
proxy/store.h \
|
||||||
|
proxy/proxytrack.vcproj \
|
||||||
coucal/LICENSE \
|
coucal/LICENSE \
|
||||||
coucal/Makefile \
|
coucal/Makefile \
|
||||||
coucal/README.md \
|
coucal/README.md \
|
||||||
coucal/sample.c \
|
coucal/sample.c \
|
||||||
coucal/tests.c \
|
coucal/tests.c \
|
||||||
vcpkg.json \
|
htsjava.vcproj \
|
||||||
httrack.vcxproj \
|
httrack.dsp httrack.dsw httrack.vcproj \
|
||||||
libhttrack.vcxproj \
|
libhttrack.dsp libhttrack.dsw libhttrack.vcproj \
|
||||||
proxytrack.vcxproj \
|
webhttrack.dsp webhttrack.dsw webhttrack.vcproj
|
||||||
webhttrack.vcxproj
|
|
||||||
|
|||||||
Submodule src/coucal updated: ab59c6a7a0...fadf29bd2a
@@ -567,29 +567,24 @@ int optinclude_file(const char *name, int *argc, char **argv, char *x_argvblk,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get home directory, '.' if unset or empty */
|
/* Get home directory, '.' if failed */
|
||||||
/* example: /home/smith */
|
/* example: /home/smith */
|
||||||
const char *hts_gethome(void) {
|
const char *hts_gethome(void) {
|
||||||
const char *home = getenv("HOME");
|
const char *home = getenv("HOME");
|
||||||
|
|
||||||
/* An empty $HOME would expand ~/foo into the absolute /foo */
|
if (home)
|
||||||
return strnotempty(home) ? home : ".";
|
return home;
|
||||||
|
else
|
||||||
|
return ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert ~/foo into /home/smith/foo (~user/ left alone: no getpwnam here) */
|
/* Convert ~/foo into /home/smith/foo */
|
||||||
void expand_home(String * str) {
|
void expand_home(String * str) {
|
||||||
if (StringNotEmpty(*str) && StringSub(*str, 0) == '~' &&
|
if (StringSub(*str, 1) == '~') {
|
||||||
(StringLength(*str) == 1 || StringSub(*str, 1) == '/')) {
|
|
||||||
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
||||||
const char *const home = hts_gethome();
|
|
||||||
const size_t homelen = strlen(home);
|
|
||||||
const size_t taillen = StringLength(*str) - 1;
|
|
||||||
|
|
||||||
/* Leave untouched rather than abort() in strcatbuff on a huge $HOME */
|
strcpybuff(tempo, hts_gethome());
|
||||||
if (taillen < sizeof(tempo) && homelen < sizeof(tempo) - taillen) {
|
strcatbuff(tempo, StringBuff(*str) + 1);
|
||||||
strcpybuff(tempo, home);
|
StringCopy(*str, tempo);
|
||||||
strcatbuff(tempo, StringBuff(*str) + 1);
|
|
||||||
StringCopy(*str, tempo);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
503
src/htsback.c
503
src/htsback.c
@@ -44,8 +44,6 @@ Please visit our Website: http://www.httrack.com
|
|||||||
#include "htsback.h"
|
#include "htsback.h"
|
||||||
|
|
||||||
#include "htsftp.h"
|
#include "htsftp.h"
|
||||||
#include "htscodec.h"
|
|
||||||
#include "htsproxy.h"
|
|
||||||
#if HTS_USEZLIB
|
#if HTS_USEZLIB
|
||||||
#include "htszlib.h"
|
#include "htszlib.h"
|
||||||
#else
|
#else
|
||||||
@@ -70,15 +68,6 @@ static int slot_can_be_cached_on_disk(const lien_back * back);
|
|||||||
static int slot_can_be_cleaned(const lien_back * back);
|
static int slot_can_be_cleaned(const lien_back * back);
|
||||||
static int slot_can_be_finalized(httrackp * opt, const lien_back * back);
|
static int slot_can_be_finalized(httrackp * opt, const lien_back * back);
|
||||||
|
|
||||||
/* Which hard quota, if any, is currently aborting the mirror. */
|
|
||||||
typedef enum {
|
|
||||||
HTS_MIRROR_LIMIT_NONE = 0,
|
|
||||||
HTS_MIRROR_LIMIT_SIZE,
|
|
||||||
HTS_MIRROR_LIMIT_TIME,
|
|
||||||
} hts_mirror_limit;
|
|
||||||
|
|
||||||
static hts_mirror_limit back_mirror_limit(httrackp *opt);
|
|
||||||
|
|
||||||
struct_back *back_new(httrackp *opt, int back_max) {
|
struct_back *back_new(httrackp *opt, int back_max) {
|
||||||
int i;
|
int i;
|
||||||
struct_back *sback = calloct(1, sizeof(struct_back));
|
struct_back *sback = calloct(1, sizeof(struct_back));
|
||||||
@@ -140,9 +129,8 @@ int back_connect_fallback_due(int addr_index, int addr_count, int elapsed,
|
|||||||
|
|
||||||
/* Pending-connect result for a non-blocking socket reported ready by select():
|
/* Pending-connect result for a non-blocking socket reported ready by select():
|
||||||
0 = connected, >0 = the connect errno (refused, unreachable, ...), -1 if the
|
0 = connected, >0 = the connect errno (refused, unreachable, ...), -1 if the
|
||||||
probe itself failed. A failed connect is reported ready as well (writable on
|
probe itself failed. A failed connect is reported writable too, so this is
|
||||||
posix, exception set on winsock), so this is how success is told from failure
|
how success is told from failure without blocking. */
|
||||||
without blocking. */
|
|
||||||
static int connect_socket_error(T_SOC soc) {
|
static int connect_socket_error(T_SOC soc) {
|
||||||
int soerr = 0;
|
int soerr = 0;
|
||||||
socklen_t len = (socklen_t) sizeof(soerr);
|
socklen_t len = (socklen_t) sizeof(soerr);
|
||||||
@@ -536,13 +524,12 @@ int back_nsoc_overall(const struct_back * sback) {
|
|||||||
|
|
||||||
/* generate temporary file on lien_back */
|
/* generate temporary file on lien_back */
|
||||||
/* Note: utf-8 */
|
/* Note: utf-8 */
|
||||||
static int create_back_tmpfile(httrackp *opt, lien_back *const back,
|
static int create_back_tmpfile(httrackp * opt, lien_back *const back) {
|
||||||
const char *ext) {
|
|
||||||
// do not use tempnam() but a regular filename
|
// do not use tempnam() but a regular filename
|
||||||
back->tmpfile_buffer[0] = '\0';
|
back->tmpfile_buffer[0] = '\0';
|
||||||
if (back->url_sav != NULL && back->url_sav[0] != '\0') {
|
if (back->url_sav != NULL && back->url_sav[0] != '\0') {
|
||||||
snprintf(back->tmpfile_buffer, sizeof(back->tmpfile_buffer), "%s.%s",
|
snprintf(back->tmpfile_buffer, sizeof(back->tmpfile_buffer), "%s.z",
|
||||||
back->url_sav, ext);
|
back->url_sav);
|
||||||
back->tmpfile = back->tmpfile_buffer;
|
back->tmpfile = back->tmpfile_buffer;
|
||||||
if (structcheck(back->tmpfile) != 0) {
|
if (structcheck(back->tmpfile) != 0) {
|
||||||
hts_log_print(opt, LOG_WARNING, "can not create directory to %s",
|
hts_log_print(opt, LOG_WARNING, "can not create directory to %s",
|
||||||
@@ -550,8 +537,9 @@ static int create_back_tmpfile(httrackp *opt, lien_back *const back,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
snprintf(back->tmpfile_buffer, sizeof(back->tmpfile_buffer), "%s/tmp%d.%s",
|
snprintf(back->tmpfile_buffer, sizeof(back->tmpfile_buffer),
|
||||||
StringBuff(opt->path_html_utf8), opt->state.tmpnameid++, ext);
|
"%s/tmp%d.z", StringBuff(opt->path_html_utf8),
|
||||||
|
opt->state.tmpnameid++);
|
||||||
back->tmpfile = back->tmpfile_buffer;
|
back->tmpfile = back->tmpfile_buffer;
|
||||||
}
|
}
|
||||||
/* OK */
|
/* OK */
|
||||||
@@ -559,39 +547,6 @@ static int create_back_tmpfile(httrackp *opt, lien_back *const back,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move src onto dst; RENAME does not clobber an existing target on Windows. */
|
|
||||||
static hts_boolean replace_file(const char *src, const char *dst) {
|
|
||||||
if (RENAME(src, dst) == 0)
|
|
||||||
return HTS_TRUE;
|
|
||||||
(void) UNLINK(dst);
|
|
||||||
return RENAME(src, dst) == 0 ? HTS_TRUE : HTS_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Commit or restore a re-fetch backup (#77 follow-up): a re-fetch over an
|
|
||||||
existing file moved the good copy to back->tmpfile before truncating url_sav.
|
|
||||||
commit keeps the new file and drops the backup; else restore it so an aborted
|
|
||||||
transfer leaves the previous copy intact. Skips the zlib .z temp. */
|
|
||||||
static void back_finalize_backup(httrackp *opt, lien_back *const back,
|
|
||||||
const hts_boolean commit) {
|
|
||||||
if (back->tmpfile == NULL || back->r.compressed)
|
|
||||||
return;
|
|
||||||
if (commit) {
|
|
||||||
(void) UNLINK(back->tmpfile); /* new copy is good; drop the backup */
|
|
||||||
} else {
|
|
||||||
if (back->r.out != NULL) {
|
|
||||||
fclose(back->r.out);
|
|
||||||
back->r.out = NULL;
|
|
||||||
}
|
|
||||||
/* On failure keep the backup: an orphaned temp beats losing the good copy.
|
|
||||||
*/
|
|
||||||
if (!replace_file(back->tmpfile, back->url_sav))
|
|
||||||
hts_log_print(opt, LOG_WARNING | LOG_ERRNO,
|
|
||||||
"could not restore %s; previous copy kept as %s",
|
|
||||||
back->url_sav, back->tmpfile);
|
|
||||||
}
|
|
||||||
back->tmpfile = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// objet (lien) téléchargé ou transféré depuis le cache
|
// objet (lien) téléchargé ou transféré depuis le cache
|
||||||
//
|
//
|
||||||
// fermer les paramètres de transfert,
|
// fermer les paramètres de transfert,
|
||||||
@@ -627,11 +582,6 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
LLintP " got " LLintP "): %s%s", back[p].r.totalsize,
|
LLintP " got " LLintP "): %s%s", back[p].r.totalsize,
|
||||||
back[p].r.size, back[p].url_adr, back[p].url_fil);
|
back[p].r.size, back[p].url_adr, back[p].url_fil);
|
||||||
}
|
}
|
||||||
back_finalize_backup(opt, &back[p], HTS_FALSE);
|
|
||||||
/* Keep the surviving copy in new.lst, else the update purge drops the
|
|
||||||
file we refused to overwrite with the partial body (#562). */
|
|
||||||
if (fexist_utf8(back[p].url_sav))
|
|
||||||
filenote(&opt->state.strc, back[p].url_sav, NULL);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,7 +591,8 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
if (!back[p].testmode) { // not test mode
|
if (!back[p].testmode) { // not test mode
|
||||||
const char *state = "unknown";
|
const char *state = "unknown";
|
||||||
|
|
||||||
/* Undo the content coding */
|
/* décompression */
|
||||||
|
#if HTS_USEZLIB
|
||||||
if (back[p].r.compressed) {
|
if (back[p].r.compressed) {
|
||||||
if (back[p].r.size > 0) {
|
if (back[p].r.size > 0) {
|
||||||
// stats
|
// stats
|
||||||
@@ -649,7 +600,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
// en mémoire -> passage sur disque
|
// en mémoire -> passage sur disque
|
||||||
if (!back[p].r.is_write) {
|
if (!back[p].r.is_write) {
|
||||||
// do not use tempnam() but a regular filename
|
// do not use tempnam() but a regular filename
|
||||||
if (create_back_tmpfile(opt, &back[p], "z") == 0) {
|
if (create_back_tmpfile(opt, &back[p]) == 0) {
|
||||||
assertf(back[p].tmpfile != NULL);
|
assertf(back[p].tmpfile != NULL);
|
||||||
/* note: tmpfile is utf-8 */
|
/* note: tmpfile is utf-8 */
|
||||||
back[p].r.out = FOPEN(back[p].tmpfile, "wb");
|
back[p].r.out = FOPEN(back[p].tmpfile, "wb");
|
||||||
@@ -687,67 +638,28 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
// décompression
|
// décompression
|
||||||
if (back[p].tmpfile != NULL) {
|
if (back[p].tmpfile != NULL) {
|
||||||
if (back[p].url_sav[0]) {
|
if (back[p].url_sav[0]) {
|
||||||
const hts_codec codec =
|
|
||||||
hts_codec_parse(back[p].r.contentencoding);
|
|
||||||
/* Never decode over url_sav: a failed decode would destroy the
|
|
||||||
copy an --update re-fetch is supposed to refresh (#557). */
|
|
||||||
char BIGSTK unpacked[HTS_URLMAXSIZE * 2 + 4]; // room for ".u"
|
|
||||||
LLint size;
|
LLint size;
|
||||||
|
|
||||||
snprintf(unpacked, sizeof(unpacked), "%s.u", back[p].url_sav);
|
file_notify(opt, back[p].url_adr, back[p].url_fil,
|
||||||
if ((size = hts_codec_unpack(codec, back[p].tmpfile,
|
back[p].url_sav, 1, 1, back[p].r.notmodified);
|
||||||
unpacked)) >= 0) {
|
filecreateempty(&opt->state.strc, back[p].url_sav); // filenote & co
|
||||||
|
if ((size = hts_zunpack(back[p].tmpfile, back[p].url_sav)) >= 0) {
|
||||||
back[p].r.size = back[p].r.totalsize = size;
|
back[p].r.size = back[p].r.totalsize = size;
|
||||||
|
// fichier -> mémoire
|
||||||
if (!back[p].r.is_write) {
|
if (!back[p].r.is_write) {
|
||||||
// fichier -> mémoire ; le fichier est écrit plus tard
|
|
||||||
deleteaddr(&back[p].r);
|
deleteaddr(&back[p].r);
|
||||||
back[p].r.adr = readfile_utf8(unpacked);
|
back[p].r.adr = readfile_utf8(back[p].url_sav);
|
||||||
if (!back[p].r.adr) {
|
if (!back[p].r.adr) {
|
||||||
back[p].r.statuscode = STATUSCODE_INVALID;
|
back[p].r.statuscode = STATUSCODE_INVALID;
|
||||||
strcpybuff(back[p].r.msg,
|
strcpybuff(back[p].r.msg,
|
||||||
"Read error when decompressing");
|
"Read error when decompressing");
|
||||||
}
|
}
|
||||||
UNLINK(unpacked);
|
UNLINK(back[p].url_sav);
|
||||||
} else if (replace_file(unpacked, back[p].url_sav)) {
|
|
||||||
/* The temp bypassed filecreate(), which is what chmods. */
|
|
||||||
#ifndef _WIN32
|
|
||||||
chmod(back[p].url_sav, HTS_ACCESS_FILE);
|
|
||||||
#endif
|
|
||||||
file_notify(opt, back[p].url_adr, back[p].url_fil,
|
|
||||||
back[p].url_sav, 1, 1, back[p].r.notmodified);
|
|
||||||
filenote(&opt->state.strc, back[p].url_sav, NULL);
|
|
||||||
} else {
|
|
||||||
back[p].r.statuscode = STATUSCODE_INVALID;
|
|
||||||
strcpybuff(back[p].r.msg,
|
|
||||||
"Write error when decompressing (can not rename "
|
|
||||||
"the temporary file)");
|
|
||||||
/* Keep the decoded body: the failed replace may have
|
|
||||||
removed the previous copy, leaving this as the only one.
|
|
||||||
*/
|
|
||||||
hts_log_print(
|
|
||||||
opt, LOG_WARNING | LOG_ERRNO,
|
|
||||||
"could not replace %s; decoded copy kept as %s",
|
|
||||||
back[p].url_sav, unpacked);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
back[p].r.statuscode = STATUSCODE_INVALID;
|
back[p].r.statuscode = STATUSCODE_INVALID;
|
||||||
snprintf(back[p].r.msg, sizeof(back[p].r.msg),
|
strcpybuff(back[p].r.msg, "Error when decompressing");
|
||||||
codec == HTS_CODEC_UNSUPPORTED
|
|
||||||
? "Unsupported Content-Encoding (%s)"
|
|
||||||
: "Error when decompressing (%s)",
|
|
||||||
back[p].r.contentencoding);
|
|
||||||
/* Drop the undecoded body so the writer can't commit the
|
|
||||||
coded bytes as the page; url_sav is left untouched. */
|
|
||||||
if (!back[p].r.is_write)
|
|
||||||
deleteaddr(&back[p].r);
|
|
||||||
UNLINK(unpacked);
|
|
||||||
}
|
}
|
||||||
/* A failed decode keeps the previously-mirrored copy: note it,
|
|
||||||
or the update purge (in old.lst, absent from new.lst) would
|
|
||||||
delete what we just took care not to overwrite. */
|
|
||||||
if (back[p].r.statuscode == STATUSCODE_INVALID &&
|
|
||||||
fexist_utf8(back[p].url_sav))
|
|
||||||
filenote(&opt->state.strc, back[p].url_sav, NULL);
|
|
||||||
}
|
}
|
||||||
/* ensure that no remaining temporary file exists */
|
/* ensure that no remaining temporary file exists */
|
||||||
unlink(back[p].tmpfile);
|
unlink(back[p].tmpfile);
|
||||||
@@ -760,9 +672,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
// unflag
|
// unflag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Body fully received: keep the freshly written url_sav, drop the
|
#endif
|
||||||
backup of the previous copy. */
|
|
||||||
back_finalize_backup(opt, &back[p], HTS_TRUE);
|
|
||||||
/* Write mode to disk */
|
/* Write mode to disk */
|
||||||
if (back[p].r.is_write && back[p].r.adr != NULL) {
|
if (back[p].r.is_write && back[p].r.adr != NULL) {
|
||||||
freet(back[p].r.adr);
|
freet(back[p].r.adr);
|
||||||
@@ -781,7 +691,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
if (back[p].r.statuscode == HTTP_OK) { // OK (ou 304 en backing)
|
if (back[p].r.statuscode == HTTP_OK) { // OK (ou 304 en backing)
|
||||||
if (back[p].r.is_write) { // Written file
|
if (back[p].r.is_write) { // Written file
|
||||||
if (may_be_hypertext_mime(opt, back[p].r.contenttype, back[p].url_fil)) { // to parse!
|
if (may_be_hypertext_mime(opt, back[p].r.contenttype, back[p].url_fil)) { // to parse!
|
||||||
LLint sz;
|
off_t sz;
|
||||||
|
|
||||||
sz = fsize_utf8(back[p].url_sav);
|
sz = fsize_utf8(back[p].url_sav);
|
||||||
if (sz > 0) { // ok, exists!
|
if (sz > 0) { // ok, exists!
|
||||||
@@ -858,7 +768,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
else
|
else
|
||||||
strcatbuff(flags, "-");
|
strcatbuff(flags, "-");
|
||||||
if (back[p].r.compressed)
|
if (back[p].r.compressed)
|
||||||
strcatbuff(flags, "Z"); // content coding
|
strcatbuff(flags, "Z"); // gzip
|
||||||
else
|
else
|
||||||
strcatbuff(flags, "-");
|
strcatbuff(flags, "-");
|
||||||
/* Err I had to split these.. */
|
/* Err I had to split these.. */
|
||||||
@@ -867,7 +777,9 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
fprintf(cache->txt, LLintP, (LLint) back[p].r.totalsize);
|
fprintf(cache->txt, LLintP, (LLint) back[p].r.totalsize);
|
||||||
fprintf(cache->txt, "\t%s\t", flags);
|
fprintf(cache->txt, "\t%s\t", flags);
|
||||||
}
|
}
|
||||||
|
#if HTS_USEZLIB
|
||||||
back[p].r.compressed = 0;
|
back[p].r.compressed = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (back[p].r.statuscode == HTTP_OK) {
|
if (back[p].r.statuscode == HTTP_OK) {
|
||||||
if (back[p].r.size >= 0) {
|
if (back[p].r.size >= 0) {
|
||||||
@@ -989,9 +901,6 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Aborted, error, or not ready: url_sav (if written) is broken; restore the
|
|
||||||
previous copy from the backup. */
|
|
||||||
back_finalize_backup(opt, &back[p], HTS_FALSE);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1958,7 +1867,7 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
|||||||
/* Not in cache ; maybe in temporary cache ? Warning: non-movable
|
/* Not in cache ; maybe in temporary cache ? Warning: non-movable
|
||||||
"url_sav" */
|
"url_sav" */
|
||||||
else if (back_unserialize_ref(opt, adr, fil, &itemback) == 0) {
|
else if (back_unserialize_ref(opt, adr, fil, &itemback) == 0) {
|
||||||
const LLint file_size = fsize_utf8(itemback->url_sav);
|
const off_t file_size = fsize_utf8(itemback->url_sav);
|
||||||
|
|
||||||
/* Found file on disk */
|
/* Found file on disk */
|
||||||
if (file_size > 0) {
|
if (file_size > 0) {
|
||||||
@@ -1993,7 +1902,7 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
|||||||
}
|
}
|
||||||
/* Not in cache or temporary cache ; found on disk ? (hack) */
|
/* Not in cache or temporary cache ; found on disk ? (hack) */
|
||||||
else if (fexist_utf8(save)) {
|
else if (fexist_utf8(save)) {
|
||||||
const LLint sz = fsize_utf8(save);
|
const off_t sz = fsize_utf8(save);
|
||||||
|
|
||||||
// Bon, là il est possible que le fichier ait été partiellement transféré
|
// Bon, là il est possible que le fichier ait été partiellement transféré
|
||||||
// (s'il l'avait été en totalité il aurait été inscrit dans le cache ET existerait sur disque)
|
// (s'il l'avait été en totalité il aurait été inscrit dans le cache ET existerait sur disque)
|
||||||
@@ -2117,17 +2026,6 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
|||||||
"error: forbidden test with ftp link for back_add");
|
"error: forbidden test with ftp link for back_add");
|
||||||
return -1; // erreur pas de test permis
|
return -1; // erreur pas de test permis
|
||||||
}
|
}
|
||||||
// the ftp client dials the origin itself: over socks that would bypass
|
|
||||||
// the proxy, so fail the link rather than leak the connection (#563)
|
|
||||||
if (back[p].r.req.proxy.active &&
|
|
||||||
hts_proxy_is_socks(back[p].r.req.proxy.name)) {
|
|
||||||
back[p].r.statuscode = STATUSCODE_NON_FATAL;
|
|
||||||
strcpybuff(back[p].r.msg,
|
|
||||||
"ftp:// is not supported over a SOCKS proxy");
|
|
||||||
back[p].status = STATUS_READY;
|
|
||||||
back_set_finished(sback, p);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (!(back[p].r.req.proxy.active && opt->ftp_proxy)) { // connexion directe, gérée en thread
|
if (!(back[p].r.req.proxy.active && opt->ftp_proxy)) { // connexion directe, gérée en thread
|
||||||
FTPDownloadStruct *str =
|
FTPDownloadStruct *str =
|
||||||
(FTPDownloadStruct *) malloc(sizeof(FTPDownloadStruct));
|
(FTPDownloadStruct *) malloc(sizeof(FTPDownloadStruct));
|
||||||
@@ -2152,9 +2050,13 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
|||||||
|
|
||||||
if (!back_trylive(opt, cache, sback, p)) {
|
if (!back_trylive(opt, cache, sback, p)) {
|
||||||
#if HTS_XGETHOST
|
#if HTS_XGETHOST
|
||||||
back[p].status = STATUS_WAIT_DNS; // host name resolution attempt
|
#if HDEBUG
|
||||||
soc = INVALID_SOCKET; // not opened yet
|
printf("back_solve..\n");
|
||||||
if (host_wait(opt, &back[p])) { // ready (file, or cached dns)
|
#endif
|
||||||
|
back[p].status = STATUS_WAIT_DNS; // tentative de résolution du nom de host
|
||||||
|
soc = INVALID_SOCKET; // pas encore ouverte
|
||||||
|
back_solve(opt, &back[p]); // préparer
|
||||||
|
if (host_wait(opt, &back[p])) { // prêt, par ex fichier ou dispo dans dns
|
||||||
#if HDEBUG
|
#if HDEBUG
|
||||||
printf("ok, dns cache ready..\n");
|
printf("ok, dns cache ready..\n");
|
||||||
#endif
|
#endif
|
||||||
@@ -2297,9 +2199,37 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if HTS_XGETHOST
|
#if HTS_XGETHOST
|
||||||
// Resolution is synchronous inside the connect path; no pre-resolve step, so
|
// attendre que le host (ou celui du proxy) ait été résolu
|
||||||
// the host is always immediately ready.
|
// si c'est un fichier, la résolution est immédiate
|
||||||
int host_wait(httrackp *opt, lien_back *back) { return 1; }
|
// idem pour ftp://
|
||||||
|
void back_solve(httrackp * opt, lien_back * back) {
|
||||||
|
assertf(opt != NULL);
|
||||||
|
assertf(back != NULL);
|
||||||
|
if ((!strfield(back->url_adr, "file://"))
|
||||||
|
&& !strfield(back->url_adr, "ftp://")
|
||||||
|
) {
|
||||||
|
const char *a;
|
||||||
|
|
||||||
|
if (!(back->r.req.proxy.active))
|
||||||
|
a = back->url_adr;
|
||||||
|
else
|
||||||
|
a = back->r.req.proxy.name;
|
||||||
|
assertf(a != NULL);
|
||||||
|
a = jump_protocol_const(a);
|
||||||
|
if (check_hostname_dns(a)) {
|
||||||
|
hts_log_print(opt, LOG_DEBUG, "resolved: %s", a);
|
||||||
|
} else {
|
||||||
|
hts_log_print(opt, LOG_DEBUG, "failed to resolve: %s", a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// détermine si le host a pu être résolu
|
||||||
|
int host_wait(httrackp * opt, lien_back * back) {
|
||||||
|
// Always synchronous. No more background DNS resolution
|
||||||
|
// (does not really improve performances)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// élimine les fichiers non html en backing (anticipation)
|
// élimine les fichiers non html en backing (anticipation)
|
||||||
@@ -2486,15 +2416,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
back_clean(opt, cache, sback);
|
back_clean(opt, cache, sback);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Time/size limit exceeded past grace: abort in-flight transfers so no wait
|
/* Time limit exceeded past grace: abort in-flight transfers so no wait loop
|
||||||
loop starves (#481, #77). FTP slots stay, their thread owns the socket. */
|
starves (#481). FTP slots stay, their thread owns the socket. */
|
||||||
if (!back_checkmirror(opt)) {
|
if (!back_checkmirror(opt)) {
|
||||||
const hts_mirror_limit limit = back_mirror_limit(opt);
|
|
||||||
const char *const reason =
|
|
||||||
(limit == HTS_MIRROR_LIMIT_SIZE) ? "size limit" : "time limit";
|
|
||||||
const char *const slotmsg = (limit == HTS_MIRROR_LIMIT_SIZE)
|
|
||||||
? "Mirror Size Limit"
|
|
||||||
: "Mirror Time Out";
|
|
||||||
int aborted = 0;
|
int aborted = 0;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@@ -2508,15 +2432,15 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
if (back[i].r.is_write && IS_DELAYED_EXT(back[i].url_sav))
|
if (back[i].r.is_write && IS_DELAYED_EXT(back[i].url_sav))
|
||||||
back_delayed_discard(opt, &back[i]);
|
back_delayed_discard(opt, &back[i]);
|
||||||
back[i].r.statuscode = STATUSCODE_TIMEOUT;
|
back[i].r.statuscode = STATUSCODE_TIMEOUT;
|
||||||
strcpybuff(back[i].r.msg, slotmsg);
|
strcpybuff(back[i].r.msg, "Mirror Time Out");
|
||||||
back[i].status = STATUS_READY;
|
back[i].status = STATUS_READY;
|
||||||
back_set_finished(sback, i);
|
back_set_finished(sback, i);
|
||||||
aborted++;
|
aborted++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (aborted > 0)
|
if (aborted > 0)
|
||||||
hts_log_print(opt, LOG_WARNING, "%s reached, %d transfer(s) aborted",
|
hts_log_print(opt, LOG_WARNING,
|
||||||
reason, aborted);
|
"time limit reached, %d transfer(s) aborted", aborted);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2663,9 +2587,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
for (i_mod = 0; i_mod < (unsigned int) back_max; i_mod++) {
|
for (i_mod = 0; i_mod < (unsigned int) back_max; i_mod++) {
|
||||||
unsigned int i = (i_mod + mod_random) % (back_max);
|
unsigned int i = (i_mod + mod_random) % (back_max);
|
||||||
|
|
||||||
// winsock flags a failed connect in the exception set only: leave a
|
if (back[i].status > 0) {
|
||||||
// connecting slot to the connect handler, which can still fall back
|
|
||||||
if (back[i].status > 0 && back[i].status != STATUS_CONNECTING) {
|
|
||||||
if (!back[i].r.is_file) { // not file..
|
if (!back[i].r.is_file) { // not file..
|
||||||
if (back[i].r.soc != INVALID_SOCKET) { // hey, you never know..
|
if (back[i].r.soc != INVALID_SOCKET) { // hey, you never know..
|
||||||
int err = FD_ISSET(back[i].r.soc, &fds_e);
|
int err = FD_ISSET(back[i].r.soc, &fds_e);
|
||||||
@@ -2679,7 +2601,10 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
}
|
}
|
||||||
back[i].r.soc = INVALID_SOCKET;
|
back[i].r.soc = INVALID_SOCKET;
|
||||||
back[i].r.statuscode = STATUSCODE_CONNERROR;
|
back[i].r.statuscode = STATUSCODE_CONNERROR;
|
||||||
strcpybuff(back[i].r.msg, "Receive Error");
|
if (back[i].status == STATUS_CONNECTING)
|
||||||
|
strcpybuff(back[i].r.msg, "Connect Error");
|
||||||
|
else
|
||||||
|
strcpybuff(back[i].r.msg, "Receive Error");
|
||||||
if (back[i].status == STATUS_ALIVE) { /* Keep-alive socket */
|
if (back[i].status == STATUS_ALIVE) { /* Keep-alive socket */
|
||||||
back_delete(opt, cache, sback, i);
|
back_delete(opt, cache, sback, i);
|
||||||
} else {
|
} else {
|
||||||
@@ -2696,12 +2621,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
int dispo = 0;
|
int dispo = 0;
|
||||||
|
|
||||||
// probe the resolved address list once per fresh connect (cache hit:
|
// probe the resolved address list once per fresh connect (cache hit:
|
||||||
// the host was resolved when this connect was opened). Not under a
|
// the host was resolved when this connect was opened)
|
||||||
// proxy: the socket dials the proxy, so resolving the origin here leaks
|
|
||||||
// its DNS and lets a proxy-connect failure fall back to dialing it
|
|
||||||
// direct.
|
|
||||||
if (cf->addr_count < 0 && back[i].r.soc != INVALID_SOCKET &&
|
if (cf->addr_count < 0 && back[i].r.soc != INVALID_SOCKET &&
|
||||||
!back[i].r.is_file && !back[i].r.req.proxy.active) {
|
!back[i].r.is_file) {
|
||||||
SOCaddr scratch[HTS_MAXADDRNUM];
|
SOCaddr scratch[HTS_MAXADDRNUM];
|
||||||
|
|
||||||
cf->addr_count = hts_dns_resolve_all(opt, back[i].url_adr, scratch,
|
cf->addr_count = hts_dns_resolve_all(opt, back[i].url_adr, scratch,
|
||||||
@@ -2715,11 +2637,10 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
gestion_timeout = 1;
|
gestion_timeout = 1;
|
||||||
|
|
||||||
// connecté?
|
// connecté?
|
||||||
dispo = back[i].r.soc != INVALID_SOCKET &&
|
dispo = FD_ISSET(back[i].r.soc, &fds_c);
|
||||||
(FD_ISSET(back[i].r.soc, &fds_c) ||
|
|
||||||
FD_ISSET(back[i].r.soc, &fds_e));
|
|
||||||
if (dispo) { // socket ready: connect() finished (ok or failed)
|
if (dispo) { // socket ready: connect() finished (ok or failed)
|
||||||
// probe SO_ERROR and, on failure, fall back to the next address
|
// a refused/failed connect is reported writable too; probe SO_ERROR
|
||||||
|
// and, on failure, fall back to the next address (or fail the slot)
|
||||||
if (connect_socket_error(back[i].r.soc) != 0) {
|
if (connect_socket_error(back[i].r.soc) != 0) {
|
||||||
if (!back_connect_next(opt, sback, i)) {
|
if (!back_connect_next(opt, sback, i)) {
|
||||||
deletehttp(&back[i].r);
|
deletehttp(&back[i].r);
|
||||||
@@ -2733,62 +2654,13 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
}
|
}
|
||||||
busy_state = 1;
|
busy_state = 1;
|
||||||
|
|
||||||
// socks5: tunnel to the origin before anything is written, for http
|
|
||||||
// as well as https. Skip on a reused keep-alive socket (already
|
|
||||||
// tunneled) and on the post-TLS re-entry (ssl_con set) (#563).
|
|
||||||
if (back[i].r.req.proxy.active &&
|
|
||||||
hts_proxy_is_socks(back[i].r.req.proxy.name) &&
|
|
||||||
!back[i].r.keep_alive
|
|
||||||
#if HTS_USEOPENSSL
|
|
||||||
&& back[i].r.ssl_con == NULL
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
const int timeout = back[i].timeout > 0 ? back[i].timeout : 30;
|
|
||||||
|
|
||||||
if (!socks5_handshake(opt, &back[i].r, back[i].url_adr, timeout)) {
|
|
||||||
if (!strnotempty(back[i].r.msg))
|
|
||||||
strcpybuff(back[i].r.msg, "SOCKS5 handshake failed");
|
|
||||||
deletehttp(&back[i].r);
|
|
||||||
back[i].r.soc = INVALID_SOCKET;
|
|
||||||
back[i].r.statuscode = STATUSCODE_NON_FATAL;
|
|
||||||
back[i].status = STATUS_READY;
|
|
||||||
back_set_finished(sback, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// plain http tunneled through a CONNECT-only proxy (#564)
|
|
||||||
if (back[i].r.req.proxy.active &&
|
|
||||||
hts_proxy_is_connect(back[i].r.req.proxy.name) &&
|
|
||||||
!back[i].r.keep_alive
|
|
||||||
#if HTS_USEOPENSSL
|
|
||||||
&& !back[i].r.ssl
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
const int timeout = back[i].timeout > 0 ? back[i].timeout : 30;
|
|
||||||
|
|
||||||
if (!http_proxy_tunnel(opt, &back[i].r, back[i].url_adr, timeout)) {
|
|
||||||
if (!strnotempty(back[i].r.msg))
|
|
||||||
strcpybuff(back[i].r.msg, "proxy CONNECT failed");
|
|
||||||
deletehttp(&back[i].r);
|
|
||||||
back[i].r.soc = INVALID_SOCKET;
|
|
||||||
back[i].r.statuscode = STATUSCODE_NON_FATAL;
|
|
||||||
back[i].status = STATUS_READY;
|
|
||||||
back_set_finished(sback, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HTS_USEOPENSSL
|
#if HTS_USEOPENSSL
|
||||||
/* SSL mode */
|
/* SSL mode */
|
||||||
if (back[i].r.ssl) {
|
if (back[i].r.ssl) {
|
||||||
int tunnel_ok = 1;
|
int tunnel_ok = 1;
|
||||||
|
|
||||||
// https via an http proxy: CONNECT-tunnel before TLS (#85); socks
|
// https via proxy: CONNECT-tunnel before TLS (#85)
|
||||||
// already carries the origin connection
|
if (back[i].r.req.proxy.active && back[i].r.ssl_con == NULL) {
|
||||||
if (back[i].r.req.proxy.active &&
|
|
||||||
!hts_proxy_is_socks(back[i].r.req.proxy.name) &&
|
|
||||||
back[i].r.ssl_con == NULL) {
|
|
||||||
const int timeout = back[i].timeout > 0 ? back[i].timeout : 30;
|
const int timeout = back[i].timeout > 0 ? back[i].timeout : 30;
|
||||||
|
|
||||||
tunnel_ok =
|
tunnel_ok =
|
||||||
@@ -2816,9 +2688,6 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
if (SSL_set_fd(back[i].r.ssl_con, (int) back[i].r.soc) == 1) {
|
if (SSL_set_fd(back[i].r.ssl_con, (int) back[i].r.soc) == 1) {
|
||||||
SSL_set_connect_state(back[i].r.ssl_con);
|
SSL_set_connect_state(back[i].r.ssl_con);
|
||||||
back[i].status = STATUS_SSL_WAIT_HANDSHAKE; /* handshake wait */
|
back[i].status = STATUS_SSL_WAIT_HANDSHAKE; /* handshake wait */
|
||||||
// the handshake gets its own timeout window, as connect does
|
|
||||||
if (back[i].timeout > 0)
|
|
||||||
back[i].timeout_refresh = time_local();
|
|
||||||
} else
|
} else
|
||||||
back[i].r.statuscode = STATUSCODE_SSL_HANDSHAKE;
|
back[i].r.statuscode = STATUSCODE_SSL_HANDSHAKE;
|
||||||
} else
|
} else
|
||||||
@@ -2878,11 +2747,6 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
}
|
}
|
||||||
#if HTS_USEOPENSSL
|
#if HTS_USEOPENSSL
|
||||||
else if (back[i].status == STATUS_SSL_WAIT_HANDSHAKE) { // wait for SSL handshake
|
else if (back[i].status == STATUS_SSL_WAIT_HANDSHAKE) { // wait for SSL handshake
|
||||||
// a peer that never speaks TLS must be reaped by --timeout too (#607)
|
|
||||||
if (!gestion_timeout)
|
|
||||||
if (back[i].timeout > 0)
|
|
||||||
gestion_timeout = 1;
|
|
||||||
|
|
||||||
/* SSL mode */
|
/* SSL mode */
|
||||||
if (back[i].r.ssl) {
|
if (back[i].r.ssl) {
|
||||||
int conn_code;
|
int conn_code;
|
||||||
@@ -3061,15 +2925,12 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
int last_errno = 0;
|
int last_errno = 0;
|
||||||
|
|
||||||
back[i].r.is_write = 1; // écrire
|
back[i].r.is_write = 1; // écrire
|
||||||
/* a .gz/.br/.zst saved under its own coding stays
|
|
||||||
packed on disk */
|
|
||||||
if (back[i].r.compressed &&
|
if (back[i].r.compressed &&
|
||||||
!hts_codec_is_archive_ext(
|
/* .gz are *NOT* depacked!! */
|
||||||
hts_codec_parse(back[i].r.contentencoding),
|
strfield(get_ext(catbuff, sizeof(catbuff), back[i].url_sav), "gz") == 0
|
||||||
get_ext(catbuff, sizeof(catbuff),
|
&& strfield(get_ext(catbuff, sizeof(catbuff), back[i].url_sav), "tgz") == 0
|
||||||
back[i].url_sav))) {
|
) {
|
||||||
if (create_back_tmpfile(opt, &back[i], "z") ==
|
if (create_back_tmpfile(opt, &back[i]) == 0) {
|
||||||
0) {
|
|
||||||
assertf(back[i].tmpfile != NULL);
|
assertf(back[i].tmpfile != NULL);
|
||||||
/* note: tmpfile is utf-8 */
|
/* note: tmpfile is utf-8 */
|
||||||
if ((back[i].r.out =
|
if ((back[i].r.out =
|
||||||
@@ -3082,20 +2943,6 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
back[i].url_sav, 1, 1,
|
back[i].url_sav, 1, 1,
|
||||||
back[i].r.notmodified);
|
back[i].r.notmodified);
|
||||||
back[i].r.compressed = 0;
|
back[i].r.compressed = 0;
|
||||||
/* Re-fetch over an existing file (#77 follow-up):
|
|
||||||
move the good copy aside before truncating it
|
|
||||||
so an aborted transfer can restore it. url_sav
|
|
||||||
is still written normally (file list intact).
|
|
||||||
*/
|
|
||||||
back[i].tmpfile = NULL;
|
|
||||||
if (fexist_utf8(back[i].url_sav)) {
|
|
||||||
if (create_back_tmpfile(opt, &back[i], "bak") !=
|
|
||||||
0 ||
|
|
||||||
RENAME(back[i].url_sav, back[i].tmpfile) !=
|
|
||||||
0) {
|
|
||||||
back[i].tmpfile = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((back[i].r.out =
|
if ((back[i].r.out =
|
||||||
filecreate(&opt->state.strc,
|
filecreate(&opt->state.strc,
|
||||||
back[i].url_sav)) == NULL) {
|
back[i].url_sav)) == NULL) {
|
||||||
@@ -3343,26 +3190,16 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
back[i].chunk_blocksize = -1; /* ending */
|
back[i].chunk_blocksize = -1; /* ending */
|
||||||
back[i].r.totalsize += chunk_size; // noter taille
|
back[i].r.totalsize += chunk_size; // noter taille
|
||||||
if (back[i].r.adr != NULL || !back[i].r.is_write) { // Not to disk
|
if (back[i].r.adr != NULL || !back[i].r.is_write) { // Not to disk
|
||||||
// totalsize sums attacker-declared chunk sizes; past
|
back[i].r.adr =
|
||||||
// 2GB the (size_t) cast below truncates on 32-bit and
|
(char *) realloct(back[i].r.adr,
|
||||||
// under-allocates. Mark the chunk invalid so the shared
|
(size_t) back[i].r.totalsize + 1);
|
||||||
// error path tears the transfer down.
|
if (!back[i].r.adr) {
|
||||||
if (back[i].r.totalsize > INT32_MAX) {
|
if (cache->log != NULL) {
|
||||||
hts_log_print(opt, LOG_WARNING,
|
hts_log_print(opt, LOG_ERROR,
|
||||||
"Chunked resource too large for %s%s",
|
"not enough memory (" LLintP
|
||||||
back[i].url_adr, back[i].url_fil);
|
") for %s%s",
|
||||||
chunk_size = -1;
|
(LLint) back[i].r.totalsize,
|
||||||
} else {
|
back[i].url_adr, back[i].url_fil);
|
||||||
back[i].r.adr = (char *) realloct(
|
|
||||||
back[i].r.adr, (size_t) back[i].r.totalsize + 1);
|
|
||||||
if (!back[i].r.adr) {
|
|
||||||
if (cache->log != NULL) {
|
|
||||||
hts_log_print(opt, LOG_ERROR,
|
|
||||||
"not enough memory (" LLintP
|
|
||||||
") for %s%s",
|
|
||||||
(LLint) back[i].r.totalsize,
|
|
||||||
back[i].url_adr, back[i].url_fil);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3644,11 +3481,6 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The server really sent 304 here; the *-hacks below force
|
|
||||||
// NOT_MODIFIED only after confirming the file is complete.
|
|
||||||
const hts_boolean server_sent_304 =
|
|
||||||
(back[i].r.statuscode == HTTP_NOT_MODIFIED);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Solve "false" 416 problems
|
Solve "false" 416 problems
|
||||||
*/
|
*/
|
||||||
@@ -3677,20 +3509,22 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
if (back[i].r.statuscode == 406) { // 'Not Acceptable'
|
if (back[i].r.statuscode == 406) { // 'Not Acceptable'
|
||||||
back[i].r.statuscode = HTTP_OK;
|
back[i].r.statuscode = HTTP_OK;
|
||||||
}
|
}
|
||||||
// On update, keep the good copy on error (mask as 304); skip
|
// 'do not erase already downloaded file'
|
||||||
// resume paths so a stale-partial 416 still re-fetches.
|
// on an updated file
|
||||||
if (HTTP_IS_ERROR(back[i].r.statuscode) &&
|
// with an error : consider a 304 error
|
||||||
back[i].is_update && !back[i].testmode &&
|
if (!opt->delete_old) {
|
||||||
back[i].range_req_size == 0 && back[i].url_sav[0] &&
|
if (HTTP_IS_ERROR(back[i].r.statuscode) && back[i].is_update
|
||||||
fexist_utf8(back[i].url_sav)) {
|
&& !back[i].testmode) {
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
if (back[i].url_sav[0] && fexist_utf8(back[i].url_sav)) {
|
||||||
"Error %d (%s) ignored on update, keeping "
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
"existing copy: %s%s",
|
"Error ignored %d (%s) because of 'no purge' option for %s%s",
|
||||||
back[i].r.statuscode, back[i].r.msg,
|
back[i].r.statuscode, back[i].r.msg,
|
||||||
back[i].url_adr, back[i].url_fil);
|
back[i].url_adr, back[i].url_fil);
|
||||||
back[i].r.statuscode = HTTP_NOT_MODIFIED;
|
back[i].r.statuscode = HTTP_NOT_MODIFIED;
|
||||||
deletehttp(&back[i].r);
|
deletehttp(&back[i].r);
|
||||||
back[i].r.soc = INVALID_SOCKET;
|
back[i].r.soc = INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Various hacks to limit re-transfers when updating a mirror
|
// Various hacks to limit re-transfers when updating a mirror
|
||||||
// Force update if same size detected
|
// Force update if same size detected
|
||||||
@@ -3743,7 +3577,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
if (back[i].r.statuscode == HTTP_OK && !back[i].testmode) { // 'OK'
|
if (back[i].r.statuscode == HTTP_OK && !back[i].testmode) { // 'OK'
|
||||||
if (!is_hypertext_mime(opt, back[i].r.contenttype, back[i].url_fil)) { // not HTML
|
if (!is_hypertext_mime(opt, back[i].r.contenttype, back[i].url_fil)) { // not HTML
|
||||||
if (strnotempty(back[i].url_sav)) { // target found
|
if (strnotempty(back[i].url_sav)) { // target found
|
||||||
LLint size = fsize_utf8(back[i].url_sav);
|
int size = fsize_utf8(back[i].url_sav); // target size
|
||||||
|
|
||||||
if (size >= 0) {
|
if (size >= 0) {
|
||||||
if (back[i].r.totalsize == size) { // same size!
|
if (back[i].r.totalsize == size) { // same size!
|
||||||
@@ -3838,21 +3672,6 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Out-of-protocol 304 to a Range resume: the file is still
|
|
||||||
// partial, so drop it and refetch instead of trusting it.
|
|
||||||
if (server_sent_304 && back[i].range_req_size > 0) {
|
|
||||||
url_savename_refname_remove(opt, back[i].url_adr,
|
|
||||||
back[i].url_fil);
|
|
||||||
UNLINK(back[i].url_sav);
|
|
||||||
deletehttp(&back[i].r);
|
|
||||||
back[i].r.soc = INVALID_SOCKET;
|
|
||||||
back[i].r.statuscode = STATUSCODE_NON_FATAL;
|
|
||||||
strcpybuff(back[i].r.msg,
|
|
||||||
"Bogus 304 on resume, restarting");
|
|
||||||
back[i].status = STATUS_READY;
|
|
||||||
back_set_finished(sback, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* sinon, continuer */
|
/* sinon, continuer */
|
||||||
/* if (back[i].r.soc!=INVALID_SOCKET) { // ok récupérer body? */
|
/* if (back[i].r.soc!=INVALID_SOCKET) { // ok récupérer body? */
|
||||||
// head: terminé
|
// head: terminé
|
||||||
@@ -3962,7 +3781,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
// traiter 206 (partial content)
|
// traiter 206 (partial content)
|
||||||
// xxc SI CHUNK VERIFIER QUE CA MARCHE??
|
// xxc SI CHUNK VERIFIER QUE CA MARCHE??
|
||||||
if (back[i].r.statuscode == 206) { // on nous envoie un morceau (la fin) coz une partie sur disque!
|
if (back[i].r.statuscode == 206) { // on nous envoie un morceau (la fin) coz une partie sur disque!
|
||||||
LLint sz = fsize_utf8(back[i].url_sav);
|
off_t sz = fsize_utf8(back[i].url_sav);
|
||||||
/* RFC 7233: resume at the server's Content-Range start,
|
/* RFC 7233: resume at the server's Content-Range start,
|
||||||
not the offset we requested; a server may resume
|
not the offset we requested; a server may resume
|
||||||
earlier and appending the overlap duplicates bytes
|
earlier and appending the overlap duplicates bytes
|
||||||
@@ -3971,7 +3790,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
const hts_boolean range_ok =
|
const hts_boolean range_ok =
|
||||||
back[i].r.crange > 0 && resume >= 0 &&
|
back[i].r.crange > 0 && resume >= 0 &&
|
||||||
resume <= (LLint) sz &&
|
resume <= (LLint) sz &&
|
||||||
back[i].r.crange_end == back[i].r.crange - 1 &&
|
back[i].r.crange_end + 1 == back[i].r.crange &&
|
||||||
(back[i].r.totalsize < 0 ||
|
(back[i].r.totalsize < 0 ||
|
||||||
back[i].r.totalsize ==
|
back[i].r.totalsize ==
|
||||||
back[i].r.crange_end - resume + 1);
|
back[i].r.crange_end - resume + 1);
|
||||||
@@ -4000,9 +3819,8 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
// drop bytes past the resume point; a silent
|
// drop bytes past the resume point; a silent
|
||||||
// failure could leave a stale tail, so on error
|
// failure could leave a stale tail, so on error
|
||||||
// drop the partial and refetch the whole file
|
// drop the partial and refetch the whole file
|
||||||
/* not (off_t): 32-bit on MSVC, wrapping a resume
|
if (HTS_FTRUNCATE(back[i].r.out,
|
||||||
past 2GB */
|
(off_t) resume) != 0) {
|
||||||
if (HTS_FTRUNCATE(back[i].r.out, resume) != 0) {
|
|
||||||
fclose(back[i].r.out);
|
fclose(back[i].r.out);
|
||||||
back[i].r.out = NULL;
|
back[i].r.out = NULL;
|
||||||
url_savename_refname_remove(
|
url_savename_refname_remove(
|
||||||
@@ -4014,9 +3832,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
"Can not truncate partial file, "
|
"Can not truncate partial file, "
|
||||||
"restarting");
|
"restarting");
|
||||||
} else {
|
} else {
|
||||||
/* not (off_t): 32-bit on MSVC, truncating a
|
fseeko(back[i].r.out, (off_t) resume, SEEK_SET);
|
||||||
resume past 2GB */
|
|
||||||
fseeko(back[i].r.out, resume, SEEK_SET);
|
|
||||||
/* create a temporary reference file in case of
|
/* create a temporary reference file in case of
|
||||||
* broken mirror */
|
* broken mirror */
|
||||||
if (back_serialize_ref(opt, &back[i]) != 0) {
|
if (back_serialize_ref(opt, &back[i]) != 0) {
|
||||||
@@ -4043,20 +3859,11 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
if (fp) {
|
if (fp) {
|
||||||
LLint alloc_mem = resume + 1;
|
LLint alloc_mem = resume + 1;
|
||||||
|
|
||||||
// Bound the in-memory buffer to a 32-bit size (real
|
if (back[i].r.totalsize >= 0)
|
||||||
// in-RAM resources are far smaller); a hostile
|
|
||||||
// Content-Length that would overflow the add or the
|
|
||||||
// (size_t) cast is dropped and refetched instead.
|
|
||||||
if (back[i].r.totalsize > INT32_MAX - alloc_mem) {
|
|
||||||
url_savename_refname_remove(opt, back[i].url_adr,
|
|
||||||
back[i].url_fil);
|
|
||||||
UNLINK(back[i].url_sav);
|
|
||||||
alloc_mem = -1;
|
|
||||||
} else if (back[i].r.totalsize >= 0)
|
|
||||||
alloc_mem += back[i].r.totalsize; // AJOUTER RESTANT!
|
alloc_mem += back[i].r.totalsize; // AJOUTER RESTANT!
|
||||||
if (alloc_mem >= 0 && deleteaddr(&back[i].r) &&
|
if (deleteaddr(&back[i].r)
|
||||||
(back[i].r.adr =
|
&& (back[i].r.adr =
|
||||||
(char *) malloct((size_t) alloc_mem))) {
|
(char *) malloct((size_t) alloc_mem))) {
|
||||||
back[i].r.size = resume;
|
back[i].r.size = resume;
|
||||||
if (back[i].r.totalsize >= 0)
|
if (back[i].r.totalsize >= 0)
|
||||||
back[i].r.totalsize += resume; // -> full size
|
back[i].r.totalsize += resume; // -> full size
|
||||||
@@ -4273,8 +4080,6 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
strcpybuff(back[i].r.msg, "Connect Time Out");
|
strcpybuff(back[i].r.msg, "Connect Time Out");
|
||||||
else if (back[i].status == STATUS_WAIT_DNS)
|
else if (back[i].status == STATUS_WAIT_DNS)
|
||||||
strcpybuff(back[i].r.msg, "DNS Time Out");
|
strcpybuff(back[i].r.msg, "DNS Time Out");
|
||||||
else if (back[i].status == STATUS_SSL_WAIT_HANDSHAKE)
|
|
||||||
strcpybuff(back[i].r.msg, "SSL/TLS Handshake Time Out");
|
|
||||||
else
|
else
|
||||||
strcpybuff(back[i].r.msg, "Receive Time Out");
|
strcpybuff(back[i].r.msg, "Receive Time Out");
|
||||||
back[i].status = STATUS_READY; // terminé
|
back[i].status = STATUS_READY; // terminé
|
||||||
@@ -4340,46 +4145,38 @@ static int back_maxtime_grace(const int maxtime) {
|
|||||||
return maximum(5, minimum(30, maxtime / 10));
|
return maximum(5, minimum(30, maxtime / 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bytes the smooth stop may overrun before in-flight transfers are aborted.
|
int back_checkmirror(httrackp * opt) {
|
||||||
No floor (unlike the time grace): a size overrun should abort promptly. */
|
// Check max size
|
||||||
static LLint back_maxsize_grace(const LLint maxsite) { return maxsite / 10; }
|
if ((opt->maxsite > 0) && (HTS_STAT.stat_bytes >= opt->maxsite)) {
|
||||||
|
if (!opt->state.stop) { /* not yet stopped */
|
||||||
/* Which cap has overrun its grace and must hard-stop the mirror (#77, #481).
|
hts_log_print(opt, LOG_ERROR,
|
||||||
-M measures received volume (HTS_TOTAL_RECV), not saved 200-only stat_bytes
|
"More than " LLintP
|
||||||
which undercounts redirect/error-heavy crawls (#520). */
|
" bytes have been transferred.. giving up",
|
||||||
static hts_mirror_limit back_mirror_limit(httrackp *opt) {
|
(LLint) opt->maxsite);
|
||||||
if (opt->maxsite > 0 && HTS_STAT.HTS_TOTAL_RECV >= opt->maxsite &&
|
/* cancel mirror smoothly */
|
||||||
HTS_STAT.HTS_TOTAL_RECV - opt->maxsite >=
|
hts_request_stop(opt, 0);
|
||||||
back_maxsize_grace(opt->maxsite))
|
}
|
||||||
return HTS_MIRROR_LIMIT_SIZE;
|
return 1; /* don'k break mirror too sharply for size limits, but stop requested */
|
||||||
|
/*return 0;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
// Check max time
|
||||||
if (opt->maxtime > 0) {
|
if (opt->maxtime > 0) {
|
||||||
const TStamp elapsed = time_local() - HTS_STAT.stat_timestart;
|
const TStamp elapsed = time_local() - HTS_STAT.stat_timestart;
|
||||||
|
|
||||||
if (elapsed >= opt->maxtime &&
|
if (elapsed >= opt->maxtime) {
|
||||||
elapsed - opt->maxtime >= back_maxtime_grace(opt->maxtime))
|
if (!opt->state.stop) { /* not yet stopped */
|
||||||
return HTS_MIRROR_LIMIT_TIME;
|
hts_log_print(opt, LOG_ERROR, "More than %d seconds passed.. giving up",
|
||||||
|
opt->maxtime);
|
||||||
|
/* cancel mirror smoothly */
|
||||||
|
hts_request_stop(opt, 0);
|
||||||
|
}
|
||||||
|
/* smooth stop starved past the grace period: stop waiting (#481) */
|
||||||
|
if (elapsed - opt->maxtime >= back_maxtime_grace(opt->maxtime))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return HTS_MIRROR_LIMIT_NONE;
|
return 1; /* Ok, go on */
|
||||||
}
|
|
||||||
|
|
||||||
int back_checkmirror(httrackp *opt) {
|
|
||||||
/* request a smooth stop the first time each cap is reached */
|
|
||||||
if (opt->maxsite > 0 && HTS_STAT.HTS_TOTAL_RECV >= opt->maxsite &&
|
|
||||||
!opt->state.stop) {
|
|
||||||
hts_log_print(opt, LOG_ERROR,
|
|
||||||
"More than " LLintP
|
|
||||||
" bytes have been transferred.. giving up",
|
|
||||||
(LLint) opt->maxsite);
|
|
||||||
hts_request_stop(opt, 0);
|
|
||||||
}
|
|
||||||
if (opt->maxtime > 0 && !opt->state.stop &&
|
|
||||||
(time_local() - HTS_STAT.stat_timestart) >= opt->maxtime) {
|
|
||||||
hts_log_print(opt, LOG_ERROR, "More than %d seconds passed.. giving up",
|
|
||||||
opt->maxtime);
|
|
||||||
hts_request_stop(opt, 0);
|
|
||||||
}
|
|
||||||
/* hard stop once a cap overruns its grace (callers must stop waiting) */
|
|
||||||
return back_mirror_limit(opt) == HTS_MIRROR_LIMIT_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// octets transférés + add
|
// octets transférés + add
|
||||||
|
|||||||
@@ -138,11 +138,12 @@ LLint back_transferred(LLint add, struct_back * sback);
|
|||||||
|
|
||||||
// hostback
|
// hostback
|
||||||
#if HTS_XGETHOST
|
#if HTS_XGETHOST
|
||||||
|
void back_solve(httrackp * opt, lien_back * sback);
|
||||||
int host_wait(httrackp * opt, lien_back * sback);
|
int host_wait(httrackp * opt, lien_back * sback);
|
||||||
#endif
|
#endif
|
||||||
int back_checksize(httrackp * opt, lien_back * eback, int check_only_totalsize);
|
int back_checksize(httrackp * opt, lien_back * eback, int check_only_totalsize);
|
||||||
/* Enforce -M/-E quotas: smooth-stops when reached; returns 0 once the -M cap
|
/* Enforce -M/-E quotas: requests a smooth stop when reached; returns 0 once
|
||||||
or -E deadline overruns its grace period (callers must stop waiting). */
|
the -E deadline overran its grace period (callers must stop waiting). */
|
||||||
int back_checkmirror(httrackp * opt);
|
int back_checkmirror(httrackp * opt);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -356,7 +356,7 @@ void cache_add(httrackp * opt, cache_back * cache, const htsblk * r,
|
|||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
// On recopie le fichier->.
|
// On recopie le fichier->.
|
||||||
LLint file_size = fsize_utf8(fconv(catbuff, sizeof(catbuff), url_save));
|
off_t file_size = fsize_utf8(fconv(catbuff, sizeof(catbuff), url_save));
|
||||||
|
|
||||||
if (file_size >= 0) {
|
if (file_size >= 0) {
|
||||||
fp = FOPEN(fconv(catbuff, sizeof(catbuff), url_save), "rb");
|
fp = FOPEN(fconv(catbuff, sizeof(catbuff), url_save), "rb");
|
||||||
@@ -1241,27 +1241,23 @@ char *readfile(const char *fil) {
|
|||||||
char *readfile2(const char *fil, LLint * size) {
|
char *readfile2(const char *fil, LLint * size) {
|
||||||
char *adr = NULL;
|
char *adr = NULL;
|
||||||
char catbuff[CATBUFF_SIZE];
|
char catbuff[CATBUFF_SIZE];
|
||||||
const LLint len = fsize(fil);
|
INTsys len = 0;
|
||||||
|
|
||||||
/* a size too large for size_t (32-bit Windows/i386) must fail closed: it
|
len = fsize(fil);
|
||||||
would wrap malloct() short while fread() still read the untruncated len */
|
if (len >= 0) { // exists
|
||||||
const size_t buflen = len >= 0 ? llint_to_size_t(len) : (size_t) -1;
|
|
||||||
|
|
||||||
if (buflen != (size_t) -1) { // exists, and is addressable
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
fp = fopen(fconv(catbuff, sizeof(catbuff), fil), "rb");
|
fp = fopen(fconv(catbuff, sizeof(catbuff), fil), "rb");
|
||||||
if (fp != NULL) { // n'existe pas (!)
|
if (fp != NULL) { // n'existe pas (!)
|
||||||
adr = (char *) malloct(buflen + 1);
|
adr = (char *) malloct(len + 1);
|
||||||
if (size != NULL)
|
if (size != NULL)
|
||||||
*size = len;
|
*size = len;
|
||||||
if (adr != NULL) {
|
if (adr != NULL) {
|
||||||
if (buflen > 0 &&
|
if (len > 0 && fread(adr, 1, len, fp) != len) { // fichier endommagé ?
|
||||||
fread(adr, 1, buflen, fp) != buflen) { // fichier endommagé ?
|
|
||||||
freet(adr);
|
freet(adr);
|
||||||
adr = NULL;
|
adr = NULL;
|
||||||
} else
|
} else
|
||||||
*(adr + buflen) = '\0';
|
*(adr + len) = '\0';
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
@@ -1273,21 +1269,19 @@ char *readfile2(const char *fil, LLint * size) {
|
|||||||
char *readfile_utf8(const char *fil) {
|
char *readfile_utf8(const char *fil) {
|
||||||
char *adr = NULL;
|
char *adr = NULL;
|
||||||
char catbuff[CATBUFF_SIZE];
|
char catbuff[CATBUFF_SIZE];
|
||||||
const LLint len = fsize_utf8(fil);
|
const off_t len = fsize_utf8(fil);
|
||||||
const size_t buflen = len >= 0 ? llint_to_size_t(len) : (size_t) -1;
|
|
||||||
|
|
||||||
if (buflen != (size_t) -1) { // exists, and is addressable (see readfile2)
|
if (len >= 0) { // exists
|
||||||
FILE *const fp = FOPEN(fconv(catbuff, sizeof(catbuff), fil), "rb");
|
FILE *const fp = FOPEN(fconv(catbuff, sizeof(catbuff), fil), "rb");
|
||||||
|
|
||||||
if (fp != NULL) { // n'existe pas (!)
|
if (fp != NULL) { // n'existe pas (!)
|
||||||
adr = (char *) malloct(buflen + 1);
|
adr = (char *) malloct(len + 1);
|
||||||
if (adr != NULL) {
|
if (adr != NULL) {
|
||||||
if (buflen > 0 &&
|
if (len > 0 && fread(adr, 1, len, fp) != len) { // fichier endommagé ?
|
||||||
fread(adr, 1, buflen, fp) != buflen) { // fichier endommagé ?
|
|
||||||
freet(adr);
|
freet(adr);
|
||||||
adr = NULL;
|
adr = NULL;
|
||||||
} else {
|
} else {
|
||||||
adr[buflen] = '\0';
|
adr[len] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|||||||
@@ -232,10 +232,11 @@ static int disk_fallback_selftest(httrackp *opt) {
|
|||||||
static const char body[] = "BINARY-on-disk-body-0123456789-no-trailing-nul";
|
static const char body[] = "BINARY-on-disk-body-0123456789-no-trailing-nul";
|
||||||
const size_t body_len = sizeof(body) - 1;
|
const size_t body_len = sizeof(body) - 1;
|
||||||
|
|
||||||
/* a DOS-ified X-Save loses the path_html_utf8 prefix the reader matches on,
|
/* X-Save must start with path_html_utf8 so the reader resolves it verbatim
|
||||||
and gets re-rooted as a pre-3.40 relative path; fconv() only on access */
|
(otherwise it re-roots it as a pre-3.40 relative path); then the body we
|
||||||
concat(save, sizeof(save), StringBuff(opt->path_html_utf8),
|
create at fconv(save) is exactly where cache_readex looks for it. */
|
||||||
"example.com/blob.bin");
|
fconcat(save, sizeof(save), StringBuff(opt->path_html_utf8),
|
||||||
|
"example.com/blob.bin");
|
||||||
|
|
||||||
/* write only the header (X-In-Cache: 0); the body stays on disk */
|
/* write only the header (X-In-Cache: 0); the body stays on disk */
|
||||||
selftest_open_for_write(&cache, opt);
|
selftest_open_for_write(&cache, opt);
|
||||||
@@ -938,9 +939,9 @@ static void reconcile_put(httrackp *opt, const char *name, size_t size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Expect `name` to weigh `size` bytes, or be absent when size == -1. */
|
/* Expect `name` to weigh `size` bytes, or be absent when size == -1. */
|
||||||
static int reconcile_expect(httrackp *opt, const char *name, LLint size,
|
static int reconcile_expect(httrackp *opt, const char *name, off_t size,
|
||||||
const char *what) {
|
const char *what) {
|
||||||
const LLint got = fsize(reconcile_st_path(opt, name));
|
const off_t got = fsize(reconcile_st_path(opt, name));
|
||||||
|
|
||||||
if (got != size) {
|
if (got != size) {
|
||||||
fprintf(stderr, "cache-reconcile: %s: %s is %d bytes, expected %d\n", what,
|
fprintf(stderr, "cache-reconcile: %s: %s is %d bytes, expected %d\n", what,
|
||||||
@@ -954,7 +955,7 @@ int cache_reconcile_selftest(httrackp *opt, const char *dir) {
|
|||||||
int failures = 0;
|
int failures = 0;
|
||||||
|
|
||||||
/* around the interrupted-run thresholds (new < 32768, old > 65536) */
|
/* around the interrupted-run thresholds (new < 32768, old > 65536) */
|
||||||
static const LLint TINY = 1024, MID = 40000, SOLID = 131072;
|
static const off_t TINY = 1024, MID = 40000, SOLID = 131072;
|
||||||
|
|
||||||
golden_setup(opt, dir);
|
golden_setup(opt, dir);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -1252,9 +1253,8 @@ static void corrupt_build_disk(httrackp *opt) {
|
|||||||
memset(corrupt_body_a, 'a', sizeof(corrupt_body_a) - 1);
|
memset(corrupt_body_a, 'a', sizeof(corrupt_body_a) - 1);
|
||||||
remove(reconcile_st_path(opt, "hts-cache/new.zip"));
|
remove(reconcile_st_path(opt, "hts-cache/new.zip"));
|
||||||
remove(reconcile_st_path(opt, "hts-cache/old.zip"));
|
remove(reconcile_st_path(opt, "hts-cache/old.zip"));
|
||||||
/* X-Save stored verbatim: see disk_fallback_selftest */
|
fconcat(save, sizeof(save), StringBuff(opt->path_html_utf8),
|
||||||
concat(save, sizeof(save), StringBuff(opt->path_html_utf8),
|
CORRUPT_ADR "/victim.bin");
|
||||||
CORRUPT_ADR "/victim.bin");
|
|
||||||
selftest_open_for_write(&cache, opt);
|
selftest_open_for_write(&cache, opt);
|
||||||
store_entry(opt, &cache, CORRUPT_ADR, "/canary.html", "canary.html", 200,
|
store_entry(opt, &cache, CORRUPT_ADR, "/canary.html", "canary.html", 200,
|
||||||
"OK", "text/html", "utf-8", "", "", "", "", corrupt_body_a,
|
"OK", "text/html", "utf-8", "", "", "", "", corrupt_body_a,
|
||||||
|
|||||||
257
src/htscharset.c
257
src/htscharset.c
@@ -31,9 +31,6 @@ Please visit our Website: http://www.httrack.com
|
|||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
#include "htscharset.h"
|
#include "htscharset.h"
|
||||||
#ifdef _WIN32
|
|
||||||
#include <shellapi.h>
|
|
||||||
#endif
|
|
||||||
#include "htsbase.h"
|
#include "htsbase.h"
|
||||||
#include "punycode.h"
|
#include "punycode.h"
|
||||||
#include "htssafe.h"
|
#include "htssafe.h"
|
||||||
@@ -87,7 +84,7 @@ static int hts_equalsAlphanum(const char *a, const char *b) {
|
|||||||
|
|
||||||
/* Copy the memory region [s .. s + size - 1 ] as a \0-terminated string. */
|
/* Copy the memory region [s .. s + size - 1 ] as a \0-terminated string. */
|
||||||
static char *hts_stringMemCopy(const char *s, size_t size) {
|
static char *hts_stringMemCopy(const char *s, size_t size) {
|
||||||
char *dest = malloct(size + 1);
|
char *dest = malloc(size + 1);
|
||||||
|
|
||||||
if (dest != NULL) {
|
if (dest != NULL) {
|
||||||
memcpy(dest, s, size);
|
memcpy(dest, s, size);
|
||||||
@@ -385,44 +382,10 @@ char *hts_convertStringFromUTF8(const char *s, size_t size, const char *charset)
|
|||||||
return hts_convertStringCPFromUTF8(s, size, cp);
|
return hts_convertStringCPFromUTF8(s, size, cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
HTSEXT_API char *hts_convertStringSystemToUTF8(const char *s, size_t size) {
|
char *hts_convertStringSystemToUTF8(const char *s, size_t size) {
|
||||||
return hts_convertStringCPToUTF8(s, size, GetACP());
|
return hts_convertStringCPToUTF8(s, size, GetACP());
|
||||||
}
|
}
|
||||||
|
|
||||||
HTSEXT_API void hts_argv_utf8(int *pargc, char ***pargv) {
|
|
||||||
int wargc = 0;
|
|
||||||
LPWSTR *const wargv = CommandLineToArgvW(GetCommandLineW(), &wargc);
|
|
||||||
char **argv;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// On any failure keep the CRT's ANSI argv: lossy, but never half-converted.
|
|
||||||
if (wargv == NULL)
|
|
||||||
return;
|
|
||||||
if (wargc <= 0 ||
|
|
||||||
(argv = calloct((size_t) wargc + 1, sizeof(char *))) == NULL) {
|
|
||||||
LocalFree(wargv);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (i = 0; i < wargc; i++) {
|
|
||||||
const int wsize = (int) wcslen(wargv[i]);
|
|
||||||
|
|
||||||
// hts_convertUCS2StringToUTF8() returns NULL on an empty string
|
|
||||||
argv[i] =
|
|
||||||
wsize != 0 ? hts_convertUCS2StringToUTF8(wargv[i], wsize) : strdupt("");
|
|
||||||
if (argv[i] == NULL) {
|
|
||||||
while (i-- != 0)
|
|
||||||
freet(argv[i]);
|
|
||||||
freet(argv);
|
|
||||||
LocalFree(wargv);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
argv[wargc] = NULL; // callers may rely on argv[argc] == NULL
|
|
||||||
LocalFree(wargv);
|
|
||||||
*pargc = wargc;
|
|
||||||
*pargv = argv; // never freed: argv lives for the process
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@@ -586,6 +549,42 @@ char *hts_convertStringFromUTF8(const char *s, size_t size, const char *charset)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
HTS_STATIC char *hts_getCharsetFromContentType(const char *mime) {
|
||||||
|
/* text/html; charset=utf-8 */
|
||||||
|
const char *const charset = "charset";
|
||||||
|
char *pos = strstr(mime, charset);
|
||||||
|
|
||||||
|
if (pos != NULL) {
|
||||||
|
/* Skip spaces */
|
||||||
|
int eq = 0;
|
||||||
|
|
||||||
|
for(pos += strlen(charset);
|
||||||
|
*pos == ' ' || *pos == '=' || *pos == '"' || *pos == '\''; pos++) {
|
||||||
|
if (*pos == '=') {
|
||||||
|
eq = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (eq == 1) {
|
||||||
|
int len;
|
||||||
|
|
||||||
|
for(len = 0;
|
||||||
|
pos[len] == ' ' || pos[len] == ';' || pos[len] == '"' || *pos == '\'';
|
||||||
|
pos++) ;
|
||||||
|
if (len != 0) {
|
||||||
|
char *const s = malloc(len + 1);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < len; i++) {
|
||||||
|
s[i] = pos[i];
|
||||||
|
}
|
||||||
|
s[len] = '\0';
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define strcasecmp(a,b) stricmp(a,b)
|
#define strcasecmp(a,b) stricmp(a,b)
|
||||||
#define strncasecmp(a,b,n) strnicmp(a,b,n)
|
#define strncasecmp(a,b,n) strnicmp(a,b,n)
|
||||||
@@ -645,106 +644,58 @@ int hts_isCharsetUTF8(const char *charset) {
|
|||||||
|| strcasecmp(charset, "utf8") == 0 );
|
|| strcasecmp(charset, "utf8") == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Extract X from a "text/html; charset=X" content= attribute value. */
|
|
||||||
static char *charset_from_content(const char *s, size_t len) {
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i + 7 < len; i++) {
|
|
||||||
if ((i == 0 || is_space(s[i - 1]) || s[i - 1] == ';') &&
|
|
||||||
strncasecmp(&s[i], "charset", 7) == 0 && is_space_or_equal(s[i + 7])) {
|
|
||||||
size_t j, val;
|
|
||||||
|
|
||||||
for (j = i + 7; j < len && is_space_or_equal_or_quote(s[j]); j++)
|
|
||||||
;
|
|
||||||
for (val = j; j < len && s[j] != '"' && s[j] != '\'' && s[j] != ';' &&
|
|
||||||
!is_space(s[j]);
|
|
||||||
j++)
|
|
||||||
;
|
|
||||||
if (j != val) {
|
|
||||||
return hts_stringMemCopy(&s[val], j - val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *hts_getCharsetFromMeta(const char *html, size_t size) {
|
char *hts_getCharsetFromMeta(const char *html, size_t size) {
|
||||||
size_t i;
|
int i;
|
||||||
|
|
||||||
/* HTML5 <meta charset=X> or legacy
|
/* <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8" > */
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=X">,
|
for(i = 0; i < size; i++) {
|
||||||
attributes in any order; first resolvable tag wins. */
|
if (html[i] == '<' && strncasecmp(&html[i + 1], "meta", 4) == 0
|
||||||
for (i = 0; i + 6 < size; i++) {
|
&& is_space(html[i + 5])) {
|
||||||
size_t j;
|
/* Skip spaces */
|
||||||
const char *equiv = NULL, *content = NULL;
|
for(i += 5; is_space(html[i]); i++) ;
|
||||||
size_t equiv_len = 0, content_len = 0;
|
if (strncasecmp(&html[i], "HTTP-EQUIV", 10) == 0
|
||||||
|
&& is_space_or_equal(html[i + 10])) {
|
||||||
|
for(i += 10; is_space_or_equal_or_quote(html[i]); i++) ;
|
||||||
|
if (strncasecmp(&html[i], "CONTENT-TYPE", 12) == 0) {
|
||||||
|
for(i += 12; is_space_or_equal_or_quote(html[i]); i++) ;
|
||||||
|
if (strncasecmp(&html[i], "CONTENT", 7) == 0
|
||||||
|
&& is_space_or_equal(html[i + 7])) {
|
||||||
|
for(i += 7; is_space_or_equal_or_quote(html[i]); i++) ;
|
||||||
|
/* Skip content-type */
|
||||||
|
for(;
|
||||||
|
i < size && html[i] != ';' && html[i] != '"' && html[i] != '\'';
|
||||||
|
i++) ;
|
||||||
|
/* Expect charset attribute here */
|
||||||
|
if (html[i] == ';') {
|
||||||
|
for(i++; is_space(html[i]); i++) ;
|
||||||
|
/* Look for charset */
|
||||||
|
if (strncasecmp(&html[i], "charset", 7) == 0
|
||||||
|
&& is_space_or_equal(html[i + 7])) {
|
||||||
|
int len;
|
||||||
|
|
||||||
if (html[i] != '<' || strncasecmp(&html[i + 1], "meta", 4) != 0 ||
|
for(i += 7; is_space_or_equal(html[i]) || html[i] == '\'';
|
||||||
!is_space(html[i + 5])) {
|
i++) ;
|
||||||
continue;
|
/* Charset */
|
||||||
}
|
for(len = 0;
|
||||||
/* Attribute scan, strictly bounded by size. */
|
i + len < size && html[i + len] != '"'
|
||||||
for (j = i + 6; j < size && html[j] != '>';) {
|
&& html[i + len] != '\'' && html[i + len] != ' '; len++) ;
|
||||||
size_t name, name_len, val = 0, val_len = 0;
|
/* No error ? */
|
||||||
|
if (len != 0 && i < size) {
|
||||||
|
char *const s = malloc(len + 1);
|
||||||
|
int j;
|
||||||
|
|
||||||
if (is_space(html[j]) || html[j] == '/') {
|
for(j = 0; j < len; j++) {
|
||||||
j++;
|
s[j] = html[i + j];
|
||||||
continue;
|
}
|
||||||
}
|
s[len] = '\0';
|
||||||
for (name = j; j < size && html[j] != '=' && html[j] != '>' &&
|
return s;
|
||||||
html[j] != '/' && !is_space(html[j]);
|
}
|
||||||
j++)
|
}
|
||||||
;
|
}
|
||||||
name_len = j - name;
|
|
||||||
for (; j < size && is_space(html[j]); j++)
|
|
||||||
;
|
|
||||||
if (j < size && html[j] == '=') {
|
|
||||||
for (j++; j < size && is_space(html[j]); j++)
|
|
||||||
;
|
|
||||||
if (j < size && (html[j] == '"' || html[j] == '\'')) {
|
|
||||||
const char quote = html[j++];
|
|
||||||
|
|
||||||
for (val = j; j < size && html[j] != quote; j++)
|
|
||||||
;
|
|
||||||
if (j >= size) /* unterminated quote: drop the tag */
|
|
||||||
break;
|
|
||||||
val_len = j++ - val;
|
|
||||||
} else {
|
|
||||||
/* unquoted: ends at whitespace or '>' only (HTML5 prescan); '/'
|
|
||||||
belongs to the value except as the tail of a self-close */
|
|
||||||
for (val = j; j < size && !is_space(html[j]) && html[j] != '>'; j++)
|
|
||||||
;
|
|
||||||
val_len = j - val;
|
|
||||||
if (val_len != 0 && j < size && html[j] == '>' &&
|
|
||||||
html[val + val_len - 1] == '/') {
|
|
||||||
val_len--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* first occurrence of each attribute wins, as in browsers */
|
|
||||||
if (val_len != 0) {
|
|
||||||
if (name_len == 7 && strncasecmp(&html[name], "charset", 7) == 0) {
|
|
||||||
return hts_stringMemCopy(&html[val], val_len);
|
|
||||||
} else if (equiv == NULL && name_len == 10 &&
|
|
||||||
strncasecmp(&html[name], "http-equiv", 10) == 0) {
|
|
||||||
equiv = &html[val];
|
|
||||||
equiv_len = val_len;
|
|
||||||
} else if (content == NULL && name_len == 7 &&
|
|
||||||
strncasecmp(&html[name], "content", 7) == 0) {
|
|
||||||
content = &html[val];
|
|
||||||
content_len = val_len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (equiv_len == 12 && strncasecmp(equiv, "content-type", 12) == 0 &&
|
|
||||||
content != NULL) {
|
|
||||||
char *const s = charset_from_content(content, content_len);
|
|
||||||
|
|
||||||
if (s != NULL) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = j;
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -1189,45 +1140,17 @@ int hts_isStringUTF8(const char *s, size_t size) {
|
|||||||
const unsigned char *const data = (const unsigned char*) s;
|
const unsigned char *const data = (const unsigned char*) s;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
/* Strict RFC 3629: reject overlongs, surrogates, > U+10FFFF, 5/6-byte. */
|
|
||||||
for(i = 0 ; i < size ; ) {
|
for(i = 0 ; i < size ; ) {
|
||||||
const unsigned char c = data[i];
|
/* Reader: can read bytes up to j */
|
||||||
size_t len, k;
|
#define RD ( i < size ? data[i++] : -1 )
|
||||||
hts_UCS4 uc, min;
|
|
||||||
|
|
||||||
if (c < 0x80) {
|
/* Writer: a malformed sequence means the string is not UTF-8 (return 0) */
|
||||||
i++;
|
#define WR(C) if ((C) == -1) { return 0; }
|
||||||
continue;
|
|
||||||
} else if (c >= 0xc2 && c <= 0xdf) {
|
|
||||||
len = 2;
|
|
||||||
min = 0x80;
|
|
||||||
uc = c & 0x1f;
|
|
||||||
} else if (c >= 0xe0 && c <= 0xef) {
|
|
||||||
len = 3;
|
|
||||||
min = 0x800;
|
|
||||||
uc = c & 0x0f;
|
|
||||||
} else if (c >= 0xf0 && c <= 0xf4) {
|
|
||||||
len = 4;
|
|
||||||
min = 0x10000;
|
|
||||||
uc = c & 0x07;
|
|
||||||
} else { /* continuation byte, overlong C0/C1, or F5..FF lead */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (size - i < len) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
for (k = 1; k < len; k++) {
|
|
||||||
const unsigned char cc = data[i + k];
|
|
||||||
|
|
||||||
if ((cc & 0xc0) != 0x80) {
|
/* Read Unicode character. */
|
||||||
return 0;
|
READ_UNICODE(RD, WR);
|
||||||
}
|
#undef RD
|
||||||
uc = (uc << 6) | (cc & 0x3f);
|
#undef WR
|
||||||
}
|
|
||||||
if (uc < min || uc > 0x10FFFF || (uc >= 0xD800 && uc <= 0xDFFF)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
i += len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ Please visit our Website: http://www.httrack.com
|
|||||||
#define HTS_CHARSET_DEFH
|
#define HTS_CHARSET_DEFH
|
||||||
|
|
||||||
/** Standard includes. **/
|
/** Standard includes. **/
|
||||||
#include "htsglobal.h"
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -77,8 +76,7 @@ extern char *hts_convertStringIDNAToUTF8(const char *s, size_t size);
|
|||||||
extern int hts_isStringIDNA(const char *s, size_t size);
|
extern int hts_isStringIDNA(const char *s, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract the <meta> charset from the HTML buffer "html" (HTML5 charset= or
|
* Extract the charset from the HTML buffer "html"
|
||||||
* legacy http-equiv form). Returns a malloc'ed string, or NULL if none.
|
|
||||||
**/
|
**/
|
||||||
extern char *hts_getCharsetFromMeta(const char *html, size_t size);
|
extern char *hts_getCharsetFromMeta(const char *html, size_t size);
|
||||||
|
|
||||||
@@ -88,8 +86,7 @@ extern char *hts_getCharsetFromMeta(const char *html, size_t size);
|
|||||||
extern int hts_isStringAscii(const char *s, size_t size);
|
extern int hts_isStringAscii(const char *s, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the given string valid UTF-8 ? Strict RFC 3629: overlong forms,
|
* Is the given string an UTF-8 string ?
|
||||||
* surrogates, codepoints above U+10FFFF and 5/6-byte sequences are rejected.
|
|
||||||
**/
|
**/
|
||||||
extern int hts_isStringUTF8(const char *s, size_t size);
|
extern int hts_isStringUTF8(const char *s, size_t size);
|
||||||
|
|
||||||
@@ -175,16 +172,7 @@ extern char *hts_convertUCS2StringToUTF8(LPWSTR woutput, int wsize);
|
|||||||
* Convert current system codepage to UTF-8.
|
* Convert current system codepage to UTF-8.
|
||||||
* This function is WIN32 specific.
|
* This function is WIN32 specific.
|
||||||
**/
|
**/
|
||||||
HTSEXT_API char *hts_convertStringSystemToUTF8(const char *s, size_t size);
|
extern char *hts_convertStringSystemToUTF8(const char *s, size_t size);
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace the CRT's ANSI argv by a UTF-8 one decoded from the real UTF-16
|
|
||||||
* command line: every char* is UTF-8 on Windows (FOPEN, STAT, ... convert at
|
|
||||||
* the syscall boundary). Keeps the CRT's argv on failure; the new array is
|
|
||||||
* writable, NULL-terminated, and lives for the process.
|
|
||||||
* This function is WIN32 specific.
|
|
||||||
**/
|
|
||||||
HTSEXT_API void hts_argv_utf8(int *pargc, char ***pargv);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
366
src/htscodec.c
366
src/htscodec.c
@@ -1,366 +0,0 @@
|
|||||||
/* ------------------------------------------------------------ */
|
|
||||||
/*
|
|
||||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
|
||||||
Copyright (C) 2026 Xavier Roche and other contributors
|
|
||||||
|
|
||||||
SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Ethical use: we kindly ask that you NOT use this software to harvest email
|
|
||||||
addresses or to collect any other private information about people. Doing so
|
|
||||||
would dishonor our work and waste the many hours we have spent on it.
|
|
||||||
|
|
||||||
Please visit our Website: http://www.httrack.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/* File: HTTP content codings (gzip/deflate, brotli, zstd) */
|
|
||||||
/* Author: Xavier Roche */
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
|
|
||||||
/* Internal engine bytecode */
|
|
||||||
#define HTS_INTERNAL_BYTECODE
|
|
||||||
|
|
||||||
#include "htsbase.h"
|
|
||||||
#include "htscore.h"
|
|
||||||
#include "htscodec.h"
|
|
||||||
#include "htszlib.h"
|
|
||||||
|
|
||||||
#if HTS_USEBROTLI
|
|
||||||
#include <brotli/decode.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HTS_USEZSTD
|
|
||||||
#include <zstd.h>
|
|
||||||
/* 8 MB, the window an HTTP zstd decoder must honor (RFC 9659); libzstd
|
|
||||||
defaults to 128 MB. */
|
|
||||||
#define HTS_ZSTD_WINDOWLOG_MAX 23
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Decoded-size budget, bounding a bomb: brotli and zstd reach a million to one.
|
|
||||||
Deflate cannot pass 1032x, so it only meets this at the 2 GiB ceiling. */
|
|
||||||
#define HTS_CODEC_MAX_RATIO 4096
|
|
||||||
#define HTS_CODEC_MIN_MAXOUT (1024 * 1024)
|
|
||||||
|
|
||||||
LLint hts_codec_maxout(LLint in_size) {
|
|
||||||
LLint maxout;
|
|
||||||
|
|
||||||
if (in_size <= 0 || in_size > INT_MAX / HTS_CODEC_MAX_RATIO)
|
|
||||||
maxout = INT_MAX;
|
|
||||||
else
|
|
||||||
maxout = in_size * HTS_CODEC_MAX_RATIO;
|
|
||||||
if (maxout < HTS_CODEC_MIN_MAXOUT)
|
|
||||||
maxout = HTS_CODEC_MIN_MAXOUT;
|
|
||||||
return maxout;
|
|
||||||
}
|
|
||||||
|
|
||||||
hts_codec hts_codec_parse(const char *encoding) {
|
|
||||||
if (encoding == NULL || encoding[0] == '\0' ||
|
|
||||||
strfield2(encoding, "identity"))
|
|
||||||
return HTS_CODEC_IDENTITY;
|
|
||||||
if (strfield2(encoding, "gzip") || strfield2(encoding, "x-gzip") ||
|
|
||||||
strfield2(encoding, "deflate") || strfield2(encoding, "x-deflate"))
|
|
||||||
return HTS_USEZLIB ? HTS_CODEC_DEFLATE : HTS_CODEC_UNSUPPORTED;
|
|
||||||
if (strfield2(encoding, "br"))
|
|
||||||
return HTS_USEBROTLI ? HTS_CODEC_BROTLI : HTS_CODEC_UNSUPPORTED;
|
|
||||||
if (strfield2(encoding, "zstd"))
|
|
||||||
return HTS_USEZSTD ? HTS_CODEC_ZSTD : HTS_CODEC_UNSUPPORTED;
|
|
||||||
if (strfield2(encoding, "compress") || strfield2(encoding, "x-compress"))
|
|
||||||
return HTS_CODEC_UNSUPPORTED; /* LZW: never advertised, no decoder here */
|
|
||||||
/* Not a coding at all: broken servers put charsets and the like here, and
|
|
||||||
the plain body they sent must survive it. */
|
|
||||||
return HTS_CODEC_IDENTITY;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HTS_USEBROTLI
|
|
||||||
#define HTS_AE_BROTLI ", br"
|
|
||||||
#else
|
|
||||||
#define HTS_AE_BROTLI ""
|
|
||||||
#endif
|
|
||||||
#if HTS_USEZSTD
|
|
||||||
#define HTS_AE_ZSTD ", zstd"
|
|
||||||
#else
|
|
||||||
#define HTS_AE_ZSTD ""
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char *hts_acceptencoding(hts_boolean compressible, hts_boolean secure) {
|
|
||||||
if (!compressible)
|
|
||||||
return "identity";
|
|
||||||
#if HTS_USEZLIB
|
|
||||||
/* br and zstd over TLS only, as browsers do: a cleartext intermediary that
|
|
||||||
rewrites a coding it can not read would corrupt the mirror. */
|
|
||||||
if (secure)
|
|
||||||
return "gzip, deflate" HTS_AE_BROTLI HTS_AE_ZSTD ", identity;q=0.9";
|
|
||||||
return "gzip, deflate, identity;q=0.9";
|
|
||||||
#else
|
|
||||||
(void) secure;
|
|
||||||
return "identity";
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
hts_boolean hts_codec_is_archive_ext(hts_codec codec, const char *ext) {
|
|
||||||
if (ext == NULL || ext[0] == '\0')
|
|
||||||
return HTS_FALSE;
|
|
||||||
switch (codec) {
|
|
||||||
case HTS_CODEC_DEFLATE:
|
|
||||||
return strfield2(ext, "gz") || strfield2(ext, "tgz") ? HTS_TRUE : HTS_FALSE;
|
|
||||||
case HTS_CODEC_BROTLI:
|
|
||||||
return strfield2(ext, "br") ? HTS_TRUE : HTS_FALSE;
|
|
||||||
case HTS_CODEC_ZSTD:
|
|
||||||
return strfield2(ext, "zst") || strfield2(ext, "tzst") ? HTS_TRUE
|
|
||||||
: HTS_FALSE;
|
|
||||||
default:
|
|
||||||
return HTS_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HTS_USEBROTLI || HTS_USEZSTD
|
|
||||||
/* Append produced bytes to out under the decoded-size budget, advancing *total.
|
|
||||||
HTS_FALSE on a short write or once the budget is exceeded (a bomb); the
|
|
||||||
over-budget bytes are never written. */
|
|
||||||
static hts_boolean codec_sink(FILE *out, const void *buf, size_t produced,
|
|
||||||
LLint *total, LLint maxout) {
|
|
||||||
if (produced == 0)
|
|
||||||
return HTS_TRUE;
|
|
||||||
*total += (LLint) produced;
|
|
||||||
if (*total > maxout)
|
|
||||||
return HTS_FALSE;
|
|
||||||
return fwrite(buf, 1, produced, out) == produced ? HTS_TRUE : HTS_FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HTS_USEBROTLI
|
|
||||||
static int codec_unpack_brotli(FILE *in, FILE *out, LLint maxout) {
|
|
||||||
BrotliDecoderState *const state =
|
|
||||||
BrotliDecoderCreateInstance(NULL, NULL, NULL);
|
|
||||||
hts_boolean ok = HTS_TRUE, done = HTS_FALSE;
|
|
||||||
LLint total = 0;
|
|
||||||
|
|
||||||
if (state == NULL)
|
|
||||||
return -1;
|
|
||||||
while (ok && !done) {
|
|
||||||
unsigned char BIGSTK inbuf[8192];
|
|
||||||
size_t avail_in = fread(inbuf, 1, sizeof(inbuf), in);
|
|
||||||
const uint8_t *next_in = inbuf;
|
|
||||||
|
|
||||||
if (avail_in == 0)
|
|
||||||
break; /* EOF; a stream still hungry for input is truncated */
|
|
||||||
for (;;) {
|
|
||||||
unsigned char BIGSTK outbuf[8192];
|
|
||||||
uint8_t *next_out = outbuf;
|
|
||||||
size_t avail_out = sizeof(outbuf);
|
|
||||||
size_t produced;
|
|
||||||
BrotliDecoderResult res;
|
|
||||||
|
|
||||||
res = BrotliDecoderDecompressStream(state, &avail_in, &next_in,
|
|
||||||
&avail_out, &next_out, NULL);
|
|
||||||
produced = sizeof(outbuf) - avail_out;
|
|
||||||
if (!codec_sink(out, outbuf, produced, &total, maxout)) {
|
|
||||||
ok = HTS_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (res == BROTLI_DECODER_RESULT_ERROR) {
|
|
||||||
ok = HTS_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (res == BROTLI_DECODER_RESULT_SUCCESS) {
|
|
||||||
done = HTS_TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (res == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ferror(in))
|
|
||||||
ok = HTS_FALSE;
|
|
||||||
}
|
|
||||||
BrotliDecoderDestroyInstance(state);
|
|
||||||
return (ok && done && !ferror(in)) ? (int) total : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t codec_head_brotli(const void *in, size_t in_len, void *out,
|
|
||||||
size_t out_len) {
|
|
||||||
BrotliDecoderState *const state =
|
|
||||||
BrotliDecoderCreateInstance(NULL, NULL, NULL);
|
|
||||||
const uint8_t *next_in = (const uint8_t *) in;
|
|
||||||
uint8_t *next_out = (uint8_t *) out;
|
|
||||||
size_t avail_in = in_len, avail_out = out_len;
|
|
||||||
BrotliDecoderResult res;
|
|
||||||
|
|
||||||
if (state == NULL)
|
|
||||||
return 0;
|
|
||||||
res = BrotliDecoderDecompressStream(state, &avail_in, &next_in, &avail_out,
|
|
||||||
&next_out, NULL);
|
|
||||||
BrotliDecoderDestroyInstance(state);
|
|
||||||
return (res != BROTLI_DECODER_RESULT_ERROR) ? out_len - avail_out : 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HTS_USEZSTD
|
|
||||||
static int codec_unpack_zstd(FILE *in, FILE *out, LLint maxout) {
|
|
||||||
ZSTD_DStream *const zds = ZSTD_createDStream();
|
|
||||||
hts_boolean ok = HTS_TRUE, eof = HTS_FALSE;
|
|
||||||
size_t zret = 1; /* 0 once a frame is fully flushed */
|
|
||||||
LLint total = 0;
|
|
||||||
|
|
||||||
if (zds == NULL)
|
|
||||||
return -1;
|
|
||||||
if (ZSTD_isError(ZSTD_DCtx_setParameter(zds, ZSTD_d_windowLogMax,
|
|
||||||
HTS_ZSTD_WINDOWLOG_MAX))) {
|
|
||||||
ZSTD_freeDStream(zds);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
while (ok && !eof) {
|
|
||||||
unsigned char BIGSTK inbuf[8192];
|
|
||||||
ZSTD_inBuffer input;
|
|
||||||
|
|
||||||
input.src = inbuf;
|
|
||||||
input.size = fread(inbuf, 1, sizeof(inbuf), in);
|
|
||||||
input.pos = 0;
|
|
||||||
if (input.size == 0) {
|
|
||||||
eof = HTS_TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (input.pos < input.size) {
|
|
||||||
unsigned char BIGSTK outbuf[8192];
|
|
||||||
ZSTD_outBuffer output;
|
|
||||||
|
|
||||||
output.dst = outbuf;
|
|
||||||
output.size = sizeof(outbuf);
|
|
||||||
output.pos = 0;
|
|
||||||
zret = ZSTD_decompressStream(zds, &output, &input);
|
|
||||||
if (ZSTD_isError(zret)) {
|
|
||||||
ok = HTS_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!codec_sink(out, outbuf, output.pos, &total, maxout)) {
|
|
||||||
ok = HTS_FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ferror(in))
|
|
||||||
ok = HTS_FALSE;
|
|
||||||
}
|
|
||||||
ZSTD_freeDStream(zds);
|
|
||||||
/* zret != 0 at EOF: the last frame never completed */
|
|
||||||
return (ok && zret == 0 && !ferror(in)) ? (int) total : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t codec_head_zstd(const void *in, size_t in_len, void *out,
|
|
||||||
size_t out_len) {
|
|
||||||
ZSTD_DStream *const zds = ZSTD_createDStream();
|
|
||||||
ZSTD_inBuffer input;
|
|
||||||
ZSTD_outBuffer output;
|
|
||||||
size_t zret;
|
|
||||||
|
|
||||||
if (zds == NULL)
|
|
||||||
return 0;
|
|
||||||
if (ZSTD_isError(ZSTD_DCtx_setParameter(zds, ZSTD_d_windowLogMax,
|
|
||||||
HTS_ZSTD_WINDOWLOG_MAX))) {
|
|
||||||
ZSTD_freeDStream(zds);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
input.src = in;
|
|
||||||
input.size = in_len;
|
|
||||||
input.pos = 0;
|
|
||||||
output.dst = out;
|
|
||||||
output.size = out_len;
|
|
||||||
output.pos = 0;
|
|
||||||
zret = ZSTD_decompressStream(zds, &output, &input);
|
|
||||||
ZSTD_freeDStream(zds);
|
|
||||||
return ZSTD_isError(zret) ? 0 : output.pos;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LLint hts_codec_coded_size(FILE *in) {
|
|
||||||
long size;
|
|
||||||
|
|
||||||
if (fseek(in, 0, SEEK_END) != 0)
|
|
||||||
return -1;
|
|
||||||
size = ftell(in);
|
|
||||||
if (size < 0 || fseek(in, 0, SEEK_SET) != 0)
|
|
||||||
return -1;
|
|
||||||
return (LLint) size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int hts_codec_unpack(hts_codec codec, const char *filename,
|
|
||||||
const char *newfile) {
|
|
||||||
if (filename == NULL || newfile == NULL || !filename[0] || !newfile[0])
|
|
||||||
return -1;
|
|
||||||
switch (codec) {
|
|
||||||
case HTS_CODEC_DEFLATE:
|
|
||||||
#if HTS_USEZLIB
|
|
||||||
return hts_zunpack(filename, newfile);
|
|
||||||
#else
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
case HTS_CODEC_BROTLI:
|
|
||||||
case HTS_CODEC_ZSTD:
|
|
||||||
break;
|
|
||||||
default: /* IDENTITY never reaches the unpacker; UNSUPPORTED must fail */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#if HTS_USEBROTLI || HTS_USEZSTD
|
|
||||||
{
|
|
||||||
char catbuff[CATBUFF_SIZE];
|
|
||||||
FILE *out, *in = FOPEN(fconv(catbuff, sizeof(catbuff), filename), "rb");
|
|
||||||
LLint maxout;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
if (in == NULL)
|
|
||||||
return -1;
|
|
||||||
maxout = hts_codec_maxout(hts_codec_coded_size(in));
|
|
||||||
out = FOPEN(fconv(catbuff, sizeof(catbuff), newfile), "wb");
|
|
||||||
if (out == NULL) {
|
|
||||||
fclose(in);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#if HTS_USEBROTLI
|
|
||||||
if (codec == HTS_CODEC_BROTLI)
|
|
||||||
ret = codec_unpack_brotli(in, out, maxout);
|
|
||||||
#endif
|
|
||||||
#if HTS_USEZSTD
|
|
||||||
if (codec == HTS_CODEC_ZSTD)
|
|
||||||
ret = codec_unpack_zstd(in, out, maxout);
|
|
||||||
#endif
|
|
||||||
fclose(out);
|
|
||||||
fclose(in);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t hts_codec_head(hts_codec codec, const void *in, size_t in_len, void *out,
|
|
||||||
size_t out_len) {
|
|
||||||
if (in == NULL || in_len == 0 || out == NULL || out_len == 0)
|
|
||||||
return 0;
|
|
||||||
switch (codec) {
|
|
||||||
#if HTS_USEZLIB
|
|
||||||
case HTS_CODEC_DEFLATE:
|
|
||||||
return hts_zhead(in, in_len, out, out_len);
|
|
||||||
#endif
|
|
||||||
#if HTS_USEBROTLI
|
|
||||||
case HTS_CODEC_BROTLI:
|
|
||||||
return codec_head_brotli(in, in_len, out, out_len);
|
|
||||||
#endif
|
|
||||||
#if HTS_USEZSTD
|
|
||||||
case HTS_CODEC_ZSTD:
|
|
||||||
return codec_head_zstd(in, in_len, out, out_len);
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
/* ------------------------------------------------------------ */
|
|
||||||
/*
|
|
||||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
|
||||||
Copyright (C) 2026 Xavier Roche and other contributors
|
|
||||||
|
|
||||||
SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Ethical use: we kindly ask that you NOT use this software to harvest email
|
|
||||||
addresses or to collect any other private information about people. Doing so
|
|
||||||
would dishonor our work and waste the many hours we have spent on it.
|
|
||||||
|
|
||||||
Please visit our Website: http://www.httrack.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/* File: HTTP content codings (gzip/deflate, brotli, zstd) */
|
|
||||||
/* Author: Xavier Roche */
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
|
|
||||||
#ifndef HTS_DEFCODEC
|
|
||||||
#define HTS_DEFCODEC
|
|
||||||
|
|
||||||
#include "htsglobal.h"
|
|
||||||
|
|
||||||
/* Content codings we may meet in a Content-Encoding header. */
|
|
||||||
typedef enum {
|
|
||||||
HTS_CODEC_IDENTITY = 0, /**< no coding, or a token we treat as none */
|
|
||||||
HTS_CODEC_DEFLATE, /**< gzip, x-gzip, deflate, x-deflate */
|
|
||||||
HTS_CODEC_BROTLI, /**< br */
|
|
||||||
HTS_CODEC_ZSTD, /**< zstd */
|
|
||||||
HTS_CODEC_UNSUPPORTED /**< a real coding we can not decode */
|
|
||||||
} hts_codec;
|
|
||||||
|
|
||||||
#ifdef HTS_INTERNAL_BYTECODE
|
|
||||||
|
|
||||||
/* Codec for a Content-Encoding token. A known coding we can not decode is
|
|
||||||
UNSUPPORTED; an unrecognized token is IDENTITY (servers do emit junk). */
|
|
||||||
extern hts_codec hts_codec_parse(const char *encoding);
|
|
||||||
|
|
||||||
/* Accept-Encoding value to advertise; secure (TLS) also offers br and zstd. */
|
|
||||||
extern const char *hts_acceptencoding(hts_boolean compressible,
|
|
||||||
hts_boolean secure);
|
|
||||||
|
|
||||||
/* HTS_TRUE if ext is the codec's own archive extension: a foo.gz served as
|
|
||||||
Content-Encoding: gzip stays packed on disk. */
|
|
||||||
extern hts_boolean hts_codec_is_archive_ext(hts_codec codec, const char *ext);
|
|
||||||
|
|
||||||
/* Decode filename into newfile. Returns the decoded size, or -1 on a truncated
|
|
||||||
or corrupt stream, an unsupported coding, a bomb over the budget, or I/O. */
|
|
||||||
extern int hts_codec_unpack(hts_codec codec, const char *filename,
|
|
||||||
const char *newfile);
|
|
||||||
|
|
||||||
/* Decode up to out_len leading bytes of a coded body for the MIME sniffer;
|
|
||||||
0 when nothing could be decoded. */
|
|
||||||
extern size_t hts_codec_head(hts_codec codec, const void *in, size_t in_len,
|
|
||||||
void *out, size_t out_len);
|
|
||||||
|
|
||||||
/* Ceiling on the decoded size of a body of in_size coded bytes. */
|
|
||||||
extern LLint hts_codec_maxout(LLint in_size);
|
|
||||||
|
|
||||||
/* Coded size of an open stream, left rewound; -1 if unknown. */
|
|
||||||
extern LLint hts_codec_coded_size(FILE *in);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -855,7 +855,7 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
char *filelist_buff = NULL;
|
char *filelist_buff = NULL;
|
||||||
size_t filelist_sz = 0;
|
size_t filelist_sz = 0;
|
||||||
const char *filelist_err = NULL; /* failure reason, NULL on success */
|
const char *filelist_err = NULL; /* failure reason, NULL on success */
|
||||||
const LLint fs = fsize(StringBuff(opt->filelist));
|
const off_t fs = fsize(StringBuff(opt->filelist));
|
||||||
|
|
||||||
if (fs < 0) {
|
if (fs < 0) {
|
||||||
/* fsize() hides the cause; redo stat() for a precise errno (#49) */
|
/* fsize() hides the cause; redo stat() for a precise errno (#49) */
|
||||||
@@ -863,7 +863,7 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
filelist_err = stat(StringBuff(opt->filelist), &st) != 0
|
filelist_err = stat(StringBuff(opt->filelist), &st) != 0
|
||||||
? strerror(errno)
|
? strerror(errno)
|
||||||
: "not a regular file";
|
: "not a regular file";
|
||||||
} else if ((filelist_sz = llint_to_size_t(fs)) == (size_t) -1) {
|
} else if ((filelist_sz = off_t_to_size_t(fs)) == (size_t) -1) {
|
||||||
filelist_err = "file too large";
|
filelist_err = "file too large";
|
||||||
filelist_sz = 0;
|
filelist_sz = 0;
|
||||||
} else {
|
} else {
|
||||||
@@ -1905,10 +1905,7 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ATTENTION C'EST ICI QU'ON SAUVE LE FICHIER!!
|
// ATTENTION C'EST ICI QU'ON SAUVE LE FICHIER!!
|
||||||
// An empty body must not overwrite the file when the transfer failed
|
if (r.adr != NULL || r.size == 0) {
|
||||||
// (statuscode <= 0, e.g. an -M hard-stop): it would truncate a good
|
|
||||||
// copy to 0 (#77 follow-up).
|
|
||||||
if (r.adr != NULL || (r.size == 0 && r.statuscode > 0)) {
|
|
||||||
file_notify(opt, urladr(), urlfil(), savename(), 1, 1, r.notmodified);
|
file_notify(opt, urladr(), urlfil(), savename(), 1, 1, r.notmodified);
|
||||||
if (filesave(opt, r.adr, (int) r.size, savename(), urladr(), urlfil()) !=
|
if (filesave(opt, r.adr, (int) r.size, savename(), urladr(), urlfil()) !=
|
||||||
0) {
|
0) {
|
||||||
@@ -1929,6 +1926,7 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parsing of other media types (java, ram..) */
|
/* Parsing of other media types (java, ram..) */
|
||||||
@@ -2089,9 +2087,10 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
||||||
"hts-cache/old.lst"), "rb");
|
"hts-cache/old.lst"), "rb");
|
||||||
if (old_lst) {
|
if (old_lst) {
|
||||||
const size_t sz = llint_to_size_t(
|
const size_t sz =
|
||||||
fsize(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
off_t_to_size_t(fsize(fconcat
|
||||||
StringBuff(opt->path_log), "hts-cache/new.lst")));
|
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
||||||
|
"hts-cache/new.lst")));
|
||||||
new_lst =
|
new_lst =
|
||||||
fopen(fconcat
|
fopen(fconcat
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
||||||
@@ -3874,6 +3873,7 @@ void voidf(void) {
|
|||||||
a = "| HTTrack Website Copier |" CRLF;
|
a = "| HTTrack Website Copier |" CRLF;
|
||||||
a = "|Code: Windows Interface Xavier Roche |" CRLF;
|
a = "|Code: Windows Interface Xavier Roche |" CRLF;
|
||||||
a = "| HTS/HTTrack Xavier Roche |" CRLF;
|
a = "| HTS/HTTrack Xavier Roche |" CRLF;
|
||||||
|
a = "| .class Parser Yann Philippot |" CRLF;
|
||||||
a = "| |" CRLF;
|
a = "| |" CRLF;
|
||||||
a = "|Tested on: Windows95,98,NT,2K |" CRLF;
|
a = "|Tested on: Windows95,98,NT,2K |" CRLF;
|
||||||
a = "| Linux PC |" CRLF;
|
a = "| Linux PC |" CRLF;
|
||||||
|
|||||||
@@ -113,7 +113,6 @@ HTSEXT_API int hts_main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int hts_main_internal(int argc, char **argv, httrackp * opt);
|
static int hts_main_internal(int argc, char **argv, httrackp * opt);
|
||||||
static hts_boolean cmdl_shortopt_has(const char *s, char c);
|
|
||||||
|
|
||||||
// Main, récupère les paramètres et appelle le robot
|
// Main, récupère les paramètres et appelle le robot
|
||||||
HTSEXT_API int hts_main2(int argc, char **argv, httrackp * opt) {
|
HTSEXT_API int hts_main2(int argc, char **argv, httrackp * opt) {
|
||||||
@@ -305,12 +304,12 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
hts_get_version_info(opt));
|
hts_get_version_info(opt));
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
if (strncmp(tmp_argv[0], "--", 2)) { /* not a long option */
|
if (strncmp(tmp_argv[0], "--", 2)) { /* pas */
|
||||||
if (cmdl_shortopt_has(tmp_argv[0], 'q'))
|
if ((strchr(tmp_argv[0], 'q') != NULL))
|
||||||
opt->quiet = HTS_TRUE; // never ask questions (nohup)
|
opt->quiet = 1; // ne pas poser de questions! (nohup par exemple)
|
||||||
if (cmdl_shortopt_has(tmp_argv[0], 'i')) { // doit.log!
|
if ((strchr(tmp_argv[0], 'i') != NULL)) { // doit.log!
|
||||||
argv_url = -1;
|
argv_url = -1; /* forcer */
|
||||||
opt->quiet = HTS_TRUE;
|
opt->quiet = 1;
|
||||||
}
|
}
|
||||||
} else if (strcmp(tmp_argv[0] + 2, "quiet") == 0) {
|
} else if (strcmp(tmp_argv[0] + 2, "quiet") == 0) {
|
||||||
opt->quiet = 1; // ne pas poser de questions! (nohup par exemple)
|
opt->quiet = 1; // ne pas poser de questions! (nohup par exemple)
|
||||||
@@ -425,10 +424,25 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
|
|
||||||
} // for
|
} // for
|
||||||
|
|
||||||
// path_html is already UTF-8 (argv is UTF-8 on Windows via
|
// Convert path to UTF-8
|
||||||
// hts_argv_utf8), so no re-encoding.
|
#ifdef _WIN32
|
||||||
|
{
|
||||||
|
char *const path =
|
||||||
|
hts_convertStringSystemToUTF8(StringBuff(opt->path_html),
|
||||||
|
(int) StringLength(opt->path_html));
|
||||||
|
if (path != NULL) {
|
||||||
|
StringCopy(opt->path_html_utf8, path);
|
||||||
|
free(path);
|
||||||
|
} else {
|
||||||
|
StringCopyN(opt->path_html_utf8, StringBuff(opt->path_html),
|
||||||
|
StringLength(opt->path_html));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// Assume UTF-8 filesystem.
|
||||||
StringCopyN(opt->path_html_utf8, StringBuff(opt->path_html),
|
StringCopyN(opt->path_html_utf8, StringBuff(opt->path_html),
|
||||||
StringLength(opt->path_html));
|
StringLength(opt->path_html));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* if doit.log exists, or if new URL(s) defined,
|
/* if doit.log exists, or if new URL(s) defined,
|
||||||
then DO NOT load standard config files */
|
then DO NOT load standard config files */
|
||||||
@@ -1438,7 +1452,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) {
|
if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) {
|
||||||
HTS_PANIC_PRINTF
|
HTS_PANIC_PRINTF
|
||||||
("Option %w needs to be followed by a blank space, and a module name");
|
("Option %w needs to be followed by a blank space, and a module name");
|
||||||
printf("Example: -%%w httrack-plugin\n");
|
printf("Example: -%%w htsswf\n");
|
||||||
htsmain_free();
|
htsmain_free();
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
@@ -1495,7 +1509,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
htsmain_free();
|
htsmain_free();
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
LLint fz;
|
off_t fz;
|
||||||
|
|
||||||
na++;
|
na++;
|
||||||
fz = fsize(argv[na]);
|
fz = fsize(argv[na]);
|
||||||
@@ -2239,12 +2253,21 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
htsmain_free();
|
htsmain_free();
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
char BIGSTK pname[HTS_URLMAXSIZE * 2];
|
char *a;
|
||||||
|
|
||||||
na++;
|
na++;
|
||||||
opt->proxy.active = 1;
|
opt->proxy.active = 1;
|
||||||
hts_parse_proxy(argv[na], pname, sizeof(pname), &opt->proxy.port);
|
// Rechercher MAIS en partant de la fin à cause de user:pass@proxy:port
|
||||||
StringCopy(opt->proxy.name, pname);
|
a = argv[na] + strlen(argv[na]) - 1;
|
||||||
|
while((a > argv[na]) && (*a != ':') && (*a != '@'))
|
||||||
|
a--;
|
||||||
|
if (*a == ':') { // un port est présent, <proxy>:port
|
||||||
|
sscanf(a + 1, "%d", &opt->proxy.port);
|
||||||
|
StringCopyN(opt->proxy.name, argv[na], (int) (a - argv[na]));
|
||||||
|
} else { // <proxy>
|
||||||
|
opt->proxy.port = 8080;
|
||||||
|
StringCopy(opt->proxy.name, argv[na]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'F': // user-agent field
|
case 'F': // user-agent field
|
||||||
@@ -2471,12 +2494,9 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
}
|
}
|
||||||
} */
|
} */
|
||||||
|
|
||||||
// vérifier existence de la structure (path_html/path_log are UTF-8, use
|
// vérifier existence de la structure
|
||||||
// the UTF-8 mkdir path)
|
structcheck(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "/"));
|
||||||
structcheck_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
structcheck(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log), "/"));
|
||||||
StringBuff(opt->path_html), "/"));
|
|
||||||
structcheck_utf8(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
|
||||||
StringBuff(opt->path_log), "/"));
|
|
||||||
|
|
||||||
// reprise/update
|
// reprise/update
|
||||||
if (opt->cache) {
|
if (opt->cache) {
|
||||||
@@ -2573,11 +2593,21 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
hts_get_version_info(opt), t, url);
|
hts_get_version_info(opt), t, url);
|
||||||
fprintf(opt->log, "(");
|
fprintf(opt->log, "(");
|
||||||
for(i = 0; i < argc; i++) {
|
for(i = 0; i < argc; i++) {
|
||||||
const char *arg = argv[i]; // already UTF-8 on every platform
|
#ifdef _WIN32
|
||||||
|
char *carg =
|
||||||
|
hts_convertStringSystemToUTF8(argv[i], (int) strlen(argv[i]));
|
||||||
|
char *arg = carg != NULL ? carg : argv[i];
|
||||||
|
#else
|
||||||
|
const char *arg = argv[i];
|
||||||
|
#endif
|
||||||
if (strchr(arg, ' ') == NULL || strchr(arg, '\"') != NULL)
|
if (strchr(arg, ' ') == NULL || strchr(arg, '\"') != NULL)
|
||||||
fprintf(opt->log, "%s ", arg);
|
fprintf(opt->log, "%s ", arg);
|
||||||
else // entre "" (si espace(s) et pas déja de ")
|
else // entre "" (si espace(s) et pas déja de ")
|
||||||
fprintf(opt->log, "\"%s\" ", arg);
|
fprintf(opt->log, "\"%s\" ", arg);
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (carg != NULL)
|
||||||
|
free(carg);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
fprintf(opt->log, ")" LF);
|
fprintf(opt->log, ")" LF);
|
||||||
fprintf(opt->log, LF);
|
fprintf(opt->log, LF);
|
||||||
@@ -2796,32 +2826,6 @@ int check_path(String * s, char *defaultname) {
|
|||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Does the short-option cluster s carry c from the main option set (-i, -iC2,
|
|
||||||
-%Mi)? Walked as the parser does below: %, &, @ and # each take the letter
|
|
||||||
after them into another set, so the i of -%i is not the main-set -i. */
|
|
||||||
static hts_boolean cmdl_shortopt_has(const char *s, char c) {
|
|
||||||
const char *com;
|
|
||||||
|
|
||||||
if (s[0] != '-' || s[1] == '-')
|
|
||||||
return HTS_FALSE;
|
|
||||||
for (com = s + 1; *com != '\0'; com++) {
|
|
||||||
switch (*com) {
|
|
||||||
case '%':
|
|
||||||
case '&':
|
|
||||||
case '@':
|
|
||||||
case '#':
|
|
||||||
if (*(com + 1) != '\0')
|
|
||||||
com++; /* skip the other set's letter */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (*com == c)
|
|
||||||
return HTS_TRUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return HTS_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// détermine si l'argument est une option
|
// détermine si l'argument est une option
|
||||||
int cmdl_opt(char *s) {
|
int cmdl_opt(char *s) {
|
||||||
if (s[0] == '-') { // c'est peut être une option
|
if (s[0] == '-') { // c'est peut être une option
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ typedef struct t_hts_callbackarg t_hts_callbackarg;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Marks a symbol an external wrapper module exports back to the engine.
|
/* Marks a symbol an external wrapper module exports back to the engine.
|
||||||
Must override -fvisibility=hidden on ELF, or dlopen()ed plugins
|
Must override -fvisibility=hidden on ELF, or dlopen()ed plugins (htsjava)
|
||||||
hide their own hts_plug()/hts_unplug() entry points. */
|
hide their own hts_plug()/hts_unplug() entry points. */
|
||||||
#ifndef EXTERNAL_FUNCTION
|
#ifndef EXTERNAL_FUNCTION
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user