mirror of
https://github.com/xroche/httrack.git
synced 2026-07-16 22:00:45 +03:00
Compare commits
46 Commits
webhttrack
...
docs-squas
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
052f86cdf3 | ||
|
|
a0f2f89ec3 | ||
|
|
93ec06f404 | ||
|
|
bc67e74dea | ||
|
|
c7fcdebe46 | ||
|
|
eb46d8d469 | ||
|
|
9bc53d40d2 | ||
|
|
938a873e19 | ||
|
|
ed05faaaa8 | ||
|
|
5e56a913a5 | ||
|
|
29e868b2ca | ||
|
|
f1418bac3c | ||
|
|
092a557305 | ||
|
|
cfe7c7e68f | ||
|
|
89b1e485d7 | ||
|
|
08481464bd | ||
|
|
3e7b9f91ee | ||
|
|
800d498893 | ||
|
|
991d259981 | ||
|
|
d1bf4f7a25 | ||
|
|
86e145fc1c | ||
|
|
d9ff780d0f | ||
|
|
b026c80bb6 | ||
|
|
e0648beff9 | ||
|
|
ee1aebd935 | ||
|
|
b4957f0625 | ||
|
|
c9d36c82c7 | ||
|
|
1fa0184468 | ||
|
|
79e46eeceb | ||
|
|
436ac53793 | ||
|
|
bc4b2c7b8e | ||
|
|
4fafe283b4 | ||
|
|
9ec5a3a067 | ||
|
|
cd38e6e68d | ||
|
|
e692e56592 | ||
|
|
7d9d4ed890 | ||
|
|
573167e8dd | ||
|
|
e26a5f5c6a | ||
|
|
627ae2b043 | ||
|
|
71ab3574ef | ||
|
|
076127ddea | ||
|
|
dced0208e1 | ||
|
|
6e34c30a7c | ||
|
|
eac13ea248 | ||
|
|
dc3e485f92 | ||
|
|
fac84f1631 |
8
.gitattributes
vendored
Normal file
8
.gitattributes
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# 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
|
||||
42
.github/workflows/ci.yml
vendored
42
.github/workflows/ci.yml
vendored
@@ -41,7 +41,7 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential clang autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
@@ -50,6 +50,9 @@ jobs:
|
||||
# committed generated files already let a plain checkout build.
|
||||
autoreconf -fi
|
||||
./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
|
||||
run: make -j"$(nproc)"
|
||||
@@ -82,7 +85,7 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
@@ -123,14 +126,18 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
brew install autoconf automake libtool autoconf-archive
|
||||
brew install autoconf automake libtool autoconf-archive brotli zstd
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
set -euo pipefail
|
||||
ssl="$(brew --prefix openssl@3)"
|
||||
brewp="$(brew --prefix)"
|
||||
autoreconf -fi
|
||||
./configure CPPFLAGS="-I${ssl}/include" LDFLAGS="-L${ssl}/lib"
|
||||
./configure CPPFLAGS="-I${ssl}/include -I${brewp}/include" \
|
||||
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
|
||||
run: make -j"$(sysctl -n hw.ncpu)"
|
||||
@@ -166,14 +173,16 @@ jobs:
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
brew install autoconf automake libtool autoconf-archive
|
||||
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" LDFLAGS="-L${ssl}/lib" \
|
||||
./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
|
||||
@@ -201,7 +210,8 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
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
|
||||
run: |
|
||||
@@ -242,7 +252,7 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Configure (sanitized)
|
||||
run: |
|
||||
@@ -344,7 +354,7 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential clang autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: Configure (fuzzers, static)
|
||||
run: |
|
||||
@@ -424,7 +434,7 @@ jobs:
|
||||
apt-get install -y --no-install-recommends \
|
||||
ca-certificates git \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev \
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev \
|
||||
debhelper devscripts lintian fakeroot
|
||||
|
||||
- uses: actions/checkout@v6
|
||||
@@ -468,7 +478,7 @@ jobs:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
build-essential autoconf automake libtool autoconf-archive \
|
||||
zlib1g-dev libssl-dev
|
||||
zlib1g-dev libssl-dev libbrotli-dev libzstd-dev
|
||||
|
||||
- name: distcheck
|
||||
run: |
|
||||
@@ -544,6 +554,16 @@ jobs:
|
||||
- name: shfmt
|
||||
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
|
||||
# (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.
|
||||
|
||||
6
.github/workflows/codeql.yml
vendored
6
.github/workflows/codeql.yml
vendored
@@ -46,6 +46,12 @@ jobs:
|
||||
# fopen's umask-controlled 0666 is intended for mirror/cache/log
|
||||
# output; the one credential file (cookies.txt) is kept 0600 on Unix.
|
||||
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:
|
||||
- exclude:
|
||||
id: cpp/world-writable-file-creation
|
||||
|
||||
202
.github/workflows/windows-build.yml
vendored
Normal file
202
.github/workflows/windows-build.yml
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
# 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; 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)" ;;
|
||||
*)
|
||||
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
|
||||
@@ -67,8 +67,9 @@ 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:` trailer naming the assistant. Attribute there, never in a
|
||||
PR-body footer.
|
||||
- PRs land as a merge commit; every commit on the branch goes onto master, so
|
||||
keep each commit message clean and meaningful.
|
||||
- PRs are squash-merged: one commit per PR lands on master, built from the PR
|
||||
title and description, so those are what the history keeps. The branch's
|
||||
intermediate commits are not preserved.
|
||||
|
||||
## PR descriptions
|
||||
- Plain concise prose; lead with what changed and why. No What/Why/How template.
|
||||
|
||||
1
CLAUDE.local.md
Symbolic link
1
CLAUDE.local.md
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/roche/git/httrack-works/CLAUDE.httrack.local.md
|
||||
@@ -6,8 +6,8 @@ with an AI assistant? The operational checklist is [AGENTS.md](AGENTS.md).
|
||||
## Pull requests
|
||||
|
||||
- One change per PR. Small diffs merge fast.
|
||||
- PRs land as a merge commit, so the branch's commits go onto master as-is: keep
|
||||
each commit message clean and explain *why*.
|
||||
- PRs are squash-merged: one commit per PR goes onto master, built from the PR
|
||||
title and description, so those are the history. Explain *why* there.
|
||||
- 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.
|
||||
- Add or update tests for engine changes (`tests/`), and keep CI green.
|
||||
|
||||
1
README
1
README
@@ -40,7 +40,6 @@ These are the principals limits of HTTrack for that moment. Note that we did not
|
||||
that would have solved them.
|
||||
|
||||
- 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*
|
||||
|
||||
|
||||
|
||||
18
configure.ac
18
configure.ac
@@ -64,16 +64,6 @@ AC_SUBST(LT_CV_OBJDIR,$lt_cv_objdir)
|
||||
# Export 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="-Wall -Wformat -Wformat-security \
|
||||
-Wmultichar -Wwrite-strings -Wcast-qual -Wcast-align \
|
||||
@@ -119,8 +109,8 @@ case "$CFLAGS" in
|
||||
esac
|
||||
|
||||
# Force libc back into DT_NEEDED for libraries that reach it only through
|
||||
# libhttrack (libhtsjava, the libtest callbacks), but only with a GNU-style
|
||||
# linker; Apple ld rejects these flags and links libSystem unconditionally.
|
||||
# libhttrack (the libtest callbacks), but only with a GNU-style linker; Apple
|
||||
# ld rejects these flags and links libSystem unconditionally.
|
||||
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"])
|
||||
AC_SUBST([LIBC_FORCE_LINK])
|
||||
@@ -183,6 +173,10 @@ AC_CHECK_HEADERS([execinfo.h])
|
||||
### zlib
|
||||
CHECK_ZLIB()
|
||||
|
||||
### brotli and zstd content codings (optional)
|
||||
CHECK_BROTLI()
|
||||
CHECK_ZSTD()
|
||||
|
||||
### OpenSSL is explicitly enabled/disabled ?
|
||||
AC_MSG_CHECKING(whether to enable https support)
|
||||
AC_ARG_ENABLE([https],
|
||||
|
||||
2
debian/control
vendored
2
debian/control
vendored
@@ -2,7 +2,7 @@ Source: httrack
|
||||
Section: web
|
||||
Maintainer: Xavier Roche <roche@httrack.com>
|
||||
Standards-Version: 4.7.4
|
||||
Build-Depends: debhelper-compat (= 14), autoconf, autoconf-archive, automake, libtool, zlib1g-dev, libssl-dev
|
||||
Build-Depends: debhelper-compat (= 14), autoconf, autoconf-archive, automake, libtool, zlib1g-dev, libssl-dev, libbrotli-dev, libzstd-dev
|
||||
Rules-Requires-Root: no
|
||||
Homepage: http://www.httrack.com
|
||||
Vcs-Git: https://github.com/xroche/httrack.git
|
||||
|
||||
5
debian/copyright
vendored
5
debian/copyright
vendored
@@ -7,9 +7,8 @@ Files: *
|
||||
Copyright: 1998-2026 Xavier Roche and other contributors
|
||||
License: GPL-3+
|
||||
Comment:
|
||||
The engine includes contributions from Yann Philippot (src/htsjava.c,
|
||||
src/htsjava.h). htsbasenet.h links against the system OpenSSL library
|
||||
(originally by Eric Young); no OpenSSL/SSLeay code is bundled here.
|
||||
htsbasenet.h links against the system OpenSSL library (originally by Eric
|
||||
Young); no OpenSSL/SSLeay code is bundled here.
|
||||
|
||||
Files: src/minizip/*
|
||||
Copyright: 1998-2010 Gilles Vollant
|
||||
|
||||
1
debian/libhttrack-dev.files
vendored
1
debian/libhttrack-dev.files
vendored
@@ -1,5 +1,4 @@
|
||||
usr/include/httrack
|
||||
usr/lib/*/libhttrack.{so}
|
||||
usr/lib/*/libhtsjava.{so}
|
||||
usr/share/httrack/libtest
|
||||
usr/lib/*/httrack/libtest
|
||||
|
||||
1
debian/libhttrack3.files
vendored
1
debian/libhttrack3.files
vendored
@@ -1,3 +1,2 @@
|
||||
usr/lib/*/libhttrack.so.3*
|
||||
usr/lib/*/libhtsjava.so.3*
|
||||
usr/share/httrack/templates
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# libFuzzer harnesses; built only with --enable-fuzzers (requires clang).
|
||||
if FUZZERS
|
||||
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
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
@@ -25,6 +26,7 @@ fuzz_filters_SOURCES = fuzz-filters.c fuzz.h
|
||||
fuzz_url_SOURCES = fuzz-url.c fuzz.h
|
||||
fuzz_header_SOURCES = fuzz-header.c fuzz.h
|
||||
fuzz_cachendx_SOURCES = fuzz-cachendx.c fuzz.h
|
||||
fuzz_htsparse_SOURCES = fuzz-htsparse.c fuzz.h
|
||||
|
||||
# List corpus files explicitly: automake does not expand EXTRA_DIST globs.
|
||||
EXTRA_DIST = README.md run-fuzzers.sh \
|
||||
@@ -37,9 +39,12 @@ EXTRA_DIST = README.md run-fuzzers.sh \
|
||||
corpus/filters/filter.bin corpus/filters/filter-size.bin \
|
||||
corpus/filters/regress-empty-subject-unique.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/regress-file-empty-path.txt corpus/url/regress-long-path-abort.txt \
|
||||
corpus/header/full-response.txt corpus/header/redirect.txt \
|
||||
corpus/cachendx/new-format.txt corpus/cachendx/old-format.txt \
|
||||
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
|
||||
|
||||
BIN
fuzz/corpus/filters/regress-classdepth-timeout.bin
Normal file
BIN
fuzz/corpus/filters/regress-classdepth-timeout.bin
Normal file
Binary file not shown.
15
fuzz/corpus/htsparse/basic.html
Normal file
15
fuzz/corpus/htsparse/basic.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<!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>
|
||||
8
fuzz/corpus/htsparse/malformed.html
Normal file
8
fuzz/corpus/htsparse/malformed.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<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=
|
||||
11
fuzz/corpus/htsparse/meta-usemap.html
Normal file
11
fuzz/corpus/htsparse/meta-usemap.html
Normal file
@@ -0,0 +1,11 @@
|
||||
<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>
|
||||
13
fuzz/corpus/htsparse/script-inscript.html
Normal file
13
fuzz/corpus/htsparse/script-inscript.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<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>
|
||||
175
fuzz/fuzz-htsparse.c
Normal file
175
fuzz/fuzz-htsparse.c
Normal file
@@ -0,0 +1,175 @@
|
||||
/* ------------------------------------------------------------ */
|
||||
/*
|
||||
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;
|
||||
}
|
||||
@@ -609,10 +609,9 @@ most mirrors do work. We still are working to improve the mirror quality of HTTr
|
||||
<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, for example if HTTrack failed to detect all included classes
|
||||
or files called within the class file. Sometimes, Java applets need to be online, 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)<br>
|
||||
A: <em>Java applets may not work in some cases, because HTTrack does not parse compiled class files to find
|
||||
the resources they load. Java applets often need to be online anyway, since remote files are fetched directly
|
||||
at runtime.<br>
|
||||
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.
|
||||
</em>
|
||||
|
||||
@@ -243,7 +243,7 @@ Build options:
|
||||
Spider options:
|
||||
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])
|
||||
j *parse Java Classes (j0 don't parse) (--parse-java[=N])
|
||||
j *parse scripts (j0 don't parse) (--parse-java[=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)
|
||||
%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)
|
||||
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)
|
||||
j *parse Java Classes (j0 don't parse)
|
||||
j *parse scripts (j0 don't parse)
|
||||
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)
|
||||
f *log file mode
|
||||
@@ -497,9 +497,9 @@ about your browser retaining them.
|
||||
<p align=justify> This causes different document types to be analyzed
|
||||
differently.
|
||||
|
||||
<pre><b><i> j *parse Java Classes (j0 don't parse) </i></b></pre>
|
||||
<pre><b><i> j *parse scripts (j0 don't parse) </i></b></pre>
|
||||
|
||||
<p align=justify> This causes Java class files to be parsed looking for
|
||||
<p align=justify> This causes scripts to be parsed looking for
|
||||
URLs.
|
||||
|
||||
<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:
|
||||
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)
|
||||
j *parse Java Classes (j0 don't parse)
|
||||
j *parse scripts (j0 don't parse)
|
||||
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)
|
||||
%B tolerant requests (accept bogus responses on some servers, but not standard!)
|
||||
@@ -2451,12 +2451,10 @@ 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> A: Java applets may not work in some cases, for
|
||||
example if HTTrack failed to detect all included classes or files called
|
||||
within the class file. Sometimes, Java applets need to be online,
|
||||
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> A: Java applets may not work in some cases, because
|
||||
HTTrack does not parse compiled class files to find the resources they
|
||||
load. Java applets often need to be online anyway, since remote files
|
||||
are fetched directly at runtime.
|
||||
|
||||
<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
|
||||
|
||||
@@ -764,9 +764,9 @@ check, * u1 check but /, u2 check always)
|
||||
<td width="78%">
|
||||
|
||||
|
||||
<p>*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])</p></td></tr>
|
||||
<p>*parse scripts (j0 don t parse, bitmask: |1 parse
|
||||
default, |4 don t parse .js |8 don t be aggressive)
|
||||
(--parse-java[=N])</p></td></tr>
|
||||
<tr valign="top" align="left">
|
||||
<td width="11%"></td>
|
||||
<td width="6%">
|
||||
@@ -889,8 +889,8 @@ only) (--protocol[=N])</p></td></tr>
|
||||
<td width="78%">
|
||||
|
||||
|
||||
<p>disable a specific external mime module (-%w htsswf -%w
|
||||
htsjava) (--disable-module <param>)</p></td></tr>
|
||||
<p>disable a specific external mime module (-%w
|
||||
httrack-plugin) (--disable-module <param>)</p></td></tr>
|
||||
</table>
|
||||
|
||||
<p style="margin-left:11%; margin-top: 1em"><b>Browser
|
||||
@@ -2175,10 +2175,6 @@ Several scripts generating complex filenames may not find
|
||||
them (ex:
|
||||
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>-
|
||||
Cgi-bin links may not work properly in some cases
|
||||
(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)
|
||||
This option activates the extended parsing, that attempt to find links in unknown Html code/javascript
|
||||
|
||||
j *parse Java Classes (j0 don't parse)
|
||||
This option define whether the engine has to parse java files or not to catch included files
|
||||
j *parse scripts (j0 don't parse)
|
||||
This option defines whether the engine has to parse scripts or not to catch included files
|
||||
|
||||
I *make an index (I0 don't make)
|
||||
This option define whether the engine has to generate an index.html on the top directory
|
||||
|
||||
413
html/plug.html
413
html/plug.html
@@ -103,220 +103,219 @@ h4 { margin: 0; font-weight: bold; font-size: 1.18em; }
|
||||
|
||||
<br>
|
||||
|
||||
You can write external functions to be plugged in the httrack library very easily.
|
||||
We'll see there some examples.
|
||||
You can write external functions to be plugged in the httrack library very easily.
|
||||
We'll see there some examples.
|
||||
|
||||
<br><br>
|
||||
|
||||
The <tt>httrack</tt> commandline tool allows (since the 3.30 release) to plug external functions to various callbacks defined in httrack.
|
||||
The 3.41 release introduces a cleaned up verion of callbacks, with two major changes:
|
||||
<ul>
|
||||
<li>Cleaned up function prototypes, with two arguments always passed (the caller carg structure, and the httrackp* object), convenient to pass an user-defined pointer (see <tt>CALLBACKARG_USERDEF(carg)</tt>)</li>
|
||||
<li>The httrackp* option structure can be directly accessed to plug callbacks (no need to give the callback name and function name in the commandline!)</li>
|
||||
<li>The callback plug is made through the CHAIN_FUNCTION() helper, allowing to chain multiple callbacks of the same type (the callbacks MUST preserve the chain by calling ancestors)</li>
|
||||
</ul>
|
||||
|
||||
<br>
|
||||
References:
|
||||
<ul>
|
||||
<li>the <tt>httrack-library.h</tt> prototype file
|
||||
<br />
|
||||
|
||||
The <tt>httrack</tt> commandline tool allows (since the 3.30 release) to plug external functions to various callbacks defined in httrack.
|
||||
The 3.41 release introduces a cleaned up verion of callbacks, with two major changes:
|
||||
<ul>
|
||||
<li>Cleaned up function prototypes, with two arguments always passed (the caller carg structure, and the httrackp* object), convenient to pass an user-defined pointer (see <tt>CALLBACKARG_USERDEF(carg)</tt>)</li>
|
||||
<li>The httrackp* option structure can be directly accessed to plug callbacks (no need to give the callback name and function name in the commandline!)</li>
|
||||
<li>The callback plug is made through the CHAIN_FUNCTION() helper, allowing to chain multiple callbacks of the same type (the callbacks MUST preserve the chain by calling ancestors)</li>
|
||||
</ul>
|
||||
|
||||
<br>
|
||||
References:
|
||||
<ul>
|
||||
<li>the <tt>httrack-library.h</tt> prototype file
|
||||
<br />
|
||||
Note: the <i>Initialization</i>, <i>Main functions</i>, <i>Options handling</i> and <i>Wrapper functions</i> sections are generally the only ones to be considered.
|
||||
</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>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>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
Below the list of functions to be defined in the module (plugin).<br />
|
||||
<br />
|
||||
|
||||
<table width="100%">
|
||||
<tr><td><b><i>module function name</i></b></td><td><b>function description</b></td><td><b>function signature</b></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>hts_plug</i></td><td background="img/fade.gif">
|
||||
The module entry point. The opt structure can be used to plug callbacks, using the CHAIN_FUNCTION() macro helper. The argv optional argument is the one passed in the commandline as --wrapper parameter.<br>return value: 1 upon success, 0 upon error (the mirror will then be aborted)<br />
|
||||
|
||||
<br />
|
||||
Wrappers can be plugged inside hts_plug() using:<br />
|
||||
<tt>
|
||||
CHAIN_FUNCTION(opt, <callback name>, <our callback function name>, <our callback function optional custom pointer argument>);
|
||||
</tt>
|
||||
<br />
|
||||
|
||||
<br />
|
||||
Example:
|
||||
<br />
|
||||
<tt>
|
||||
CHAIN_FUNCTION(opt, check_html, process, userdef);
|
||||
</tt>
|
||||
<br />
|
||||
|
||||
</td><td background="img/fade.gif"><tt>extern int hts_plug(httrackp *opt, const char* argv);</tt></td></tr>
|
||||
|
||||
<!-- -->
|
||||
|
||||
<tr><td background="img/fade.gif"><i>hts_unplug</i></td><td background="img/fade.gif">
|
||||
The module exit point. To free allocated resources without using global variables, use the uninit callback (see below)</td><td background="img/fade.gif"><tt>extern int hts_unplug(httrackp *opt);</tt></td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
<br />
|
||||
Note that all callbacks (except init and uninit) take as first two argument:
|
||||
<ul>
|
||||
<li>the t_hts_callbackarg structure<br />
|
||||
this structure holds the callback chain (parent callbacks defined before the current callback) pointers, and the user-defined pointer ; see <tt>CALLBACKARG_USERDEF(carg)</tt>)
|
||||
</li>
|
||||
<li>the httrackp structure<br />
|
||||
this structure, holding all current httrack options and mirror state, can be read or mofidied
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
Below the list of callbacks, and associated external wrappers.
|
||||
|
||||
<table width="100%">
|
||||
<tr><td><b><i>callback name</i></b></td><td><b>callback description</b></td><td><b>callback function signature</b></td></tr>
|
||||
|
||||
<tr><td background="img/fade.gif"><i>init</i></td><td background="img/fade.gif">Note: the use the "start" callback is advised. Called during initialization.<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>uninit</i></td><td background="img/fade.gif">Note: the use os the "end" callback is advised.<br />Called during un-initialization<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>start</i></td><td background="img/fade.gif">Called when the mirror starts. The <tt>opt</tt> structure passed lists all options defined for this mirror. You may modify the <tt>opt</tt> structure to fit your needs.<br>return value: 1 upon success, 0 upon error (the mirror will then be aborted)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>end</i></td><td background="img/fade.gif">Called when the mirror ends<br>return value: 1 upon success, 0 upon error (the mirror will then be considered aborted)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>chopt</i></td><td background="img/fade.gif">Called when options are to be changed. The <tt>opt</tt> structure passed lists all options, updated to take account of recent changes<br>return value: 1 upon success, 0 upon error (the mirror will then be aborted)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>preprocess</i></td><td background="img/fade.gif">Called when a document (which is an html document) is to be parsed (original, not yet modified document). The <tt>html</tt> address points to the document data address (char**), and the <tt>length</tt> address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using the hts_realloc()/hts_free() library functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of hts_strdup() in such cases is advised. The <tt>url_address</tt> and <tt>url_file</tt> are the address and URI of the file being processed<br>return value: 1 if the new pointers can be applied (default value)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char** html, int* len, const char* url_address, const char* url_file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>postprocess</i></td><td background="img/fade.gif">Called when a document (which is an html document) is parsed and transformed (links rewritten). The <tt>html</tt> address points to the document data address (char**), and the <tt>length</tt> address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using the hts_realloc()/hts_free() library functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of hts_strdup() in such cases is advised. The <tt>url_address</tt> and <tt>url_file</tt> are the address and URI of the file being processed<br>return value: 1 if the new pointers can be applied (default value)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char** html, int* len, const char* url_address, const char* url_file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>check_html</i></td><td background="img/fade.gif">Called when a document (which may not be an html document) is to be parsed. The <tt>html</tt> address points to the document data, of lenth <tt>len</tt>. The <tt>url_address</tt> and <tt>url_file</tt> are the address and URI of the file being processed<br>return value: 1 if the parsing can be processed, 0 if the file must be skipped without being parsed</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* html, int len, const char* url_address, const char* url_file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>query</i></td><td background="img/fade.gif">Called when the wizard needs to ask a question. The <tt>question</tt> string contains the question for the (human) user<br>return value: the string answer ("" for default reply)</td><td background="img/fade.gif"><tt>const char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>query2</i></td><td background="img/fade.gif">Called when the wizard needs to ask a question</td><td background="img/fade.gif"><tt>const char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>query3</i></td><td background="img/fade.gif">Called when the wizard needs to ask a question</td><td background="img/fade.gif"><tt>const char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>loop</i></td><td background="img/fade.gif">Called periodically (informational, to display statistics)<br>return value: 1 if the mirror can continue, 0 if the mirror must be aborted</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, lien_back* back, int back_max, int back_index, int lien_tot, int lien_ntot, int stat_time, hts_stat_struct* stats);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>check_link</i></td><td background="img/fade.gif">Called when a link has to be tested. The <tt>adr</tt> and <tt>fil</tt> are the address and URI of the link being tested. The passed <tt>status</tt> value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine<br>return value: same meaning as the passed <tt>status</tt> value ; you may generally return -1 to let the engine take the decision by itself</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr, const char* fil, int status);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>check_mime</i></td><td background="img/fade.gif">Called when a link download has begun, and needs to be tested against its MIME type. The <tt>adr</tt> and <tt>fil</tt> are the address and URI of the link being tested, and the <tt>mime</tt> string contains the link type being processed. The passed <tt>status</tt> value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine<br>return value: same meaning as the passed <tt>status</tt> value ; you may generally return -1 to let the engine take the decision by itself</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr, const char* fil, const char* mime, int status);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>pause</i></td><td background="img/fade.gif">Called when the engine must pause. When the <tt>lockfile</tt> passed is deleted, the function can return<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* lockfile);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>filesave</i></td><td background="img/fade.gif">Called when a file is to be saved on disk<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>filesave2</i></td><td background="img/fade.gif">Called when a file is to be saved or checked on disk<br>The hostname, filename and local filename are given. Two additional flags tells if the local file is new (is_new), if the local file is to be modified (is_modified), and if the file was not updated remotely (not_updated).<br>(!is_new && !is_modified): the file is up-to-date, and will not be modified<br>(is_new && is_modified): a new file will be written (or an updated file is being written)<br>(!is_new && is_modified): a file is being updated (append)<br>(is_new && !is_modified): an empty file will be written ("do not recatch locally erased files")<br>not_updated: the file was not re-downloaded because it was up-to-date (no data transferred again)<br><br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* hostname, const char* filename, const char* localfile, int is_new, int is_modified, int not_updated);</tt></td></tr>
|
||||
|
||||
<tr><td background="img/fade.gif"><i>linkdetected</i></td><td background="img/fade.gif">Called when a link has been detected<br>return value: 1 if the link can be analyzed, 0 if the link must not even be considered</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* link);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>linkdetected2</i></td><td background="img/fade.gif">Called when a link has been detected<br>return value: 1 if the link can be analyzed, 0 if the link must not even be considered</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* link, const const char* tag_start);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>xfrstatus</i></td><td background="img/fade.gif">Called when a file has been processed (downloaded, updated, or error)<br>return value: must return 1</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, lien_back* back);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>savename</i></td><td background="img/fade.gif">Called when a local filename has to be processed. The <tt>adr_complete</tt> and <tt>fil_complete</tt> are the address and URI of the file being saved ; the <tt>referer_adr</tt> and <tt>referer_fil</tt> are the address and URI of the referer link. The <tt>save</tt> string contains the local filename being used. You may modifiy the <tt>save</tt> string to fit your needs, up to 1024 bytes (note: filename collisions, if any, will be handled by the engine by renaming the file into file-2.ext, file-3.ext ..).<br>return value: must return 1</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>sendhead</i></td><td background="img/fade.gif">Called when HTTP headers are to be sent to the remote server. The <tt>buff</tt> buffer contains text headers, <tt>adr</tt> and <tt>fil</tt> the URL, and <tt>referer_adr</tt> and <tt>referer_fil</tt> the referer URL. The <tt>outgoing</tt> structure contains all information related to the current slot.<br>return value: 1 if the mirror can continue, 0 if the mirror must be aborted</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* outgoing);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>receivehead</i></td><td background="img/fade.gif">Called when HTTP headers are recevived from the remote server. The <tt>buff</tt> buffer contains text headers, <tt>adr</tt> and <tt>fil</tt> the URL, and <tt>referer_adr</tt> and <tt>referer_fil</tt> the referer URL. The <tt>incoming</tt> structure contains all information related to the current slot.<br>return value: 1 if the mirror can continue, 0 if the mirror must be aborted</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* incoming);</tt></td></tr>
|
||||
|
||||
<tr><td background="img/fade.gif"><i>detect</i></td><td background="img/fade.gif">Called when an unknown document is to be parsed. The <tt>str</tt> structure contains all information related to the document.<br>return value: 1 if the type is known and can be parsed, 0 if the document type is unknown</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, htsmoduleStruct* str);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>parse</i></td><td background="img/fade.gif">The <tt>str</tt> structure contains all information related to the document.<br>return value: 1 if the document was successfully parsed, 0 if an error occurred</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, htsmoduleStruct* str);</tt></td></tr>
|
||||
|
||||
|
||||
</table>
|
||||
<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>callbacks-example*.c</tt> files given in the httrack archive</li>
|
||||
<li>the example given at the end of this document</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
Below the list of functions to be defined in the module (plugin).<br />
|
||||
<br />
|
||||
|
||||
<table width="100%">
|
||||
<tr><td><b><i>module function name</i></b></td><td><b>function description</b></td><td><b>function signature</b></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>hts_plug</i></td><td background="img/fade.gif">
|
||||
The module entry point. The opt structure can be used to plug callbacks, using the CHAIN_FUNCTION() macro helper. The argv optional argument is the one passed in the commandline as --wrapper parameter.<br>return value: 1 upon success, 0 upon error (the mirror will then be aborted)<br />
|
||||
|
||||
<br />
|
||||
Wrappers can be plugged inside hts_plug() using:<br />
|
||||
<tt>
|
||||
CHAIN_FUNCTION(opt, <callback name>, <our callback function name>, <our callback function optional custom pointer argument>);
|
||||
</tt>
|
||||
<br />
|
||||
|
||||
<br />
|
||||
Example:
|
||||
<br />
|
||||
<tt>
|
||||
CHAIN_FUNCTION(opt, check_html, process, userdef);
|
||||
</tt>
|
||||
<br />
|
||||
|
||||
</td><td background="img/fade.gif"><tt>extern int hts_plug(httrackp *opt, const char* argv);</tt></td></tr>
|
||||
|
||||
<!-- -->
|
||||
|
||||
<tr><td background="img/fade.gif"><i>hts_unplug</i></td><td background="img/fade.gif">
|
||||
The module exit point. To free allocated resources without using global variables, use the uninit callback (see below)</td><td background="img/fade.gif"><tt>extern int hts_unplug(httrackp *opt);</tt></td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
<br />
|
||||
Note that all callbacks (except init and uninit) take as first two argument:
|
||||
<ul>
|
||||
<li>the t_hts_callbackarg structure<br />
|
||||
this structure holds the callback chain (parent callbacks defined before the current callback) pointers, and the user-defined pointer ; see <tt>CALLBACKARG_USERDEF(carg)</tt>)
|
||||
</li>
|
||||
<li>the httrackp structure<br />
|
||||
this structure, holding all current httrack options and mirror state, can be read or mofidied
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
Below the list of callbacks, and associated external wrappers.
|
||||
|
||||
<table width="100%">
|
||||
<tr><td><b><i>callback name</i></b></td><td><b>callback description</b></td><td><b>callback function signature</b></td></tr>
|
||||
|
||||
<tr><td background="img/fade.gif"><i>init</i></td><td background="img/fade.gif">Note: the use the "start" callback is advised. Called during initialization.<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>uninit</i></td><td background="img/fade.gif">Note: the use os the "end" callback is advised.<br />Called during un-initialization<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>start</i></td><td background="img/fade.gif">Called when the mirror starts. The <tt>opt</tt> structure passed lists all options defined for this mirror. You may modify the <tt>opt</tt> structure to fit your needs.<br>return value: 1 upon success, 0 upon error (the mirror will then be aborted)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>end</i></td><td background="img/fade.gif">Called when the mirror ends<br>return value: 1 upon success, 0 upon error (the mirror will then be considered aborted)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>chopt</i></td><td background="img/fade.gif">Called when options are to be changed. The <tt>opt</tt> structure passed lists all options, updated to take account of recent changes<br>return value: 1 upon success, 0 upon error (the mirror will then be aborted)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>preprocess</i></td><td background="img/fade.gif">Called when a document (which is an html document) is to be parsed (original, not yet modified document). The <tt>html</tt> address points to the document data address (char**), and the <tt>length</tt> address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using the hts_realloc()/hts_free() library functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of hts_strdup() in such cases is advised. The <tt>url_address</tt> and <tt>url_file</tt> are the address and URI of the file being processed<br>return value: 1 if the new pointers can be applied (default value)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char** html, int* len, const char* url_address, const char* url_file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>postprocess</i></td><td background="img/fade.gif">Called when a document (which is an html document) is parsed and transformed (links rewritten). The <tt>html</tt> address points to the document data address (char**), and the <tt>length</tt> address points to the lenth of this document. Both pointer values (address and size) can be modified to change the document. It is up to the callback function to reallocate the given pointer (using the hts_realloc()/hts_free() library functions), which will be free()'ed by the engine. Hence, return of static buffers is strictly forbidden, and the use of hts_strdup() in such cases is advised. The <tt>url_address</tt> and <tt>url_file</tt> are the address and URI of the file being processed<br>return value: 1 if the new pointers can be applied (default value)</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char** html, int* len, const char* url_address, const char* url_file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>check_html</i></td><td background="img/fade.gif">Called when a document (which may not be an html document) is to be parsed. The <tt>html</tt> address points to the document data, of lenth <tt>len</tt>. The <tt>url_address</tt> and <tt>url_file</tt> are the address and URI of the file being processed<br>return value: 1 if the parsing can be processed, 0 if the file must be skipped without being parsed</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* html, int len, const char* url_address, const char* url_file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>query</i></td><td background="img/fade.gif">Called when the wizard needs to ask a question. The <tt>question</tt> string contains the question for the (human) user<br>return value: the string answer ("" for default reply)</td><td background="img/fade.gif"><tt>const char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>query2</i></td><td background="img/fade.gif">Called when the wizard needs to ask a question</td><td background="img/fade.gif"><tt>const char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>query3</i></td><td background="img/fade.gif">Called when the wizard needs to ask a question</td><td background="img/fade.gif"><tt>const char* mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* question);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>loop</i></td><td background="img/fade.gif">Called periodically (informational, to display statistics)<br>return value: 1 if the mirror can continue, 0 if the mirror must be aborted</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, lien_back* back, int back_max, int back_index, int lien_tot, int lien_ntot, int stat_time, hts_stat_struct* stats);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>check_link</i></td><td background="img/fade.gif">Called when a link has to be tested. The <tt>adr</tt> and <tt>fil</tt> are the address and URI of the link being tested. The passed <tt>status</tt> value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine<br>return value: same meaning as the passed <tt>status</tt> value ; you may generally return -1 to let the engine take the decision by itself</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr, const char* fil, int status);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>check_mime</i></td><td background="img/fade.gif">Called when a link download has begun, and needs to be tested against its MIME type. The <tt>adr</tt> and <tt>fil</tt> are the address and URI of the link being tested, and the <tt>mime</tt> string contains the link type being processed. The passed <tt>status</tt> value has the following meaning: 0 if the link is to be accepted by default, 1 if the link is to be refused by default, and -1 if no decision has yet been taken by the engine<br>return value: same meaning as the passed <tt>status</tt> value ; you may generally return -1 to let the engine take the decision by itself</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr, const char* fil, const char* mime, int status);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>pause</i></td><td background="img/fade.gif">Called when the engine must pause. When the <tt>lockfile</tt> passed is deleted, the function can return<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* lockfile);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>filesave</i></td><td background="img/fade.gif">Called when a file is to be saved on disk<br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* file);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>filesave2</i></td><td background="img/fade.gif">Called when a file is to be saved or checked on disk<br>The hostname, filename and local filename are given. Two additional flags tells if the local file is new (is_new), if the local file is to be modified (is_modified), and if the file was not updated remotely (not_updated).<br>(!is_new && !is_modified): the file is up-to-date, and will not be modified<br>(is_new && is_modified): a new file will be written (or an updated file is being written)<br>(!is_new && is_modified): a file is being updated (append)<br>(is_new && !is_modified): an empty file will be written ("do not recatch locally erased files")<br>not_updated: the file was not re-downloaded because it was up-to-date (no data transferred again)<br><br>return value: none</td><td background="img/fade.gif"><tt>void mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* hostname, const char* filename, const char* localfile, int is_new, int is_modified, int not_updated);</tt></td></tr>
|
||||
|
||||
<tr><td background="img/fade.gif"><i>linkdetected</i></td><td background="img/fade.gif">Called when a link has been detected<br>return value: 1 if the link can be analyzed, 0 if the link must not even be considered</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* link);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>linkdetected2</i></td><td background="img/fade.gif">Called when a link has been detected<br>return value: 1 if the link can be analyzed, 0 if the link must not even be considered</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* link, const const char* tag_start);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>xfrstatus</i></td><td background="img/fade.gif">Called when a file has been processed (downloaded, updated, or error)<br>return value: must return 1</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, lien_back* back);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>savename</i></td><td background="img/fade.gif">Called when a local filename has to be processed. The <tt>adr_complete</tt> and <tt>fil_complete</tt> are the address and URI of the file being saved ; the <tt>referer_adr</tt> and <tt>referer_fil</tt> are the address and URI of the referer link. The <tt>save</tt> string contains the local filename being used. You may modifiy the <tt>save</tt> string to fit your needs, up to 1024 bytes (note: filename collisions, if any, will be handled by the engine by renaming the file into file-2.ext, file-3.ext ..).<br>return value: must return 1</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, const char* adr_complete, const char* fil_complete, const char* referer_adr, const char* referer_fil, char* save);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>sendhead</i></td><td background="img/fade.gif">Called when HTTP headers are to be sent to the remote server. The <tt>buff</tt> buffer contains text headers, <tt>adr</tt> and <tt>fil</tt> the URL, and <tt>referer_adr</tt> and <tt>referer_fil</tt> the referer URL. The <tt>outgoing</tt> structure contains all information related to the current slot.<br>return value: 1 if the mirror can continue, 0 if the mirror must be aborted</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* outgoing);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>receivehead</i></td><td background="img/fade.gif">Called when HTTP headers are recevived from the remote server. The <tt>buff</tt> buffer contains text headers, <tt>adr</tt> and <tt>fil</tt> the URL, and <tt>referer_adr</tt> and <tt>referer_fil</tt> the referer URL. The <tt>incoming</tt> structure contains all information related to the current slot.<br>return value: 1 if the mirror can continue, 0 if the mirror must be aborted</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* incoming);</tt></td></tr>
|
||||
|
||||
<tr><td background="img/fade.gif"><i>detect</i></td><td background="img/fade.gif">Called when an unknown document is to be parsed. The <tt>str</tt> structure contains all information related to the document.<br>return value: 1 if the type is known and can be parsed, 0 if the document type is unknown</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, htsmoduleStruct* str);</tt></td></tr>
|
||||
<tr><td background="img/fade.gif"><i>parse</i></td><td background="img/fade.gif">The <tt>str</tt> structure contains all information related to the document.<br>return value: 1 if the document was successfully parsed, 0 if an error occurred</td><td background="img/fade.gif"><tt>int mycallback(t_hts_callbackarg *carg, httrackp* opt, htsmoduleStruct* str);</tt></td></tr>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
<br><br>
|
||||
Note: the optional libhttrack-plugin module (libhttrack-plugin.dll or libhttrack-plugin.so), if found in the library environment, is loaded automatically, and its <tt>hts_plug()</tt> function being called.<br />
|
||||
|
||||
Note: the optional libhttrack-plugin module (libhttrack-plugin.dll or libhttrack-plugin.so), if found in the library environment, is loaded automatically, and its <tt>hts_plug()</tt> function being called.<br />
|
||||
|
||||
|
||||
<br />
|
||||
An example is generally more efficient than anything else, so let's write our first module, aimed to stupidely print all parsed html files:
|
||||
<table width="100%" border="2">
|
||||
<tr><td>
|
||||
<pre>
|
||||
/* system includes */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* standard httrack module includes */
|
||||
#include "httrack-library.h"
|
||||
#include "htsopt.h"
|
||||
#include "htsdefines.h"
|
||||
|
||||
/* local function called as "check_html" callback */
|
||||
static int process_file(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt,
|
||||
/*other parameters are callback-specific*/
|
||||
char* html, int len, const char* url_address, const char* url_file) {
|
||||
void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg); /*optional user-defined arg*/
|
||||
|
||||
/* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */
|
||||
if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) {
|
||||
if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt,
|
||||
html, len, url_address, url_file)) {
|
||||
return 0; /* abort */
|
||||
}
|
||||
}
|
||||
|
||||
printf("file %s%s content: %s\n", url_address, url_file, html);
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
/* local function called as "end" callback */
|
||||
static int end_of_mirror(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt) {
|
||||
void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg); /*optional user-defined arg*/
|
||||
|
||||
/* processing */
|
||||
fprintf(stderr, "That's all, folks!\n");
|
||||
|
||||
/* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */
|
||||
if (CALLBACKARG_PREV_FUN(carg, end) != NULL) {
|
||||
/* status is ok on our side, return other callabck's status */
|
||||
return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt);
|
||||
}
|
||||
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
/*
|
||||
module entry point
|
||||
the function name and prototype MUST match this prototype
|
||||
*/
|
||||
EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) {
|
||||
/* optional argument passed in the commandline we won't be using here */
|
||||
const char *arg = strchr(argv, ',');
|
||||
if (arg != NULL)
|
||||
arg++;
|
||||
|
||||
/* plug callback functions */
|
||||
CHAIN_FUNCTION(opt, check_html, process_file, /*optional user-defined arg*/NULL);
|
||||
CHAIN_FUNCTION(opt, end, end_of_mirror, /*optional user-defined arg*/NULL);
|
||||
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
/*
|
||||
module exit point
|
||||
the function name and prototype MUST match this prototype
|
||||
*/
|
||||
EXTERNAL_FUNCTION int hts_unplug(httrackp *opt) {
|
||||
fprintf(stder, "Module unplugged");
|
||||
|
||||
return 1; /* success */
|
||||
}
|
||||
</pre>
|
||||
</td></tr></table>
|
||||
|
||||
<br />
|
||||
Compile this file ; for example:
|
||||
<br />
|
||||
<tt>
|
||||
gcc -O -g3 -shared -o mylibrary.so myexample.c
|
||||
</tt>
|
||||
<br />
|
||||
and plug the module using the commandline ; for example:
|
||||
<br />
|
||||
<tt>
|
||||
httrack --wrapper mylibrary http://www.example.com
|
||||
</tt>
|
||||
<br />
|
||||
or, if some parameters are desired:
|
||||
<br />
|
||||
<tt>
|
||||
httrack --wrapper mylibrary,myparameter-string http://www.example.com
|
||||
</tt>
|
||||
<br />
|
||||
(the "myparameter-string" string will be available in the 'arg' parameter passed to the hts_plug entry point)
|
||||
<br />
|
||||
|
||||
|
||||
<br />
|
||||
An example is generally more efficient than anything else, so let's write our first module, aimed to stupidely print all parsed html files:
|
||||
<table width="100%" border="2">
|
||||
<tr><td>
|
||||
<pre>
|
||||
/* system includes */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* standard httrack module includes */
|
||||
#include "httrack-library.h"
|
||||
#include "htsopt.h"
|
||||
#include "htsdefines.h"
|
||||
|
||||
/* local function called as "check_html" callback */
|
||||
static int process_file(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt,
|
||||
/*other parameters are callback-specific*/
|
||||
char* html, int len, const char* url_address, const char* url_file) {
|
||||
void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg); /*optional user-defined arg*/
|
||||
|
||||
/* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */
|
||||
if (CALLBACKARG_PREV_FUN(carg, check_html) != NULL) {
|
||||
if (!CALLBACKARG_PREV_FUN(carg, check_html)(CALLBACKARG_PREV_CARG(carg), opt,
|
||||
html, len, url_address, url_file)) {
|
||||
return 0; /* abort */
|
||||
}
|
||||
}
|
||||
|
||||
printf("file %s%s content: %s\n", url_address, url_file, html);
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
/* local function called as "end" callback */
|
||||
static int end_of_mirror(t_hts_callbackarg /*the carg structure, holding various information*/*carg, /*the option settings*/httrackp *opt) {
|
||||
void *ourDummyArg = (void*) CALLBACKARG_USERDEF(carg); /*optional user-defined arg*/
|
||||
|
||||
/* processing */
|
||||
fprintf(stderr, "That's all, folks!\n");
|
||||
|
||||
/* call parent functions if multiple callbacks are chained. you can skip this part, if you don't want previous callbacks to be called. */
|
||||
if (CALLBACKARG_PREV_FUN(carg, end) != NULL) {
|
||||
/* status is ok on our side, return other callabck's status */
|
||||
return CALLBACKARG_PREV_FUN(carg, end)(CALLBACKARG_PREV_CARG(carg), opt);
|
||||
}
|
||||
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
/*
|
||||
module entry point
|
||||
the function name and prototype MUST match this prototype
|
||||
*/
|
||||
EXTERNAL_FUNCTION int hts_plug(httrackp *opt, const char* argv) {
|
||||
/* optional argument passed in the commandline we won't be using here */
|
||||
const char *arg = strchr(argv, ',');
|
||||
if (arg != NULL)
|
||||
arg++;
|
||||
|
||||
/* plug callback functions */
|
||||
CHAIN_FUNCTION(opt, check_html, process_file, /*optional user-defined arg*/NULL);
|
||||
CHAIN_FUNCTION(opt, end, end_of_mirror, /*optional user-defined arg*/NULL);
|
||||
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
/*
|
||||
module exit point
|
||||
the function name and prototype MUST match this prototype
|
||||
*/
|
||||
EXTERNAL_FUNCTION int hts_unplug(httrackp *opt) {
|
||||
fprintf(stder, "Module unplugged");
|
||||
|
||||
return 1; /* success */
|
||||
}
|
||||
</pre>
|
||||
</td></tr></table>
|
||||
|
||||
<br />
|
||||
Compile this file ; for example:
|
||||
<br />
|
||||
<tt>
|
||||
gcc -O -g3 -shared -o mylibrary.so myexample.c
|
||||
</tt>
|
||||
<br />
|
||||
and plug the module using the commandline ; for example:
|
||||
<br />
|
||||
<tt>
|
||||
httrack --wrapper mylibrary http://www.example.com
|
||||
</tt>
|
||||
<br />
|
||||
or, if some parameters are desired:
|
||||
<br />
|
||||
<tt>
|
||||
httrack --wrapper mylibrary,myparameter-string http://www.example.com
|
||||
</tt>
|
||||
<br />
|
||||
(the "myparameter-string" string will be available in the 'arg' parameter passed to the hts_plug entry point)
|
||||
<br />
|
||||
|
||||
|
||||
<br><br>
|
||||
|
||||
<!-- ==================== Start epilogue ==================== -->
|
||||
|
||||
@@ -69,7 +69,7 @@ ${LANG_K3} : ${HTTRACK_WEB}
|
||||
|
||||
<form>
|
||||
<input type="button" value="OK" onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</form>
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ function info(str) {
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O1}
|
||||
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O5}
|
||||
@@ -118,20 +118,20 @@ ${do:end-if}
|
||||
<form action="${thisfile}" name="form">
|
||||
<table width="100%">
|
||||
<tr><td>${LANG_T2}</td><td>http://<input name="urladr"
|
||||
onMouseOver="info('${html:LANG_T10}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_T10}' onMouseOver="info('${html:LANG_T10}'); return true" onMouseOut="info(' '); return true"
|
||||
></td></tr>
|
||||
<tr><td colspan=2>
|
||||
|
||||
<table width="100%">
|
||||
<th>${LANG_T4}</th>
|
||||
<tr><td>${LANG_T5}:</td><td><input name="urllogin"
|
||||
onMouseOver="info('${html:LANG_T12}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_T12}' onMouseOver="info('${html:LANG_T12}'); return true" onMouseOut="info(' '); return true"
|
||||
></td></tr>
|
||||
<tr><td>${LANG_T6}:</td><td><input name="urlpass"
|
||||
onMouseOver="info('${html:LANG_T13}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_T13}' onMouseOver="info('${html:LANG_T13}'); return true" onMouseOut="info(' '); return true"
|
||||
></td></tr>
|
||||
<tr><td>${LANG_T7}:</td><td><input type="button" value="${LANG_T8}" onClick="alert('not yet implemented!')"
|
||||
onMouseOver="info('${html:LANG_T14}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_T14}' onMouseOver="info('${html:LANG_T14}'); return true" onMouseOut="info(' '); return true"
|
||||
></td></tr>
|
||||
</table>
|
||||
|
||||
@@ -139,7 +139,7 @@ ${do:end-if}
|
||||
|
||||
<tr><td>
|
||||
<input type="button" value="OK" onClick="if (do_add()) { window.close(); }"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ function info(str) {
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O1}
|
||||
@@ -48,7 +48,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O5}
|
||||
|
||||
@@ -58,7 +58,7 @@ function info(str) {
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white" href="about.html" target="_new"
|
||||
onMouseOver="info('${html:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G21}' onMouseOver="info('${html:LANG_G21}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_O16}...
|
||||
</a>
|
||||
@@ -67,7 +67,7 @@ ${LANG_O16}...
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white"
|
||||
href="http://www.httrack.com/update.php3?Product=HTTrack&Version=${HTTRACK_VERSIONID}&VersionStr=${HTTRACK_VERSION}&Platform=${HTS_PLATFORM}&LanguageId=${lang}" target="_new"
|
||||
onMouseOver="info('${html:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O17}' onMouseOver="info('${html:LANG_O17}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_O17}...
|
||||
</a>
|
||||
@@ -78,7 +78,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<tr><td class="tabCtrl" align="left">
|
||||
<a style="background:black;color: white"
|
||||
href="/index.html" target="_new"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${LANG_P16}
|
||||
</a>
|
||||
|
||||
@@ -43,7 +43,7 @@ function info(str) {
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O1}
|
||||
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O5}
|
||||
@@ -113,7 +113,7 @@ ${LANG_THANKYOU}!
|
||||
|
||||
<tr><td align="right">
|
||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
||||
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -107,16 +107,16 @@ ${do:end-if}
|
||||
<!-- checkboxes -->
|
||||
<table border="0" width="100%" cellspacing="0">
|
||||
<tr><td><input type="checkbox" name="parseall" ${checked:parseall}
|
||||
onMouseOver="info('${html:LANG_I1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1}' onMouseOver="info('${html:LANG_I1}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I31}</td></tr>
|
||||
<tr><td><input type="checkbox" name="link" ${checked:link}
|
||||
onMouseOver="info('${html:LANG_I2}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I2}' onMouseOver="info('${html:LANG_I2}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I32}</td></tr>
|
||||
<tr><td><input type="checkbox" name="testall" ${checked:testall}
|
||||
onMouseOver="info('${html:LANG_I2b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I2b}' onMouseOver="info('${html:LANG_I2b}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I32b}</td></tr>
|
||||
<tr><td><input type="checkbox" name="htmlfirst" ${checked:htmlfirst}
|
||||
onMouseOver="info('${html:LANG_I2c}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I2c}' onMouseOver="info('${html:LANG_I2c}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I32c}</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -125,12 +125,12 @@ ${do:end-if}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -98,17 +98,27 @@ ${do:end-if}
|
||||
<input type="hidden" name="redirect" value="">
|
||||
<input type="hidden" name="closeme" value="">
|
||||
|
||||
${LANG_IOPT10}:
|
||||
${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}:
|
||||
<input name="prox" value="${prox}" size="32"
|
||||
onMouseOver="info('${html:LANG_G14}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G14}' onMouseOver="info('${html:LANG_G14}'); return true" onMouseOut="info(' '); return true"
|
||||
>:
|
||||
<input name="portprox" value="${portprox}" size="4"
|
||||
onMouseOver="info('${html:LANG_G15}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G15}' onMouseOver="info('${html:LANG_G15}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
<br>
|
||||
|
||||
<input type="checkbox" name="ftpprox" ${checked:ftpprox}
|
||||
onMouseOver="info('${html:LANG_G15c}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G15c}' onMouseOver="info('${html:LANG_G15c}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I47c}
|
||||
<br><br>
|
||||
|
||||
@@ -117,12 +127,12 @@ ${LANG_IOPT10}:
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -112,97 +112,97 @@ ${LANG_W3}
|
||||
|
||||
<td align="left">
|
||||
<input name="ext1" value="${ext1}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime1" value="${mime1}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
<td align="left">
|
||||
<input name="ext2" value="${ext2}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime2" value="${mime2}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
<td align="left">
|
||||
<input name="ext3" value="${ext3}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime3" value="${mime3}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
<td align="left">
|
||||
<input name="ext4" value="${ext4}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime4" value="${mime4}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
<td align="left">
|
||||
<input name="ext5" value="${ext5}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime5" value="${mime5}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
<td align="left">
|
||||
<input name="ext6" value="${ext6}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime6" value="${mime6}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
<td align="left">
|
||||
<input name="ext7" value="${ext7}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime7" value="${mime7}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
<td align="left">
|
||||
<input name="ext8" value="${ext8}"
|
||||
onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W4}' onMouseOver="info('${html:LANG_W4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="left">
|
||||
⇔
|
||||
</td><td align="left">
|
||||
<input name="mime8" value="${mime8}"
|
||||
onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_W5}' onMouseOver="info('${html:LANG_W5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
<!-- -->
|
||||
@@ -217,12 +217,12 @@ ${LANG_W3}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -101,20 +101,20 @@ ${do:end-if}
|
||||
${LANG_I33}
|
||||
<br>
|
||||
<select name="build"
|
||||
onMouseOver="info('${html:LANG_I3}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I3}' onMouseOver="info('${html:LANG_I3}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:build:LISTDEF_3}
|
||||
</select>
|
||||
<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();"
|
||||
onMouseOver="info('${html:LANG_I4}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I4}' onMouseOver="info('${html:LANG_I4}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
|
||||
<!-- checkboxes -->
|
||||
<table border="0" width="100%" cellspacing="0">
|
||||
<tr><td>
|
||||
<select name="dos"
|
||||
onMouseOver="info('${html:LANG_I8}\r\n${LANG_I8b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I8} ${html:LANG_I8b}' onMouseOver="info('${html:LANG_I8}\r\n${LANG_I8b}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
<option value="0"${ztest:dos: selected::}> </option>
|
||||
<option value="1"${ztest:dos:: selected:}>${LANG_I37}</option>
|
||||
@@ -122,19 +122,19 @@ ${listid:build:LISTDEF_3}
|
||||
</select>
|
||||
</td></tr>
|
||||
<tr><td><input type="checkbox" name="errpage" ${checked:errpage}
|
||||
onMouseOver="info('${html:LANG_I9}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I9}' onMouseOver="info('${html:LANG_I9}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I38}</td></tr>
|
||||
<tr><td><input type="checkbox" name="external" ${checked:external}
|
||||
onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I56}</td></tr>
|
||||
<tr><td><input type="checkbox" name="hidepwd" ${checked:hidepwd}
|
||||
onMouseOver="info('${html:LANG_I30}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I30}' onMouseOver="info('${html:LANG_I30}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I66}</td></tr>
|
||||
<tr><td><input type="checkbox" name="hidequery" ${checked:hidequery}
|
||||
onMouseOver="info('${html:LANG_I30b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I30b}' onMouseOver="info('${html:LANG_I30b}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I67}</td></tr>
|
||||
<tr><td><input type="checkbox" name="nopurge" ${checked:nopurge}
|
||||
onMouseOver="info('${html:LANG_I1a}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1a}' onMouseOver="info('${html:LANG_I1a}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I57}</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -143,12 +143,12 @@ ${listid:build:LISTDEF_3}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -70,7 +70,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -107,12 +107,12 @@ ${LANG_Q3}
|
||||
${do:output-mode:html-urlescaped}
|
||||
onClick="if (confirm(str_replace(str_replace('${LANG_DIAL7}', '%20', ' '), '%0a', ' '))) { form.closeme.value=1; form.submit(); } return false;"
|
||||
${do:output-mode:}
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -104,7 +104,7 @@ ${LANG_I40c}
|
||||
<!-- checkboxes -->
|
||||
<table border="0" width="100%" cellspacing="0">
|
||||
<tr><td><input type="checkbox" name="cache" ${checked:cache}
|
||||
onMouseOver="info('${html:LANG_I5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I5}' onMouseOver="info('${html:LANG_I5}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I34}</td></tr>
|
||||
</table>
|
||||
<br>
|
||||
@@ -112,7 +112,7 @@ ${LANG_I40c}
|
||||
${LANG_I39}
|
||||
<br>
|
||||
<select name="filter"
|
||||
onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I29}' onMouseOver="info('${html:LANG_I29}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:filter:LISTDEF_4}
|
||||
</select>
|
||||
@@ -121,7 +121,7 @@ ${listid:filter:LISTDEF_4}
|
||||
${LANG_I40}
|
||||
<br>
|
||||
<select name="travel"
|
||||
onMouseOver="info('${html:LANG_I11}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I11}' onMouseOver="info('${html:LANG_I11}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:travel:LISTDEF_5}
|
||||
</select>
|
||||
@@ -130,7 +130,7 @@ ${listid:travel:LISTDEF_5}
|
||||
${LANG_I40b}
|
||||
<br>
|
||||
<select name="travel2"
|
||||
onMouseOver="info('${html:LANG_I11b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I11b}' onMouseOver="info('${html:LANG_I11b}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:travel2:LISTDEF_6}
|
||||
</select>
|
||||
@@ -139,7 +139,7 @@ ${listid:travel2:LISTDEF_6}
|
||||
${LANG_I40e}
|
||||
<br>
|
||||
<select name="travel3"
|
||||
onMouseOver="info('${html:LANG_I11c}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I11c}' onMouseOver="info('${html:LANG_I11c}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:travel3:LISTDEF_11}
|
||||
</select>
|
||||
@@ -148,7 +148,7 @@ ${listid:travel3:LISTDEF_11}
|
||||
<!-- checkboxes -->
|
||||
<table border="0" width="100%" cellspacing="0">
|
||||
<tr><td><input type="checkbox" name="windebug" ${checked:windebug}
|
||||
onMouseOver="info('${html:LANG_I1h}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1h}' onMouseOver="info('${html:LANG_I1h}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I40d}</td></tr>
|
||||
</table>
|
||||
<br>
|
||||
@@ -158,12 +158,12 @@ ${listid:travel3:LISTDEF_11}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -104,11 +104,11 @@ ${do:end-if}
|
||||
${LANG_I44}
|
||||
</td><td>
|
||||
<input name="connexion" value="${connexion}" size="4"
|
||||
onMouseOver="info('${html:LANG_I12}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I12}' onMouseOver="info('${html:LANG_I12}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr><tr><td></td><td>
|
||||
<input type="checkbox" name="ka" ${checked:ka}
|
||||
onMouseOver="info('${html:LANG_I47f}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I47f}' onMouseOver="info('${html:LANG_I47f}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I47e}
|
||||
</td></tr>
|
||||
|
||||
@@ -116,11 +116,11 @@ ${LANG_I44}
|
||||
${LANG_I47d}
|
||||
</td><td>
|
||||
<input name="timeout" value="${timeout}" size="4"
|
||||
onMouseOver="info('${html:LANG_I13}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I13}' onMouseOver="info('${html:LANG_I13}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr><tr><td></td><td>
|
||||
<input type="checkbox" name="remt" ${checked:remt}
|
||||
onMouseOver="info('${html:LANG_I14}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I14}' onMouseOver="info('${html:LANG_I14}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I45}
|
||||
</td></tr>
|
||||
|
||||
@@ -128,7 +128,7 @@ ${LANG_I47d}
|
||||
${LANG_I48}
|
||||
</td><td>
|
||||
<input name="retry" value="${retry}" size="4"
|
||||
onMouseOver="info('${html:LANG_I17}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I17}' onMouseOver="info('${html:LANG_I17}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -136,11 +136,11 @@ ${LANG_I48}
|
||||
${LANG_I46}
|
||||
</td><td>
|
||||
<input name="rate" value="${rate}" size="4"
|
||||
onMouseOver="info('${html:LANG_I15}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I15}' onMouseOver="info('${html:LANG_I15}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr><tr><td></td><td>
|
||||
<input type="checkbox" name="rems" ${checked:rems}
|
||||
onMouseOver="info('${html:LANG_I16}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I16}' onMouseOver="info('${html:LANG_I16}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I47}
|
||||
</td></tr>
|
||||
|
||||
@@ -151,12 +151,12 @@ ${LANG_I46}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -104,7 +104,7 @@ ${do:end-if}
|
||||
${LANG_G32}
|
||||
</td><td>
|
||||
<input name="depth" value="${depth}" size="4"
|
||||
onMouseOver="info('${html:LANG_I1g}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1g}' onMouseOver="info('${html:LANG_I1g}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -112,7 +112,7 @@ ${LANG_G32}
|
||||
${LANG_G32b}
|
||||
</td><td>
|
||||
<input name="depth2" value="${depth2}" size="4"
|
||||
onMouseOver="info('${html:LANG_I1g2}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1g2}' onMouseOver="info('${html:LANG_I1g2}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -120,7 +120,7 @@ ${LANG_G32b}
|
||||
${LANG_I50}
|
||||
</td><td>
|
||||
<input name="maxhtml" value="${maxhtml}" size="4"
|
||||
onMouseOver="info('${html:LANG_I18}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I18}' onMouseOver="info('${html:LANG_I18}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -128,7 +128,7 @@ ${LANG_I50}
|
||||
${LANG_I50b}
|
||||
</td><td>
|
||||
<input name="othermax" value="${othermax}" size="4"
|
||||
onMouseOver="info('${html:LANG_I19}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I19}' onMouseOver="info('${html:LANG_I19}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -136,7 +136,7 @@ ${LANG_I50b}
|
||||
${LANG_I51}
|
||||
</td><td>
|
||||
<input name="sizemax" value="${sizemax}" size="4"
|
||||
onMouseOver="info('${html:LANG_I20}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I20}' onMouseOver="info('${html:LANG_I20}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -144,7 +144,15 @@ ${LANG_I51}
|
||||
${LANG_I65}
|
||||
</td><td>
|
||||
<input name="pausebytes" value="${pausebytes}" size="4"
|
||||
onMouseOver="info('${html:LANG_I20b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I20b}' 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>
|
||||
|
||||
@@ -152,7 +160,7 @@ ${LANG_I65}
|
||||
${LANG_I52}
|
||||
</td><td>
|
||||
<input name="maxtime" value="${maxtime}" size="4"
|
||||
onMouseOver="info('${html:LANG_I21}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I21}' onMouseOver="info('${html:LANG_I21}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -160,7 +168,7 @@ ${LANG_I52}
|
||||
${LANG_I54}
|
||||
</td><td>
|
||||
<input name="maxrate" value="${maxrate}" size="4"
|
||||
onMouseOver="info('${html:LANG_I22}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I22}' onMouseOver="info('${html:LANG_I22}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -168,7 +176,7 @@ ${LANG_I54}
|
||||
${LANG_I64}
|
||||
</td><td>
|
||||
<input name="maxconn" value="${maxconn}" size="4"
|
||||
onMouseOver="info('${html:LANG_I22b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I22b}' onMouseOver="info('${html:LANG_I22b}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -176,7 +184,7 @@ ${LANG_I64}
|
||||
${LANG_I64b}
|
||||
</td><td>
|
||||
<input name="maxlinks" value="${maxlinks}" size="4"
|
||||
onMouseOver="info('${html:LANG_I22c}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I22c}' onMouseOver="info('${html:LANG_I22c}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -185,12 +193,12 @@ ${LANG_I64b}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -104,7 +104,7 @@ ${do:end-if}
|
||||
${LANG_I43}
|
||||
</td><td>
|
||||
<input name="user" value="${user}" size="60"
|
||||
onMouseOver="info('${html:LANG_I23}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I23}' onMouseOver="info('${html:LANG_I23}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -112,7 +112,7 @@ ${LANG_I43}
|
||||
${LANG_I43b}
|
||||
</td><td>
|
||||
<input name="footer" value="${footer}" size="60"
|
||||
onMouseOver="info('${html:LANG_I23b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I23b}' onMouseOver="info('${html:LANG_I23b}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
|
||||
@@ -123,12 +123,12 @@ ${LANG_I43b}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -102,7 +102,7 @@ ${do:end-if}
|
||||
${LANG_B10}
|
||||
</tt>
|
||||
<textarea name="url2" cols="60" rows="8"
|
||||
onMouseOver="info('${html:LANG_C3}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_C3}' onMouseOver="info('${html:LANG_C3}'); return true" onMouseOut="info(' '); return true"
|
||||
>${url2}</textarea>
|
||||
|
||||
<br>
|
||||
@@ -115,12 +115,12 @@ ${LANG_B13}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -99,50 +99,77 @@ ${do:end-if}
|
||||
<input type="hidden" name="closeme" value="">
|
||||
|
||||
<input type="checkbox" name="cookies" ${checked:cookies}
|
||||
onMouseOver="info('${html:LANG_I1b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1b}' onMouseOver="info('${html:LANG_I1b}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I58}
|
||||
<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}
|
||||
<br>
|
||||
<select name="checktype"
|
||||
onMouseOver="info('${html:LANG_I1c}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1c}' onMouseOver="info('${html:LANG_I1c}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:checktype:LISTDEF_7}
|
||||
</select>
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="parsejava" ${checked:parsejava}
|
||||
onMouseOver="info('${html:LANG_I1d}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1d}' onMouseOver="info('${html:LANG_I1d}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I60}
|
||||
<br><br>
|
||||
|
||||
${LANG_I55}
|
||||
<br>
|
||||
<select name="robots"
|
||||
onMouseOver="info('${html:LANG_I28}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I28}' onMouseOver="info('${html:LANG_I28}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:robots:LISTDEF_8}
|
||||
</select>
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="updhack" ${checked:updhack}
|
||||
onMouseOver="info('${html:LANG_I1k}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1k}' onMouseOver="info('${html:LANG_I1k}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I62b}
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="urlhack" ${checked:urlhack}
|
||||
onMouseOver="info('${html:LANG_I1k2}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1k2}' onMouseOver="info('${html:LANG_I1k2}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I62b2}
|
||||
<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}
|
||||
onMouseOver="info('${html:LANG_I1i}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1i}' onMouseOver="info('${html:LANG_I1i}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I62}
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="http10" ${checked:http10}
|
||||
onMouseOver="info('${html:LANG_I1j}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1j}' onMouseOver="info('${html:LANG_I1j}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I63}
|
||||
<br><br>
|
||||
|
||||
@@ -152,12 +179,12 @@ ${listid:robots:LISTDEF_8}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -60,7 +60,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -71,18 +71,18 @@ ${do:end-if}
|
||||
<table class="tableWidth" border="0" width="100%" cellspacing="0">
|
||||
<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" 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" 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" 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" 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" 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" 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="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="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="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="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="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="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>
|
||||
</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" 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" 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" 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" 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" 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="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="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="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="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="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"> </td>
|
||||
|
||||
</tr>
|
||||
@@ -99,32 +99,32 @@ ${do:end-if}
|
||||
<input type="hidden" name="closeme" value="">
|
||||
|
||||
<input type="checkbox" name="cache2" ${checked:cache2}
|
||||
onMouseOver="info('${html:LANG_I1e}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1e}' onMouseOver="info('${html:LANG_I1e}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I61}
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="norecatch" ${checked:norecatch}
|
||||
onMouseOver="info('${html:LANG_I5b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I5b}' onMouseOver="info('${html:LANG_I5b}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I34b}
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="logf" ${checked:logf}
|
||||
onMouseOver="info('${html:LANG_I7}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I7}' onMouseOver="info('${html:LANG_I7}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I36}
|
||||
<select name="logtype"
|
||||
onMouseOver="info('${html:LANG_I1f}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I1f}' onMouseOver="info('${html:LANG_I1f}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:logtype:LISTDEF_9}
|
||||
</select>
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="index" ${checked:index}
|
||||
onMouseOver="info('${html:LANG_I6}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I6}' onMouseOver="info('${html:LANG_I6}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I35}
|
||||
<br><br>
|
||||
|
||||
<input type="checkbox" name="index2" ${checked:index2}
|
||||
onMouseOver="info('${html:LANG_I6b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_I6b}' onMouseOver="info('${html:LANG_I6b}'); return true" onMouseOut="info(' '); return true"
|
||||
> ${LANG_I35b}
|
||||
<br><br>
|
||||
|
||||
@@ -133,12 +133,12 @@ ${listid:logtype:LISTDEF_9}
|
||||
<tr><td align="left">
|
||||
<input type="submit" value="${LANG_OK}"
|
||||
onClick="form.closeme.value=1; form.submit(); return false;"
|
||||
onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPOK}' onMouseOver="info('${html:LANG_TIPOK}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input type="button" value="${LANG_CANCEL}"
|
||||
onClick="window.close();"
|
||||
onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPCANCEL}' onMouseOver="info('${html:LANG_TIPCANCEL}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -73,7 +73,7 @@ function no_refresh() {
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O1}
|
||||
@@ -85,7 +85,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O5}
|
||||
@@ -152,20 +152,20 @@ ${LANG_H20} ${info.currentjob}
|
||||
|
||||
<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()" 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()" 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()" 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()" 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()" 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()" 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()" 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()" onMouseOver="info('${html:LANG_H7}'); 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()" title='${html:LANG_H6}' 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[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[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[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[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[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[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[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[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[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[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[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[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>
|
||||
|
||||
</table>
|
||||
|
||||
@@ -180,7 +180,7 @@ ${LANG_H20} ${info.currentjob}
|
||||
|
||||
</td><td align="right">
|
||||
<input type="submit" value=" ${LANG_V4} "
|
||||
onMouseOver="disable_timer(); info('${LANG_D3}'); return true"
|
||||
title='${html:LANG_D3}' onMouseOver="disable_timer(); info('${LANG_D3}'); return true"
|
||||
onMouseOut="info(' '); enable_timer(); return true"
|
||||
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">
|
||||
<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"
|
||||
onMouseOver="info('${html:html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O1}' onMouseOver="info('${html:html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O1}
|
||||
@@ -64,7 +64,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O5}
|
||||
@@ -93,7 +93,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -129,15 +129,21 @@ ${do:copy:NoPwdInPages:hidepwd}
|
||||
${do:copy:NoQueryStrings:hidequery}
|
||||
${do:copy:NoPurgeOldFiles:nopurge}
|
||||
${do:copy:Cookies:cookies}
|
||||
${do:copy:CookiesFile:cookiesfile}
|
||||
${do:copy:CheckType:checktype}
|
||||
${do:copy:ParseJava:parsejava}
|
||||
${do:copy:HTTP10:http10}
|
||||
${do:copy:TolerantRequests:toler}
|
||||
${do:copy:UpdateHack:updhack}
|
||||
${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:LogType:logtype}
|
||||
${do:copy:UseHTTPProxyForFTP:ftpprox}
|
||||
${do:copy:ProxyType:proxytype}
|
||||
${do:copy:Build:build}
|
||||
${do:copy:PrimaryScan:filter}
|
||||
${do:copy:Travel:travel}
|
||||
@@ -148,6 +154,7 @@ ${do:copy:MaxHtml:maxhtml}
|
||||
${do:copy:MaxOther:othermax}
|
||||
${do:copy:MaxAll:sizemax}
|
||||
${do:copy:MaxWait:pausebytes}
|
||||
${do:copy:PauseFiles:pausefiles}
|
||||
${do:copy:Sockets:connexion}
|
||||
${do:copy:Retry:retry}
|
||||
${do:copy:MaxTime:maxtime}
|
||||
@@ -211,7 +218,7 @@ ${do:loadhash}
|
||||
|
||||
${LANG_S11}
|
||||
<input name="projname" value="${projname}"
|
||||
onMouseOver="info('${html:html:LANG_S1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_S1}' onMouseOver="info('${html:html:LANG_S1}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
|
||||
<br>
|
||||
@@ -226,7 +233,7 @@ ${do:loadhash}
|
||||
</select>
|
||||
</td><td>
|
||||
<input name="projcateg" value="${projcateg}"
|
||||
onMouseOver="info('${html:html:LANG_S5}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_S5}' onMouseOver="info('${html:html:LANG_S5}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
|
||||
</td></tr></table>
|
||||
@@ -234,7 +241,7 @@ ${do:loadhash}
|
||||
<br>
|
||||
${LANG_S12}
|
||||
<input name="path" value="${path}"
|
||||
onMouseOver="info('${html:html:LANG_S2}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_S2}' 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()">
|
||||
|
||||
@@ -243,11 +250,11 @@ ${do:loadhash}
|
||||
<tr><td>
|
||||
<table width="100%" border="0"><tr><td align="left">
|
||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='index.html'; form.submit()"
|
||||
onMouseOver="info('${html:html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> " onClick="return checkname();" default
|
||||
onMouseOver="info('${html:html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr></table>
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ function do_check_child() {
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O1}
|
||||
@@ -73,7 +73,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O5}
|
||||
@@ -102,7 +102,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -118,7 +118,7 @@ ${do:end-if}
|
||||
<tr><td>
|
||||
${LANG_G31}
|
||||
<select name="todo"
|
||||
onMouseOver="info('${html:LANG_G9}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G9}' onMouseOver="info('${html:LANG_G9}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${listid:todo:LISTDEF_10}
|
||||
</select>
|
||||
@@ -131,12 +131,12 @@ ${do:end-if}
|
||||
</td><td>
|
||||
<input type="button" value="${LANG_G43}"
|
||||
onClick="doOpenWindow()"
|
||||
onMouseOver="info('${html:LANG_G24b}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G24b}' onMouseOver="info('${html:LANG_G24b}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr></table>
|
||||
<br>
|
||||
<textarea name="urls" cols="50" rows="8"
|
||||
onMouseOver="info('${html:LANG_G11}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G11}' onMouseOver="info('${html:LANG_G11}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
${do:output-mode:html}
|
||||
${urls}
|
||||
@@ -150,7 +150,7 @@ ${do:output-mode:}
|
||||
${LANG_URLLIST}:
|
||||
</td><td>
|
||||
<input name="filelist" value="${filelist}" size="40"
|
||||
onMouseOver="info('${html:LANG_G24c}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G24c}' onMouseOver="info('${html:LANG_G24c}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr></table>
|
||||
|
||||
@@ -161,7 +161,7 @@ ${do:output-mode:}
|
||||
${LANG_G41}
|
||||
</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"
|
||||
onMouseOver="info('${html:LANG_G24}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_G24}' onMouseOver="info('${html:LANG_G24}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr></table>
|
||||
|
||||
@@ -170,11 +170,11 @@ ${do:output-mode:}
|
||||
<tr><td align="right">
|
||||
<table width="100%" border="0"><tr><td align="left">
|
||||
<input type="submit" value=" << ${LANG_PREVIOUS} " onClick="form.redirect.value='step2.html'; form.submit()"
|
||||
onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input name="nextBtn" type="submit" value=" ${LANG_NEXT} >> "
|
||||
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td></tr></table>
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ function info(str) {
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_O1}' onMouseOver="info('${html:LANG_O1}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O1}
|
||||
@@ -55,7 +55,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td id="subTitle" align="right">
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
style="color:#FFFFFF"
|
||||
>
|
||||
${LANG_O5}
|
||||
@@ -84,7 +84,7 @@ ${do:if-file-exists:html/index.html}
|
||||
<td>
|
||||
<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"
|
||||
onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPHELP}' onMouseOver="info('${html:LANG_TIPHELP}'); return true" onMouseOut="info(' '); return true"
|
||||
>${LANG_TIPHELP}</a>
|
||||
</td>
|
||||
${do:end-if}
|
||||
@@ -178,6 +178,12 @@ ${do:end-if}
|
||||
${test:parsejava:--parse-java=0:}
|
||||
${test:updhack:--updatehack}
|
||||
${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:http10:--http-10}
|
||||
${test:cache2:--store-all-in-cache}
|
||||
@@ -186,7 +192,7 @@ ${do:end-if}
|
||||
${test:logtype:::--extra-log:--debug-log}
|
||||
${test:index:--index=0:}
|
||||
${test:index2:--search-index=0:--search-index}
|
||||
${test:prox:--proxy "}${prox}${test:prox:\3A}${portprox}${test:prox:"}
|
||||
${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:ftpprox:--httpproxy-ftp=0:--httpproxy-ftp}
|
||||
</textarea>
|
||||
|
||||
@@ -219,15 +225,21 @@ NoPwdInPages=${ztest:hidepwd:0:1}
|
||||
NoQueryStrings=${ztest:hidequery:0:1}
|
||||
NoPurgeOldFiles=${ztest:nopurge:0:1}
|
||||
Cookies=${ztest:cookies:0:1}
|
||||
CookiesFile=${cookiesfile}
|
||||
CheckType=${ztest:checktype:0:1:2}
|
||||
ParseJava=${ztest:parsejava:0:1}
|
||||
HTTP10=${ztest:http10:0:1}
|
||||
TolerantRequests=${ztest:toler:0:1}
|
||||
UpdateHack=${ztest:updhack: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}
|
||||
LogType=${logtype}
|
||||
UseHTTPProxyForFTP=${ztest:ftpprox:0:1}
|
||||
ProxyType=${proxytype}
|
||||
Build=${build}
|
||||
PrimaryScan=${filter}
|
||||
Travel=${travel}
|
||||
@@ -238,6 +250,7 @@ MaxHtml=${maxhtml}
|
||||
MaxOther=${othermax}
|
||||
MaxAll=${sizemax}
|
||||
MaxWait=${pausebytes}
|
||||
PauseFiles=${pausefiles}
|
||||
Sockets=${connexion}
|
||||
Retry=${retry}
|
||||
MaxTime=${maxtime}
|
||||
@@ -285,11 +298,11 @@ ${do:output-mode:}
|
||||
</td></tr><tr><td>
|
||||
<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()"
|
||||
onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPPREV}' onMouseOver="info('${html:LANG_TIPPREV}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</td><td align="right">
|
||||
<input name="nextBtn" type="submit" value=" ${LANG_J9} >> "
|
||||
onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
title='${html:LANG_TIPNEXT}' onMouseOver="info('${html:LANG_TIPNEXT}'); return true" onMouseOut="info(' '); return true"
|
||||
>
|
||||
</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
|
||||
</small><br><br>
|
||||
<!-- -->
|
||||
<li>Parse java files</li>
|
||||
<br><small>Must the engine parse .java files (java classes) to seek included filenames?
|
||||
<li>Parse scripts</li>
|
||||
<br><small>Must the engine parse scripts to seek included filenames?
|
||||
<br>It is checked by default
|
||||
</small><br><br>
|
||||
<!-- -->
|
||||
|
||||
28
lang.def
28
lang.def
@@ -1006,3 +1006,31 @@ LANG_SERVEND
|
||||
Server terminated
|
||||
LANG_FATALERR
|
||||
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).
|
||||
|
||||
@@ -928,3 +928,31 @@ Server terminated
|
||||
Ñúðâúðúò íå îòãîâàðÿ
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Servidor desconectado
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +928,31 @@ Server terminated
|
||||
伺服器已終止
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +930,31 @@ Server terminated
|
||||
Poslužitelj je razriješen
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +976,31 @@ Click on this notification to restart the interrupted mirror
|
||||
Klik på denne notifikation for at genstarte den afbrudte spejlkopiering
|
||||
HTTrack: could not save profile 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,3 +928,31 @@ Server terminated
|
||||
Der Server wurde beendet
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +976,31 @@ 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'!
|
||||
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).
|
||||
|
||||
@@ -931,3 +931,31 @@ Palvelin lopetettu
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +976,31 @@ Build a mail archive
|
||||
Construire une archive mail
|
||||
Default referer URL
|
||||
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,3 +930,31 @@ Server terminated
|
||||
Ακυρώθηκε από τον εξυπηρετητή
|
||||
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).
|
||||
|
||||
@@ -928,3 +928,31 @@ Server terminated
|
||||
Server disconnesso
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Ñåðâåðîò å ïðåêèíàò
|
||||
A fatal error has occurred during this 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,3 +928,31 @@ Server terminated
|
||||
A kiszolgáló befejezte a kapcsolatot
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Server beeindigd
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Serwer zakonczyl prace
|
||||
A fatal error has occurred during this mirror
|
||||
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).
|
||||
|
||||
@@ -976,3 +976,31 @@ Click on this notification to restart the interrupted mirror
|
||||
Clique nesta notificação para reiniciar o espelho interrompido
|
||||
HTTrack: could not save profile for '%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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Server terminat
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Server terminated
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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).
|
||||
|
||||
@@ -928,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Sunucu sonlandýrdý
|
||||
A fatal error has occurred during this mirror
|
||||
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,3 +928,31 @@ Server terminated
|
||||
|
||||
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,3 +928,31 @@ Server terminated
|
||||
Server terminated
|
||||
A fatal error has occurred during this mirror
|
||||
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).
|
||||
|
||||
66
m4/check_codecs.m4
Normal file
66
m4/check_codecs.m4
Normal file
@@ -0,0 +1,66 @@
|
||||
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.
|
||||
.\" SPDX-License-Identifier: GPL-3.0-or-later
|
||||
.TH httrack 1 "07 July 2026" "httrack website copier"
|
||||
.TH httrack 1 "14 July 2026" "httrack website copier"
|
||||
.SH NAME
|
||||
httrack \- offline browser : copy websites to a local directory
|
||||
.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)
|
||||
.SS Proxy options:
|
||||
.IP \-P
|
||||
proxy use (\-P proxy:port or \-P user:pass@proxy:port) (\-\-proxy <param>)
|
||||
proxy use (\-P [socks5://|connect://][user:pass@]proxy:port) (\-\-proxy <param>)
|
||||
.IP \-%f
|
||||
*use proxy for ftp (f0 don't use) (\-\-httpproxy\-ftp[=N])
|
||||
.IP \-%b
|
||||
@@ -224,7 +224,7 @@ explain which filter rule accepts or rejects a URL, then exit (\-\-why <param>)
|
||||
.IP \-u
|
||||
check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always) (\-\-check\-type[=N])
|
||||
.IP \-j
|
||||
*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])
|
||||
*parse scripts (j0 don't parse, bitmask: |1 parse default, |4 don't parse .js |8 don't be aggressive) (\-\-parse\-java[=N])
|
||||
.IP \-sN
|
||||
follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules)) (\-\-robots[=N])
|
||||
.IP \-%h
|
||||
@@ -248,7 +248,7 @@ can also be used to force a specific file type: \-\-assume foo.cgi=text/html
|
||||
.IP \-@iN
|
||||
internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only) (\-\-protocol[=N])
|
||||
.IP \-%w
|
||||
disable a specific external mime module (\-%w htsswf \-%w htsjava) (\-\-disable\-module <param>)
|
||||
disable a specific external mime module (\-%w httrack\-plugin) (\-\-disable\-module <param>)
|
||||
.SS Browser ID:
|
||||
.IP \-F
|
||||
user\-agent field sent in HTTP headers (\-F "user\-agent name") (\-\-user\-agent <param>)
|
||||
@@ -514,8 +514,6 @@ that would have solved them.
|
||||
.SM
|
||||
\- Several scripts generating complex filenames may not find them (ex: img.src='image'+a+Mobj.dst+'.gif')
|
||||
.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*
|
||||
.SH BUGS
|
||||
Please reports bugs to
|
||||
|
||||
@@ -44,7 +44,7 @@ httrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
||||
proxytrack_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
||||
htsserver_LDFLAGS = $(AM_LDFLAGS) $(LDFLAGS_PIE)
|
||||
|
||||
lib_LTLIBRARIES = libhttrack.la libhtsjava.la
|
||||
lib_LTLIBRARIES = libhttrack.la
|
||||
|
||||
htsserver_SOURCES = htsserver.c htsserver.h htsweb.c htsweb.h
|
||||
proxytrack_SOURCES = proxy/main.c \
|
||||
@@ -61,7 +61,7 @@ libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
||||
htshelp.c htslib.c htscoremain.c \
|
||||
htsname.c htsrobots.c htstools.c htswizard.c \
|
||||
htsalias.c htsthread.c htsindex.c htsbauth.c \
|
||||
htsmd5.c htszlib.c htswrap.c htsconcat.c \
|
||||
htsmd5.c htscodec.c htsproxy.c htszlib.c htswrap.c htsconcat.c \
|
||||
htsmodules.c htscharset.c punycode.c htsencoding.c htssniff.c \
|
||||
md5.c \
|
||||
minizip/ioapi.c minizip/mztools.c minizip/unzip.c minizip/zip.c \
|
||||
@@ -72,25 +72,20 @@ libhttrack_la_SOURCES = htscore.c htsparse.c htsback.c htscache.c \
|
||||
htshelp.h htsindex.h htslib.h htsmd5.h \
|
||||
htsmodules.h htsname.h htsnet.h htssniff.h \
|
||||
htsopt.h htsrobots.h htsthread.h \
|
||||
htstools.h htswizard.h htswrap.h htszlib.h \
|
||||
htstools.h htswizard.h htswrap.h htscodec.h htsproxy.h htszlib.h \
|
||||
htsstrings.h htsarrays.h httrack-library.h \
|
||||
htscharset.h punycode.h htsencoding.h \
|
||||
htsentities.h htsentities.sh htsbasiccharsets.sh htscodepages.h \
|
||||
md5.h coucal/murmurhash3.h \
|
||||
minizip/crypt.h minizip/ioapi.h minizip/mztools.h minizip/unzip.h minizip/zip.h
|
||||
libhttrack_la_LIBADD = $(THREADS_LIBS) $(ZLIB_LIBS) $(OPENSSL_LIBS) $(DL_LIBS) $(SOCKET_LIBS) $(ICONV_LIBS)
|
||||
libhttrack_la_LIBADD = $(THREADS_LIBS) $(ZLIB_LIBS) $(BROTLI_LIBS) $(ZSTD_LIBS) $(OPENSSL_LIBS) $(DL_LIBS) $(SOCKET_LIBS) $(ICONV_LIBS)
|
||||
libhttrack_la_CFLAGS = $(AM_CFLAGS) -DLIBHTTRACK_EXPORTS -DZLIB_CONST
|
||||
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 \
|
||||
version.rc \
|
||||
libhttrack.rc \
|
||||
httrack.rc \
|
||||
coucal/murmurhash3.h.diff \
|
||||
coucal/murmurhash3.h.orig \
|
||||
minizip/iowin32.c \
|
||||
@@ -113,13 +108,13 @@ EXTRA_DIST = httrack.h webhttrack \
|
||||
proxy/proxystrings.h \
|
||||
proxy/proxytrack.h \
|
||||
proxy/store.h \
|
||||
proxy/proxytrack.vcproj \
|
||||
coucal/LICENSE \
|
||||
coucal/Makefile \
|
||||
coucal/README.md \
|
||||
coucal/sample.c \
|
||||
coucal/tests.c \
|
||||
htsjava.vcproj \
|
||||
httrack.dsp httrack.dsw httrack.vcproj \
|
||||
libhttrack.dsp libhttrack.dsw libhttrack.vcproj \
|
||||
webhttrack.dsp webhttrack.dsw webhttrack.vcproj
|
||||
vcpkg.json \
|
||||
httrack.vcxproj \
|
||||
libhttrack.vcxproj \
|
||||
proxytrack.vcxproj \
|
||||
webhttrack.vcxproj
|
||||
|
||||
Submodule src/coucal updated: fadf29bd2a...ab59c6a7a0
235
src/htsback.c
235
src/htsback.c
@@ -44,6 +44,8 @@ Please visit our Website: http://www.httrack.com
|
||||
#include "htsback.h"
|
||||
|
||||
#include "htsftp.h"
|
||||
#include "htscodec.h"
|
||||
#include "htsproxy.h"
|
||||
#if HTS_USEZLIB
|
||||
#include "htszlib.h"
|
||||
#else
|
||||
@@ -138,8 +140,9 @@ 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():
|
||||
0 = connected, >0 = the connect errno (refused, unreachable, ...), -1 if the
|
||||
probe itself failed. A failed connect is reported writable too, so this is
|
||||
how success is told from failure without blocking. */
|
||||
probe itself failed. A failed connect is reported ready as well (writable on
|
||||
posix, exception set on winsock), so this is how success is told from failure
|
||||
without blocking. */
|
||||
static int connect_socket_error(T_SOC soc) {
|
||||
int soerr = 0;
|
||||
socklen_t len = (socklen_t) sizeof(soerr);
|
||||
@@ -556,6 +559,14 @@ static int create_back_tmpfile(httrackp *opt, lien_back *const back,
|
||||
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
|
||||
@@ -571,10 +582,9 @@ static void back_finalize_backup(httrackp *opt, lien_back *const back,
|
||||
fclose(back->r.out);
|
||||
back->r.out = NULL;
|
||||
}
|
||||
(void) UNLINK(back->url_sav); /* drop the failed partial */
|
||||
/* On rename failure keep the backup: it still holds the good copy, so
|
||||
losing it would be worse than an orphaned temp. */
|
||||
if (RENAME(back->tmpfile, back->url_sav) != 0)
|
||||
/* 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);
|
||||
@@ -618,6 +628,10 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -627,8 +641,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
||||
if (!back[p].testmode) { // not test mode
|
||||
const char *state = "unknown";
|
||||
|
||||
/* décompression */
|
||||
#if HTS_USEZLIB
|
||||
/* Undo the content coding */
|
||||
if (back[p].r.compressed) {
|
||||
if (back[p].r.size > 0) {
|
||||
// stats
|
||||
@@ -674,28 +687,67 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
||||
// décompression
|
||||
if (back[p].tmpfile != NULL) {
|
||||
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;
|
||||
|
||||
file_notify(opt, back[p].url_adr, back[p].url_fil,
|
||||
back[p].url_sav, 1, 1, back[p].r.notmodified);
|
||||
filecreateempty(&opt->state.strc, back[p].url_sav); // filenote & co
|
||||
if ((size = hts_zunpack(back[p].tmpfile, back[p].url_sav)) >= 0) {
|
||||
snprintf(unpacked, sizeof(unpacked), "%s.u", back[p].url_sav);
|
||||
if ((size = hts_codec_unpack(codec, back[p].tmpfile,
|
||||
unpacked)) >= 0) {
|
||||
back[p].r.size = back[p].r.totalsize = size;
|
||||
// fichier -> mémoire
|
||||
if (!back[p].r.is_write) {
|
||||
// fichier -> mémoire ; le fichier est écrit plus tard
|
||||
deleteaddr(&back[p].r);
|
||||
back[p].r.adr = readfile_utf8(back[p].url_sav);
|
||||
back[p].r.adr = readfile_utf8(unpacked);
|
||||
if (!back[p].r.adr) {
|
||||
back[p].r.statuscode = STATUSCODE_INVALID;
|
||||
strcpybuff(back[p].r.msg,
|
||||
"Read error when decompressing");
|
||||
}
|
||||
UNLINK(back[p].url_sav);
|
||||
UNLINK(unpacked);
|
||||
} 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 {
|
||||
back[p].r.statuscode = STATUSCODE_INVALID;
|
||||
strcpybuff(back[p].r.msg, "Error when decompressing");
|
||||
snprintf(back[p].r.msg, sizeof(back[p].r.msg),
|
||||
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 */
|
||||
unlink(back[p].tmpfile);
|
||||
@@ -708,7 +760,6 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
||||
// unflag
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Body fully received: keep the freshly written url_sav, drop the
|
||||
backup of the previous copy. */
|
||||
back_finalize_backup(opt, &back[p], HTS_TRUE);
|
||||
@@ -730,7 +781,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.is_write) { // Written file
|
||||
if (may_be_hypertext_mime(opt, back[p].r.contenttype, back[p].url_fil)) { // to parse!
|
||||
off_t sz;
|
||||
LLint sz;
|
||||
|
||||
sz = fsize_utf8(back[p].url_sav);
|
||||
if (sz > 0) { // ok, exists!
|
||||
@@ -807,7 +858,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
||||
else
|
||||
strcatbuff(flags, "-");
|
||||
if (back[p].r.compressed)
|
||||
strcatbuff(flags, "Z"); // gzip
|
||||
strcatbuff(flags, "Z"); // content coding
|
||||
else
|
||||
strcatbuff(flags, "-");
|
||||
/* Err I had to split these.. */
|
||||
@@ -816,9 +867,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback,
|
||||
fprintf(cache->txt, LLintP, (LLint) back[p].r.totalsize);
|
||||
fprintf(cache->txt, "\t%s\t", flags);
|
||||
}
|
||||
#if HTS_USEZLIB
|
||||
back[p].r.compressed = 0;
|
||||
#endif
|
||||
|
||||
if (back[p].r.statuscode == HTTP_OK) {
|
||||
if (back[p].r.size >= 0) {
|
||||
@@ -1909,7 +1958,7 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
||||
/* Not in cache ; maybe in temporary cache ? Warning: non-movable
|
||||
"url_sav" */
|
||||
else if (back_unserialize_ref(opt, adr, fil, &itemback) == 0) {
|
||||
const off_t file_size = fsize_utf8(itemback->url_sav);
|
||||
const LLint file_size = fsize_utf8(itemback->url_sav);
|
||||
|
||||
/* Found file on disk */
|
||||
if (file_size > 0) {
|
||||
@@ -1944,7 +1993,7 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
||||
}
|
||||
/* Not in cache or temporary cache ; found on disk ? (hack) */
|
||||
else if (fexist_utf8(save)) {
|
||||
const off_t sz = fsize_utf8(save);
|
||||
const LLint sz = fsize_utf8(save);
|
||||
|
||||
// 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)
|
||||
@@ -2068,6 +2117,17 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, const char
|
||||
"error: forbidden test with ftp link for back_add");
|
||||
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
|
||||
FTPDownloadStruct *str =
|
||||
(FTPDownloadStruct *) malloc(sizeof(FTPDownloadStruct));
|
||||
@@ -2603,7 +2663,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
for (i_mod = 0; i_mod < (unsigned int) back_max; i_mod++) {
|
||||
unsigned int i = (i_mod + mod_random) % (back_max);
|
||||
|
||||
if (back[i].status > 0) {
|
||||
// winsock flags a failed connect in the exception set only: leave a
|
||||
// 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.soc != INVALID_SOCKET) { // hey, you never know..
|
||||
int err = FD_ISSET(back[i].r.soc, &fds_e);
|
||||
@@ -2617,10 +2679,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
}
|
||||
back[i].r.soc = INVALID_SOCKET;
|
||||
back[i].r.statuscode = STATUSCODE_CONNERROR;
|
||||
if (back[i].status == STATUS_CONNECTING)
|
||||
strcpybuff(back[i].r.msg, "Connect Error");
|
||||
else
|
||||
strcpybuff(back[i].r.msg, "Receive Error");
|
||||
strcpybuff(back[i].r.msg, "Receive Error");
|
||||
if (back[i].status == STATUS_ALIVE) { /* Keep-alive socket */
|
||||
back_delete(opt, cache, sback, i);
|
||||
} else {
|
||||
@@ -2637,9 +2696,12 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
int dispo = 0;
|
||||
|
||||
// probe the resolved address list once per fresh connect (cache hit:
|
||||
// the host was resolved when this connect was opened)
|
||||
// the host was resolved when this connect was opened). Not under a
|
||||
// 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 &&
|
||||
!back[i].r.is_file) {
|
||||
!back[i].r.is_file && !back[i].r.req.proxy.active) {
|
||||
SOCaddr scratch[HTS_MAXADDRNUM];
|
||||
|
||||
cf->addr_count = hts_dns_resolve_all(opt, back[i].url_adr, scratch,
|
||||
@@ -2653,10 +2715,11 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
gestion_timeout = 1;
|
||||
|
||||
// connecté?
|
||||
dispo = FD_ISSET(back[i].r.soc, &fds_c);
|
||||
dispo = back[i].r.soc != INVALID_SOCKET &&
|
||||
(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)
|
||||
// a refused/failed connect is reported writable too; probe SO_ERROR
|
||||
// and, on failure, fall back to the next address (or fail the slot)
|
||||
// probe SO_ERROR and, on failure, fall back to the next address
|
||||
if (connect_socket_error(back[i].r.soc) != 0) {
|
||||
if (!back_connect_next(opt, sback, i)) {
|
||||
deletehttp(&back[i].r);
|
||||
@@ -2670,13 +2733,62 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
}
|
||||
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
|
||||
/* SSL mode */
|
||||
if (back[i].r.ssl) {
|
||||
int tunnel_ok = 1;
|
||||
|
||||
// https via proxy: CONNECT-tunnel before TLS (#85)
|
||||
if (back[i].r.req.proxy.active && back[i].r.ssl_con == NULL) {
|
||||
// https via an http proxy: CONNECT-tunnel before TLS (#85); socks
|
||||
// already carries the origin connection
|
||||
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;
|
||||
|
||||
tunnel_ok =
|
||||
@@ -2941,11 +3053,13 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
int last_errno = 0;
|
||||
|
||||
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 &&
|
||||
/* .gz are *NOT* depacked!! */
|
||||
strfield(get_ext(catbuff, sizeof(catbuff), back[i].url_sav), "gz") == 0
|
||||
&& strfield(get_ext(catbuff, sizeof(catbuff), back[i].url_sav), "tgz") == 0
|
||||
) {
|
||||
!hts_codec_is_archive_ext(
|
||||
hts_codec_parse(back[i].r.contentencoding),
|
||||
get_ext(catbuff, sizeof(catbuff),
|
||||
back[i].url_sav))) {
|
||||
if (create_back_tmpfile(opt, &back[i], "z") ==
|
||||
0) {
|
||||
assertf(back[i].tmpfile != NULL);
|
||||
@@ -3221,16 +3335,26 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
back[i].chunk_blocksize = -1; /* ending */
|
||||
back[i].r.totalsize += chunk_size; // noter taille
|
||||
if (back[i].r.adr != NULL || !back[i].r.is_write) { // Not to disk
|
||||
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);
|
||||
// totalsize sums attacker-declared chunk sizes; past
|
||||
// 2GB the (size_t) cast below truncates on 32-bit and
|
||||
// under-allocates. Mark the chunk invalid so the shared
|
||||
// error path tears the transfer down.
|
||||
if (back[i].r.totalsize > INT32_MAX) {
|
||||
hts_log_print(opt, LOG_WARNING,
|
||||
"Chunked resource too large for %s%s",
|
||||
back[i].url_adr, back[i].url_fil);
|
||||
chunk_size = -1;
|
||||
} else {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3611,7 +3735,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
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 (strnotempty(back[i].url_sav)) { // target found
|
||||
off_t size = fsize_utf8(back[i].url_sav);
|
||||
LLint size = fsize_utf8(back[i].url_sav);
|
||||
|
||||
if (size >= 0) {
|
||||
if (back[i].r.totalsize == size) { // same size!
|
||||
@@ -3830,7 +3954,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
// traiter 206 (partial content)
|
||||
// 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!
|
||||
off_t sz = fsize_utf8(back[i].url_sav);
|
||||
LLint sz = fsize_utf8(back[i].url_sav);
|
||||
/* RFC 7233: resume at the server's Content-Range start,
|
||||
not the offset we requested; a server may resume
|
||||
earlier and appending the overlap duplicates bytes
|
||||
@@ -3868,8 +3992,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
// drop bytes past the resume point; a silent
|
||||
// failure could leave a stale tail, so on error
|
||||
// drop the partial and refetch the whole file
|
||||
if (HTS_FTRUNCATE(back[i].r.out,
|
||||
(off_t) resume) != 0) {
|
||||
/* not (off_t): 32-bit on MSVC, wrapping a resume
|
||||
past 2GB */
|
||||
if (HTS_FTRUNCATE(back[i].r.out, resume) != 0) {
|
||||
fclose(back[i].r.out);
|
||||
back[i].r.out = NULL;
|
||||
url_savename_refname_remove(
|
||||
@@ -3881,7 +4006,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
"Can not truncate partial file, "
|
||||
"restarting");
|
||||
} else {
|
||||
fseeko(back[i].r.out, (off_t) resume, SEEK_SET);
|
||||
/* not (off_t): 32-bit on MSVC, truncating a
|
||||
resume past 2GB */
|
||||
fseeko(back[i].r.out, resume, SEEK_SET);
|
||||
/* create a temporary reference file in case of
|
||||
* broken mirror */
|
||||
if (back_serialize_ref(opt, &back[i]) != 0) {
|
||||
|
||||
@@ -356,7 +356,7 @@ void cache_add(httrackp * opt, cache_back * cache, const htsblk * r,
|
||||
FILE *fp;
|
||||
|
||||
// On recopie le fichier->.
|
||||
off_t file_size = fsize_utf8(fconv(catbuff, sizeof(catbuff), url_save));
|
||||
LLint file_size = fsize_utf8(fconv(catbuff, sizeof(catbuff), url_save));
|
||||
|
||||
if (file_size >= 0) {
|
||||
fp = FOPEN(fconv(catbuff, sizeof(catbuff), url_save), "rb");
|
||||
@@ -1241,23 +1241,27 @@ char *readfile(const char *fil) {
|
||||
char *readfile2(const char *fil, LLint * size) {
|
||||
char *adr = NULL;
|
||||
char catbuff[CATBUFF_SIZE];
|
||||
INTsys len = 0;
|
||||
const LLint len = fsize(fil);
|
||||
|
||||
len = fsize(fil);
|
||||
if (len >= 0) { // exists
|
||||
/* a size too large for size_t (32-bit Windows/i386) must fail closed: it
|
||||
would wrap malloct() short while fread() still read the untruncated len */
|
||||
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;
|
||||
|
||||
fp = fopen(fconv(catbuff, sizeof(catbuff), fil), "rb");
|
||||
if (fp != NULL) { // n'existe pas (!)
|
||||
adr = (char *) malloct(len + 1);
|
||||
adr = (char *) malloct(buflen + 1);
|
||||
if (size != NULL)
|
||||
*size = len;
|
||||
if (adr != NULL) {
|
||||
if (len > 0 && fread(adr, 1, len, fp) != len) { // fichier endommagé ?
|
||||
if (buflen > 0 &&
|
||||
fread(adr, 1, buflen, fp) != buflen) { // fichier endommagé ?
|
||||
freet(adr);
|
||||
adr = NULL;
|
||||
} else
|
||||
*(adr + len) = '\0';
|
||||
*(adr + buflen) = '\0';
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
@@ -1269,19 +1273,21 @@ char *readfile2(const char *fil, LLint * size) {
|
||||
char *readfile_utf8(const char *fil) {
|
||||
char *adr = NULL;
|
||||
char catbuff[CATBUFF_SIZE];
|
||||
const off_t len = fsize_utf8(fil);
|
||||
const LLint len = fsize_utf8(fil);
|
||||
const size_t buflen = len >= 0 ? llint_to_size_t(len) : (size_t) -1;
|
||||
|
||||
if (len >= 0) { // exists
|
||||
if (buflen != (size_t) -1) { // exists, and is addressable (see readfile2)
|
||||
FILE *const fp = FOPEN(fconv(catbuff, sizeof(catbuff), fil), "rb");
|
||||
|
||||
if (fp != NULL) { // n'existe pas (!)
|
||||
adr = (char *) malloct(len + 1);
|
||||
adr = (char *) malloct(buflen + 1);
|
||||
if (adr != NULL) {
|
||||
if (len > 0 && fread(adr, 1, len, fp) != len) { // fichier endommagé ?
|
||||
if (buflen > 0 &&
|
||||
fread(adr, 1, buflen, fp) != buflen) { // fichier endommagé ?
|
||||
freet(adr);
|
||||
adr = NULL;
|
||||
} else {
|
||||
adr[len] = '\0';
|
||||
adr[buflen] = '\0';
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
@@ -232,11 +232,10 @@ static int disk_fallback_selftest(httrackp *opt) {
|
||||
static const char body[] = "BINARY-on-disk-body-0123456789-no-trailing-nul";
|
||||
const size_t body_len = sizeof(body) - 1;
|
||||
|
||||
/* X-Save must start with path_html_utf8 so the reader resolves it verbatim
|
||||
(otherwise it re-roots it as a pre-3.40 relative path); then the body we
|
||||
create at fconv(save) is exactly where cache_readex looks for it. */
|
||||
fconcat(save, sizeof(save), StringBuff(opt->path_html_utf8),
|
||||
"example.com/blob.bin");
|
||||
/* a DOS-ified X-Save loses the path_html_utf8 prefix the reader matches on,
|
||||
and gets re-rooted as a pre-3.40 relative path; fconv() only on access */
|
||||
concat(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 */
|
||||
selftest_open_for_write(&cache, opt);
|
||||
@@ -939,9 +938,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. */
|
||||
static int reconcile_expect(httrackp *opt, const char *name, off_t size,
|
||||
static int reconcile_expect(httrackp *opt, const char *name, LLint size,
|
||||
const char *what) {
|
||||
const off_t got = fsize(reconcile_st_path(opt, name));
|
||||
const LLint got = fsize(reconcile_st_path(opt, name));
|
||||
|
||||
if (got != size) {
|
||||
fprintf(stderr, "cache-reconcile: %s: %s is %d bytes, expected %d\n", what,
|
||||
@@ -955,7 +954,7 @@ int cache_reconcile_selftest(httrackp *opt, const char *dir) {
|
||||
int failures = 0;
|
||||
|
||||
/* around the interrupted-run thresholds (new < 32768, old > 65536) */
|
||||
static const off_t TINY = 1024, MID = 40000, SOLID = 131072;
|
||||
static const LLint TINY = 1024, MID = 40000, SOLID = 131072;
|
||||
|
||||
golden_setup(opt, dir);
|
||||
#ifdef _WIN32
|
||||
@@ -1253,8 +1252,9 @@ static void corrupt_build_disk(httrackp *opt) {
|
||||
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/old.zip"));
|
||||
fconcat(save, sizeof(save), StringBuff(opt->path_html_utf8),
|
||||
CORRUPT_ADR "/victim.bin");
|
||||
/* X-Save stored verbatim: see disk_fallback_selftest */
|
||||
concat(save, sizeof(save), StringBuff(opt->path_html_utf8),
|
||||
CORRUPT_ADR "/victim.bin");
|
||||
selftest_open_for_write(&cache, opt);
|
||||
store_entry(opt, &cache, CORRUPT_ADR, "/canary.html", "canary.html", 200,
|
||||
"OK", "text/html", "utf-8", "", "", "", "", corrupt_body_a,
|
||||
|
||||
@@ -31,6 +31,9 @@ Please visit our Website: http://www.httrack.com
|
||||
/* ------------------------------------------------------------ */
|
||||
|
||||
#include "htscharset.h"
|
||||
#ifdef _WIN32
|
||||
#include <shellapi.h>
|
||||
#endif
|
||||
#include "htsbase.h"
|
||||
#include "punycode.h"
|
||||
#include "htssafe.h"
|
||||
@@ -382,10 +385,44 @@ char *hts_convertStringFromUTF8(const char *s, size_t size, const char *charset)
|
||||
return hts_convertStringCPFromUTF8(s, size, cp);
|
||||
}
|
||||
|
||||
char *hts_convertStringSystemToUTF8(const char *s, size_t size) {
|
||||
HTSEXT_API char *hts_convertStringSystemToUTF8(const char *s, size_t size) {
|
||||
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
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
@@ -34,6 +34,7 @@ Please visit our Website: http://www.httrack.com
|
||||
#define HTS_CHARSET_DEFH
|
||||
|
||||
/** Standard includes. **/
|
||||
#include "htsglobal.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#ifdef _WIN32
|
||||
@@ -174,7 +175,16 @@ extern char *hts_convertUCS2StringToUTF8(LPWSTR woutput, int wsize);
|
||||
* Convert current system codepage to UTF-8.
|
||||
* This function is WIN32 specific.
|
||||
**/
|
||||
extern char *hts_convertStringSystemToUTF8(const char *s, size_t size);
|
||||
HTSEXT_API 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
|
||||
|
||||
366
src/htscodec.c
Normal file
366
src/htscodec.c
Normal file
@@ -0,0 +1,366 @@
|
||||
/* ------------------------------------------------------------ */
|
||||
/*
|
||||
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;
|
||||
}
|
||||
}
|
||||
79
src/htscodec.h
Normal file
79
src/htscodec.h
Normal file
@@ -0,0 +1,79 @@
|
||||
/* ------------------------------------------------------------ */
|
||||
/*
|
||||
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;
|
||||
size_t filelist_sz = 0;
|
||||
const char *filelist_err = NULL; /* failure reason, NULL on success */
|
||||
const off_t fs = fsize(StringBuff(opt->filelist));
|
||||
const LLint fs = fsize(StringBuff(opt->filelist));
|
||||
|
||||
if (fs < 0) {
|
||||
/* 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
|
||||
? strerror(errno)
|
||||
: "not a regular file";
|
||||
} else if ((filelist_sz = off_t_to_size_t(fs)) == (size_t) -1) {
|
||||
} else if ((filelist_sz = llint_to_size_t(fs)) == (size_t) -1) {
|
||||
filelist_err = "file too large";
|
||||
filelist_sz = 0;
|
||||
} else {
|
||||
@@ -2089,10 +2089,9 @@ int httpmirror(char *url1, httrackp * opt) {
|
||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
||||
"hts-cache/old.lst"), "rb");
|
||||
if (old_lst) {
|
||||
const size_t sz =
|
||||
off_t_to_size_t(fsize(fconcat
|
||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
||||
"hts-cache/new.lst")));
|
||||
const size_t sz = llint_to_size_t(
|
||||
fsize(fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt),
|
||||
StringBuff(opt->path_log), "hts-cache/new.lst")));
|
||||
new_lst =
|
||||
fopen(fconcat
|
||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_log),
|
||||
@@ -3875,7 +3874,6 @@ void voidf(void) {
|
||||
a = "| HTTrack Website Copier |" CRLF;
|
||||
a = "|Code: Windows Interface Xavier Roche |" CRLF;
|
||||
a = "| HTS/HTTrack Xavier Roche |" CRLF;
|
||||
a = "| .class Parser Yann Philippot |" CRLF;
|
||||
a = "| |" CRLF;
|
||||
a = "|Tested on: Windows95,98,NT,2K |" CRLF;
|
||||
a = "| Linux PC |" CRLF;
|
||||
|
||||
@@ -1452,7 +1452,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
||||
if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) {
|
||||
HTS_PANIC_PRINTF
|
||||
("Option %w needs to be followed by a blank space, and a module name");
|
||||
printf("Example: -%%w htsswf\n");
|
||||
printf("Example: -%%w httrack-plugin\n");
|
||||
htsmain_free();
|
||||
return -1;
|
||||
} else {
|
||||
@@ -1509,7 +1509,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
||||
htsmain_free();
|
||||
return -1;
|
||||
} else {
|
||||
off_t fz;
|
||||
LLint fz;
|
||||
|
||||
na++;
|
||||
fz = fsize(argv[na]);
|
||||
@@ -2253,21 +2253,12 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
||||
htsmain_free();
|
||||
return -1;
|
||||
} else {
|
||||
char *a;
|
||||
char BIGSTK pname[HTS_URLMAXSIZE * 2];
|
||||
|
||||
na++;
|
||||
opt->proxy.active = 1;
|
||||
// Rechercher MAIS en partant de la fin à cause de user:pass@proxy:port
|
||||
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]);
|
||||
}
|
||||
hts_parse_proxy(argv[na], pname, sizeof(pname), &opt->proxy.port);
|
||||
StringCopy(opt->proxy.name, pname);
|
||||
}
|
||||
break;
|
||||
case 'F': // user-agent field
|
||||
@@ -2593,21 +2584,11 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
||||
hts_get_version_info(opt), t, url);
|
||||
fprintf(opt->log, "(");
|
||||
for(i = 0; i < argc; i++) {
|
||||
#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
|
||||
const char *arg = argv[i]; // already UTF-8 on every platform
|
||||
if (strchr(arg, ' ') == NULL || strchr(arg, '\"') != NULL)
|
||||
fprintf(opt->log, "%s ", arg);
|
||||
else // entre "" (si espace(s) et pas déja de ")
|
||||
fprintf(opt->log, "\"%s\" ", arg);
|
||||
#ifdef _WIN32
|
||||
if (carg != NULL)
|
||||
free(carg);
|
||||
#endif
|
||||
}
|
||||
fprintf(opt->log, ")" LF);
|
||||
fprintf(opt->log, LF);
|
||||
|
||||
@@ -70,7 +70,7 @@ typedef struct t_hts_callbackarg t_hts_callbackarg;
|
||||
#endif
|
||||
|
||||
/* Marks a symbol an external wrapper module exports back to the engine.
|
||||
Must override -fvisibility=hidden on ELF, or dlopen()ed plugins (htsjava)
|
||||
Must override -fvisibility=hidden on ELF, or dlopen()ed plugins
|
||||
hide their own hts_plug()/hts_unplug() entry points. */
|
||||
#ifndef EXTERNAL_FUNCTION
|
||||
#ifdef _WIN32
|
||||
|
||||
@@ -133,9 +133,10 @@ static struct addrinfo *mock_mkai(const mock_addr *a) {
|
||||
return ai;
|
||||
}
|
||||
|
||||
static int mock_getaddrinfo(const char *node, const char *service,
|
||||
const struct addrinfo *hints,
|
||||
struct addrinfo **res) {
|
||||
static int HTS_RESOLVER_CALL mock_getaddrinfo(const char *node,
|
||||
const char *service,
|
||||
const struct addrinfo *hints,
|
||||
struct addrinfo **res) {
|
||||
mock_host *const h = mock_find(node);
|
||||
const int want = (hints != NULL) ? hints->ai_family : PF_UNSPEC;
|
||||
struct addrinfo *head = NULL, *tail = NULL;
|
||||
@@ -164,7 +165,7 @@ static int mock_getaddrinfo(const char *node, const char *service,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mock_freeaddrinfo(struct addrinfo *res) {
|
||||
static void HTS_RESOLVER_CALL mock_freeaddrinfo(struct addrinfo *res) {
|
||||
while (res != NULL) {
|
||||
struct addrinfo *const next = res->ai_next;
|
||||
|
||||
|
||||
@@ -122,8 +122,11 @@ int fa_strjoker_dual(int type, char **filters, int nfil, const char *nom1,
|
||||
}
|
||||
|
||||
/* Real filters/URLs fit HTS_URLMAXSIZE*2; past it a hostile pattern recurses
|
||||
O(len) deep or runs O(n^2*stars). Cap length (depth) and steps (work). */
|
||||
O(len) deep or runs O(n^2*stars). Cap length, recursion depth and steps
|
||||
(work): the length cap alone still allows ~2000 frames, ~900KB of stack,
|
||||
which overflows the 1MB a Windows thread gets (#574). */
|
||||
#define STRJOKER_MAXLEN (HTS_URLMAXSIZE * 2)
|
||||
#define STRJOKER_MAXDEPTH 256u
|
||||
#define STRJOKER_MAXSTEPS 2000000u
|
||||
|
||||
/* Failure memo for the recursive matcher: one bit per (chaine, joker) offset
|
||||
@@ -133,30 +136,41 @@ typedef struct strjoker_memo {
|
||||
size_t stride; /* strlen(joker0) + 1 */
|
||||
unsigned char *failed; /* failed-pair bitmap; NULL: no memo */
|
||||
size_t *nsteps; /* shared work counter; NULL: unbounded (oracle) */
|
||||
size_t maxdepth; /* deepest recursion reached */
|
||||
hts_boolean cut; /* a branch hit the depth cap: its failures are not final */
|
||||
} strjoker_memo;
|
||||
|
||||
static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
||||
const char *joker, LLint *size,
|
||||
int *size_flag);
|
||||
static const char *strjoker_impl(strjoker_memo *memo, const char *chaine,
|
||||
const char *joker, LLint *size, int *size_flag,
|
||||
size_t depth);
|
||||
|
||||
/* A pair that failed once fails forever (*size is only written on the success
|
||||
path), so record NULL results and cut the re-exploration. */
|
||||
static const char *strjoker_rec(const strjoker_memo *memo, const char *chaine,
|
||||
const char *joker, LLint *size,
|
||||
int *size_flag) {
|
||||
static const char *strjoker_rec(strjoker_memo *memo, const char *chaine,
|
||||
const char *joker, LLint *size, int *size_flag,
|
||||
size_t depth) {
|
||||
size_t bit = 0;
|
||||
const char *adr;
|
||||
|
||||
if (depth > memo->maxdepth)
|
||||
memo->maxdepth = depth;
|
||||
/* Charge the budget before the depth cap: cut disables the memo, so uncounted
|
||||
deep calls would let the sub-cap search explode (OSS-Fuzz 535114376). */
|
||||
if (memo->nsteps != NULL && ++*memo->nsteps > STRJOKER_MAXSTEPS)
|
||||
return NULL; /* work budget spent: fail the match safely */
|
||||
if (depth >= STRJOKER_MAXDEPTH) {
|
||||
memo->cut = HTS_TRUE;
|
||||
return NULL; /* nesting beyond any real filter: fail the branch safely */
|
||||
}
|
||||
if (memo->failed) {
|
||||
bit = (size_t) (chaine - memo->chaine0) * memo->stride +
|
||||
(size_t) (joker - memo->joker0);
|
||||
if (memo->failed[bit >> 3] & (unsigned char) (1u << (bit & 7)))
|
||||
return NULL;
|
||||
}
|
||||
adr = strjoker_impl(memo, chaine, joker, size, size_flag);
|
||||
if (adr == NULL && memo->failed)
|
||||
adr = strjoker_impl(memo, chaine, joker, size, size_flag, depth + 1);
|
||||
/* a cut branch may fail here yet match when reached at a shallower depth */
|
||||
if (adr == NULL && memo->failed && !memo->cut)
|
||||
memo->failed[bit >> 3] |= (unsigned char) (1u << (bit & 7));
|
||||
return adr;
|
||||
}
|
||||
@@ -164,13 +178,15 @@ static const char *strjoker_rec(const strjoker_memo *memo, const char *chaine,
|
||||
/* Match chaine against joker with a shared work budget *nsteps (a strjokerfind
|
||||
sweep passes one counter, bounding the whole scan). */
|
||||
static const char *strjoker_bounded(const char *chaine, const char *joker,
|
||||
LLint *size, int *size_flag,
|
||||
size_t *nsteps) {
|
||||
strjoker_memo memo = {chaine, joker, 0, NULL, nsteps};
|
||||
LLint *size, int *size_flag, size_t *nsteps,
|
||||
size_t *maxdepth) {
|
||||
strjoker_memo memo = {chaine, joker, 0, NULL, nsteps, 0, HTS_FALSE};
|
||||
unsigned char stackbits[2048];
|
||||
hts_boolean onheap = HTS_FALSE;
|
||||
const char *adr;
|
||||
|
||||
if (maxdepth != NULL)
|
||||
*maxdepth = 0;
|
||||
if (chaine != NULL && joker != NULL) {
|
||||
const size_t l1 = strlen(chaine), l2 = strlen(joker);
|
||||
|
||||
@@ -189,9 +205,11 @@ static const char *strjoker_bounded(const char *chaine, const char *joker,
|
||||
}
|
||||
}
|
||||
}
|
||||
adr = strjoker_rec(&memo, chaine, joker, size, size_flag);
|
||||
adr = strjoker_rec(&memo, chaine, joker, size, size_flag, 0);
|
||||
if (onheap)
|
||||
freet(memo.failed);
|
||||
if (maxdepth != NULL)
|
||||
*maxdepth = memo.maxdepth;
|
||||
return adr;
|
||||
}
|
||||
|
||||
@@ -202,20 +220,39 @@ HTS_INLINE const char *strjoker(const char *chaine, const char *joker,
|
||||
LLint *size, int *size_flag) {
|
||||
size_t nsteps = 0;
|
||||
|
||||
return strjoker_bounded(chaine, joker, size, size_flag, &nsteps);
|
||||
return strjoker_bounded(chaine, joker, size, size_flag, &nsteps, NULL);
|
||||
}
|
||||
|
||||
/* Test-only oracle: the same matcher without the failure memo. */
|
||||
const char *strjoker_nomemo(const char *chaine, const char *joker, LLint *size,
|
||||
int *size_flag) {
|
||||
const strjoker_memo memo = {chaine, joker, 0, NULL};
|
||||
strjoker_memo memo = {chaine, joker, 0, NULL, NULL, 0, HTS_FALSE};
|
||||
|
||||
return strjoker_rec(&memo, chaine, joker, size, size_flag);
|
||||
return strjoker_rec(&memo, chaine, joker, size, size_flag, 0);
|
||||
}
|
||||
|
||||
static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
||||
const char *joker, LLint *size,
|
||||
int *size_flag) {
|
||||
/* Test-only: strjoker() reporting the work and depth spent and their caps, so a
|
||||
self-test can prove both bound a hostile pattern. */
|
||||
const char *strjoker_bounds(const char *chaine, const char *joker,
|
||||
size_t *nsteps_out, size_t *maxsteps_out,
|
||||
size_t *depth_out, size_t *maxdepth_out) {
|
||||
size_t nsteps = 0, depth = 0;
|
||||
const char *r = strjoker_bounded(chaine, joker, NULL, NULL, &nsteps, &depth);
|
||||
|
||||
if (nsteps_out != NULL)
|
||||
*nsteps_out = nsteps;
|
||||
if (maxsteps_out != NULL)
|
||||
*maxsteps_out = STRJOKER_MAXSTEPS;
|
||||
if (depth_out != NULL)
|
||||
*depth_out = depth;
|
||||
if (maxdepth_out != NULL)
|
||||
*maxdepth_out = STRJOKER_MAXDEPTH;
|
||||
return r;
|
||||
}
|
||||
|
||||
static const char *strjoker_impl(strjoker_memo *memo, const char *chaine,
|
||||
const char *joker, LLint *size, int *size_flag,
|
||||
size_t depth) {
|
||||
if (strnotempty(joker) == 0) { // fin de chaine joker
|
||||
if (strnotempty(chaine) == 0) // fin aussi pour la chaine: ok
|
||||
return chaine;
|
||||
@@ -389,7 +426,8 @@ static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
||||
|
||||
// tester sans le joker (pas ()+ mais ()*)
|
||||
if (!unique) {
|
||||
if ((adr = strjoker_rec(memo, chaine, joker + jmp, size, size_flag))) {
|
||||
if ((adr = strjoker_rec(memo, chaine, joker + jmp, size, size_flag,
|
||||
depth))) {
|
||||
return adr;
|
||||
}
|
||||
}
|
||||
@@ -402,7 +440,7 @@ static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
||||
while(i < (int) max) {
|
||||
if (pass[(int) (unsigned char) chaine[i]]) { // caractère autorisé
|
||||
if ((adr = strjoker_rec(memo, chaine + i + 1, joker + jmp, size,
|
||||
size_flag))) {
|
||||
size_flag, depth))) {
|
||||
return adr;
|
||||
}
|
||||
i++;
|
||||
@@ -413,7 +451,7 @@ static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
||||
// tester chaîne vide
|
||||
if (i != max + 2) // avant c'est ok
|
||||
if ((adr = strjoker_rec(memo, chaine + max, joker + jmp, size,
|
||||
size_flag)))
|
||||
size_flag, depth)))
|
||||
return adr;
|
||||
|
||||
return NULL; // perdu
|
||||
@@ -435,7 +473,8 @@ static const char *strjoker_impl(const strjoker_memo *memo, const char *chaine,
|
||||
// comparaison ok?
|
||||
if (ok) {
|
||||
// continuer la comparaison.
|
||||
if (strjoker_rec(memo, chaine + jmp, joker + jmp, size, size_flag))
|
||||
if (strjoker_rec(memo, chaine + jmp, joker + jmp, size, size_flag,
|
||||
depth))
|
||||
return chaine; // retourner 1e lettre
|
||||
}
|
||||
|
||||
@@ -457,8 +496,8 @@ const char *strjokerfind(const char *chaine, const char *joker) {
|
||||
if (chaine != NULL && strlen(chaine) > STRJOKER_MAXLEN)
|
||||
return NULL;
|
||||
while(*chaine) {
|
||||
if ((adr = strjoker_bounded(chaine, joker, NULL, NULL,
|
||||
&nsteps))) { // ok trouvé
|
||||
if ((adr = strjoker_bounded(chaine, joker, NULL, NULL, &nsteps,
|
||||
NULL))) { // ok trouvé
|
||||
return adr;
|
||||
}
|
||||
if (nsteps > STRJOKER_MAXSTEPS) // scan budget spent: no match
|
||||
|
||||
@@ -52,6 +52,12 @@ HTS_INLINE const char *strjoker(const char *chaine, const char *joker, LLint * s
|
||||
oracle for the memoized matcher. */
|
||||
const char *strjoker_nomemo(const char *chaine, const char *joker, LLint *size,
|
||||
int *size_flag);
|
||||
/* strjoker() reporting the work-budget steps and the recursion depth it spent,
|
||||
with their caps; test-only, lets a self-test assert both bound a hostile
|
||||
pattern (depth bounds the stack: an uncapped one overflows Windows' 1MB). */
|
||||
const char *strjoker_bounds(const char *chaine, const char *joker,
|
||||
size_t *nsteps_out, size_t *maxsteps_out,
|
||||
size_t *depth_out, size_t *maxdepth_out);
|
||||
const char *strjokerfind(const char *chaine, const char *joker);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -140,6 +140,15 @@ Please visit our Website: http://www.httrack.com
|
||||
#define HTS_USEZLIB 1
|
||||
#endif
|
||||
|
||||
// brotli and zstd content codings; off unless the build opted in (configure,
|
||||
// or the Visual Studio projects, which link the vcpkg libraries)
|
||||
#ifndef HTS_USEBROTLI
|
||||
#define HTS_USEBROTLI 0
|
||||
#endif
|
||||
#ifndef HTS_USEZSTD
|
||||
#define HTS_USEZSTD 0
|
||||
#endif
|
||||
|
||||
#ifndef HTS_INET6
|
||||
#define HTS_INET6 0
|
||||
#endif
|
||||
@@ -313,16 +322,13 @@ typedef int64_t TStamp;
|
||||
/* Full printf conversion, '%' included (PRId64 has none): "X: " LLintP. */
|
||||
#define LLintP "%" PRId64
|
||||
|
||||
/* Integer type for file offsets/sizes passed to the C library. Widens to
|
||||
LLint (with HTS_FSEEKO for fseeko/ftello) under large-file support, plain
|
||||
int otherwise; INTsysP is its printf conversion. */
|
||||
#ifdef LFS_FLAG
|
||||
/* Integer type for file offsets/sizes passed to the C library; INTsysP is its
|
||||
printf conversion. HTS_LFS is the large-file macro: LFS_FLAG is a configure
|
||||
make variable carrying the -D flags, never itself defined. */
|
||||
#if defined(HTS_LFS) || defined(_MSC_VER)
|
||||
typedef LLint INTsys;
|
||||
|
||||
#define INTsysP LLintP
|
||||
#ifdef __linux
|
||||
#define HTS_FSEEKO
|
||||
#endif
|
||||
#else
|
||||
typedef int INTsys;
|
||||
|
||||
|
||||
@@ -477,7 +477,7 @@ void help(const char *app, int more) {
|
||||
(" Y mirror ALL links located in the first level pages (mirror links)");
|
||||
infomsg("");
|
||||
infomsg("Proxy options:");
|
||||
infomsg(" P proxy use (-P proxy:port or -P user:pass@proxy:port)");
|
||||
infomsg(" P proxy use (-P [socks5://|connect://][user:pass@]proxy:port)");
|
||||
infomsg(" %f *use proxy for ftp (f0 don't use)");
|
||||
infomsg(" %b use this local hostname to make/send requests (-%b hostname)");
|
||||
infomsg("");
|
||||
@@ -546,8 +546,8 @@ void help(const char *app, int more) {
|
||||
infomsg(" %Y explain which filter rule accepts or rejects a URL, then exit");
|
||||
infomsg
|
||||
(" u check document type if unknown (cgi,asp..) (u0 don't check, * u1 check but /, u2 check always)");
|
||||
infomsg
|
||||
(" j *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)");
|
||||
infomsg(" j *parse scripts (j0 don't parse, bitmask: |1 parse default, |4 "
|
||||
"don't parse .js |8 don't be aggressive)");
|
||||
infomsg
|
||||
(" sN follow robots.txt and meta robots tags (0=never,1=sometimes,* 2=always, 3=always (even strict rules))");
|
||||
infomsg
|
||||
@@ -571,8 +571,7 @@ void help(const char *app, int more) {
|
||||
(" can also be used to force a specific file type: --assume foo.cgi=text/html");
|
||||
infomsg
|
||||
(" @iN internet protocol (0=both ipv6+ipv4, 4=ipv4 only, 6=ipv6 only)");
|
||||
infomsg
|
||||
(" %w disable a specific external mime module (-%w htsswf -%w htsjava)");
|
||||
infomsg(" %w disable a specific external mime module (-%w httrack-plugin)");
|
||||
infomsg("");
|
||||
infomsg("Browser ID:");
|
||||
infomsg
|
||||
|
||||
@@ -318,7 +318,7 @@ void index_finish(const char *indexpath, int mode) {
|
||||
char catbuff[CATBUFF_SIZE];
|
||||
char **tab;
|
||||
char *blk;
|
||||
off_t size = fpsize(fp_tmpproject);
|
||||
LLint size = fpsize(fp_tmpproject);
|
||||
|
||||
if (size > 0) {
|
||||
if (fp_tmpproject) {
|
||||
|
||||
517
src/htsjava.c
517
src/htsjava.c
@@ -1,517 +0,0 @@
|
||||
/* ------------------------------------------------------------ */
|
||||
/*
|
||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||
Copyright (C) 1998 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: Java classes parser */
|
||||
/* Author: Yann Philippot */
|
||||
/* ------------------------------------------------------------ */
|
||||
|
||||
/* Version: Oct/2000 */
|
||||
/* Fixed: problems with class structure (10/2000) */
|
||||
|
||||
// htsjava.c - Parseur de classes java
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#if ( defined(_WIN32) ||defined(HAVE_SYS_TYPES_H) )
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
/* Standard httrack module includes */
|
||||
#include "httrack-library.h"
|
||||
#include "htsopt.h"
|
||||
#include "htsdefines.h"
|
||||
|
||||
/* Module structures */
|
||||
#include "htsmodules.h"
|
||||
|
||||
/* We link to libhttrack, we can use its functions */
|
||||
#include "httrack-library.h"
|
||||
|
||||
/* This file */
|
||||
#include "htsjava.h"
|
||||
|
||||
/* calloct/freet wrappers */
|
||||
#include "htssafe.h"
|
||||
|
||||
static int reverse_endian(void) {
|
||||
int endian = 1;
|
||||
|
||||
return (*((char *) &endian) == 1);
|
||||
}
|
||||
|
||||
/* big/little endian swap */
|
||||
#define hts_swap16(A) ( (((A) & 0xFF)<<8) | (((A) & 0xFF00)>>8) )
|
||||
#define hts_swap32(A) ( (( (hts_swap16(A)) & 0xFFFF)<<16) | (( (hts_swap16(A>>16)) & 0xFFFF)) )
|
||||
|
||||
/* Static definitions */
|
||||
static RESP_STRUCT readtable(htsmoduleStruct * str, FILE * fp, RESP_STRUCT,
|
||||
int *);
|
||||
static unsigned short int readshort(FILE * fp);
|
||||
static int tris(httrackp * opt, char *);
|
||||
static char *printname(char[1024], char[1024]);
|
||||
|
||||
// ** HTS_xx sinon pas pris par VC++
|
||||
#define HTS_CLASS 7
|
||||
#define HTS_FIELDREF 9
|
||||
#define HTS_METHODREF 10
|
||||
#define HTS_STRING 8
|
||||
#define HTS_INTEGER 3
|
||||
#define HTS_FLOAT 4
|
||||
#define HTS_LONG 5
|
||||
#define HTS_DOUBLE 6
|
||||
#define HTS_INTERFACE 11
|
||||
#define HTS_NAMEANDTYPE 12
|
||||
#define HTS_ASCIZ 1
|
||||
#define HTS_UNICODE 2
|
||||
|
||||
#define JAVADEBUG 0
|
||||
|
||||
static const char *libName = "htsjava";
|
||||
|
||||
#ifdef _WIN32
|
||||
#define strcasecmp(a,b) stricmp(a,b)
|
||||
#define strncasecmp(a,b,n) strnicmp(a,b,n)
|
||||
#endif
|
||||
|
||||
static int detect_mime(htsmoduleStruct * str) {
|
||||
const char *savename = str->filename;
|
||||
|
||||
if (savename) {
|
||||
int len = (int) strlen(savename);
|
||||
|
||||
if (len > 6 && strcasecmp(savename + len - 6, ".class") == 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hts_detect_java(t_hts_callbackarg * carg, httrackp * opt,
|
||||
htsmoduleStruct * str) {
|
||||
/* Call parent functions if multiple callbacks are chained. */
|
||||
if (CALLBACKARG_PREV_FUN(carg, detect) != NULL) {
|
||||
if (CALLBACKARG_PREV_FUN(carg, detect)
|
||||
(CALLBACKARG_PREV_CARG(carg), opt, str)) {
|
||||
return 1; /* Found before us, let them have the priority */
|
||||
}
|
||||
}
|
||||
|
||||
/* Check MIME */
|
||||
if (detect_mime(str)) {
|
||||
str->wrapper_name = libName; /* Our ID */
|
||||
return 1; /* Known format, we take it */
|
||||
}
|
||||
|
||||
return 0; /* Unknown format */
|
||||
}
|
||||
|
||||
static off_t fsize(const char *s) {
|
||||
STRUCT_STAT st;
|
||||
|
||||
if (STAT(s, &st) == 0 && S_ISREG(st.st_mode)) {
|
||||
return st.st_size;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int hts_parse_java(t_hts_callbackarg * carg, httrackp * opt,
|
||||
htsmoduleStruct * str) {
|
||||
/* The wrapper_name memebr has changed: not for us anymore */
|
||||
if (str->wrapper_name == NULL || strcmp(str->wrapper_name, libName) != 0) {
|
||||
/* Call parent functions if multiple callbacks are chained. */
|
||||
if (CALLBACKARG_PREV_FUN(carg, parse) != NULL) {
|
||||
return CALLBACKARG_PREV_FUN(carg, parse) (CALLBACKARG_PREV_CARG(carg),
|
||||
opt, str);
|
||||
}
|
||||
strcpy(str->err_msg,
|
||||
"unexpected error: bad wrapper_name and no previous wrapper");
|
||||
return 0; /* Unexpected error */
|
||||
} else {
|
||||
if (detect_mime(str)) {
|
||||
|
||||
/* (Legacy code) */
|
||||
char catbuff[CATBUFF_SIZE];
|
||||
FILE *fpout;
|
||||
JAVA_HEADER header;
|
||||
RESP_STRUCT *tab;
|
||||
const char *file = str->filename;
|
||||
|
||||
str->relativeToHtmlLink = 1;
|
||||
|
||||
#if JAVADEBUG
|
||||
printf("fopen\n");
|
||||
#endif
|
||||
if ((fpout = FOPEN(fconv(catbuff, sizeof(catbuff), file), "r+b")) ==
|
||||
NULL) {
|
||||
sprintf(str->err_msg, "Unable to open file %s", file);
|
||||
return 0; // une erreur..
|
||||
}
|
||||
#if JAVADEBUG
|
||||
printf("fread\n");
|
||||
#endif
|
||||
if (fread(&header, 1, 10, fpout) != 10) { // pas complet..
|
||||
fclose(fpout);
|
||||
sprintf(str->err_msg, "File header too small (file len = " LLintP ")",
|
||||
(LLint) fsize(file));
|
||||
return 0;
|
||||
}
|
||||
#if JAVADEBUG
|
||||
printf("header\n");
|
||||
#endif
|
||||
// tester en tête
|
||||
if (reverse_endian()) {
|
||||
header.magic = hts_swap32(header.magic);
|
||||
header.count = hts_swap16(header.count);
|
||||
}
|
||||
if (header.magic != 0xCAFEBABE) {
|
||||
sprintf(str->err_msg, "non java file");
|
||||
if (fpout) {
|
||||
fclose(fpout);
|
||||
fpout = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* A constant-pool entry is >= 1 byte on disk; reject a count exceeding
|
||||
the file size (hostile .class ~68 MB alloc DoS). */
|
||||
if (!hts_count_fits(header.count, (LLint) fsize(file))) {
|
||||
fclose(fpout);
|
||||
sprintf(str->err_msg,
|
||||
"Invalid constant pool count %u (file len " LLintP ")",
|
||||
(unsigned) header.count, (LLint) fsize(file));
|
||||
return 0;
|
||||
}
|
||||
tab = (RESP_STRUCT *) calloct(header.count, sizeof(RESP_STRUCT));
|
||||
if (!tab) {
|
||||
sprintf(str->err_msg, "Unable to alloc %d bytes",
|
||||
(int) sizeof(RESP_STRUCT));
|
||||
if (fpout) {
|
||||
fclose(fpout);
|
||||
fpout = NULL;
|
||||
}
|
||||
return 0; // erreur..
|
||||
}
|
||||
#if JAVADEBUG
|
||||
printf("calchead\n");
|
||||
#endif
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 1; i < header.count; i++) {
|
||||
int err = 0; // ++
|
||||
|
||||
tab[i] = readtable(str, fpout, tab[i], &err);
|
||||
if (!err) {
|
||||
if ((tab[i].type == HTS_LONG) || (tab[i].type == HTS_DOUBLE))
|
||||
i++; //2 element si double ou float
|
||||
} else { // ++ une erreur est survenue!
|
||||
if (strnotempty(str->err_msg) == 0)
|
||||
strcpy(str->err_msg, "Internal readtable error");
|
||||
freet(tab);
|
||||
if (fpout) {
|
||||
fclose(fpout);
|
||||
fpout = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#if JAVADEBUG
|
||||
printf("addfiles\n");
|
||||
#endif
|
||||
{
|
||||
unsigned int Class;
|
||||
unsigned int SClass;
|
||||
int i;
|
||||
|
||||
Class = readshort(fpout);
|
||||
SClass = readshort(fpout);
|
||||
|
||||
for(i = 1; i < header.count; i++) {
|
||||
|
||||
if (tab[i].type == HTS_CLASS) {
|
||||
|
||||
if ((tab[i].index1 < header.count) && (tab[i].index1 >= 0)) {
|
||||
|
||||
if ((tab[i].index1 != SClass) && (tab[i].index1 != Class)
|
||||
&& (tab[tab[i].index1].name[0] != '[')) {
|
||||
|
||||
if (!strstr(tab[tab[i].index1].name, "java/")) {
|
||||
char BIGSTK tempo[1024];
|
||||
|
||||
tempo[0] = '\0';
|
||||
|
||||
snprintf(tempo, sizeof(tempo), "%s.class", tab[tab[i].index1].name);
|
||||
#if JAVADEBUG
|
||||
printf("add %s\n", tempo);
|
||||
#endif
|
||||
if (tab[tab[i].index1].file_position >= 0)
|
||||
str->addLink(str, tempo); /* tab[tab[i].index1].file_position */
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
i = header.count; // exit
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#if JAVADEBUG
|
||||
printf("end\n");
|
||||
#endif
|
||||
freet(tab);
|
||||
if (fpout) {
|
||||
fclose(fpout);
|
||||
fpout = NULL;
|
||||
}
|
||||
return 1;
|
||||
|
||||
} else {
|
||||
strcpy(str->err_msg, "bad MIME type");
|
||||
}
|
||||
}
|
||||
return 0; /* Error */
|
||||
}
|
||||
|
||||
/*
|
||||
module entry point
|
||||
*/
|
||||
EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv);
|
||||
EXTERNAL_FUNCTION int hts_plug(httrackp * opt, const char *argv) {
|
||||
/* Plug callback functions */
|
||||
CHAIN_FUNCTION(opt, detect, hts_detect_java, NULL);
|
||||
CHAIN_FUNCTION(opt, parse, hts_parse_java, NULL);
|
||||
|
||||
return 1; /* success */
|
||||
}
|
||||
|
||||
// error: !=0 si erreur fatale
|
||||
static RESP_STRUCT readtable(htsmoduleStruct * str, FILE * fp,
|
||||
RESP_STRUCT trans, int *error) {
|
||||
char rname[1024];
|
||||
unsigned short int length;
|
||||
int j;
|
||||
|
||||
*error = 0; // pas d'erreur
|
||||
trans.file_position = -1;
|
||||
trans.type = (int) (unsigned char) fgetc(fp);
|
||||
switch (trans.type) {
|
||||
case HTS_CLASS:
|
||||
strcpy(trans.name, "Class");
|
||||
trans.index1 = readshort(fp);
|
||||
break;
|
||||
|
||||
case HTS_FIELDREF:
|
||||
strcpy(trans.name, "Field Reference");
|
||||
trans.index1 = readshort(fp);
|
||||
readshort(fp);
|
||||
break;
|
||||
|
||||
case HTS_METHODREF:
|
||||
strcpy(trans.name, "Method Reference");
|
||||
trans.index1 = readshort(fp);
|
||||
readshort(fp);
|
||||
break;
|
||||
|
||||
case HTS_INTERFACE:
|
||||
strcpy(trans.name, "Interface Method Reference");
|
||||
trans.index1 = readshort(fp);
|
||||
readshort(fp);
|
||||
break;
|
||||
case HTS_NAMEANDTYPE:
|
||||
strcpy(trans.name, "Name and Type");
|
||||
trans.index1 = readshort(fp);
|
||||
readshort(fp);
|
||||
break;
|
||||
|
||||
case HTS_STRING: // CONSTANT_String
|
||||
strcpy(trans.name, "String");
|
||||
trans.index1 = readshort(fp);
|
||||
break;
|
||||
|
||||
case HTS_INTEGER:
|
||||
strcpy(trans.name, "Integer");
|
||||
for(j = 0; j < 4; j++)
|
||||
fgetc(fp);
|
||||
break;
|
||||
|
||||
case HTS_FLOAT:
|
||||
strcpy(trans.name, "Float");
|
||||
for(j = 0; j < 4; j++)
|
||||
fgetc(fp);
|
||||
break;
|
||||
|
||||
case HTS_LONG:
|
||||
strcpy(trans.name, "Long");
|
||||
for(j = 0; j < 8; j++)
|
||||
fgetc(fp);
|
||||
break;
|
||||
case HTS_DOUBLE:
|
||||
strcpy(trans.name, "Double");
|
||||
for(j = 0; j < 8; j++)
|
||||
fgetc(fp);
|
||||
break;
|
||||
|
||||
case HTS_ASCIZ:
|
||||
case HTS_UNICODE:
|
||||
|
||||
if (trans.type == HTS_ASCIZ)
|
||||
strcpy(trans.name, "HTS_ASCIZ");
|
||||
else
|
||||
strcpy(trans.name, "HTS_UNICODE");
|
||||
|
||||
{
|
||||
char BIGSTK buffer[1024];
|
||||
char *p;
|
||||
|
||||
p = &buffer[0];
|
||||
|
||||
trans.file_position = ftell(fp);
|
||||
length = readshort(fp);
|
||||
if (length < HTS_URLMAXSIZE) {
|
||||
while(length > 0) {
|
||||
*p++ = fgetc(fp);
|
||||
|
||||
length--;
|
||||
}
|
||||
*p = '\0';
|
||||
|
||||
if (tris(str->opt, buffer) == 1)
|
||||
str->addLink(str, buffer); /* trans.file_position */
|
||||
else if (tris(str->opt, buffer) == 2)
|
||||
str->addLink(str, printname(rname, buffer));
|
||||
|
||||
strcpy(trans.name, buffer);
|
||||
} else { // gros pb
|
||||
while((length > 0) && (!feof(fp))) {
|
||||
fgetc(fp);
|
||||
length--;
|
||||
}
|
||||
if (!feof(fp)) {
|
||||
trans.type = -1;
|
||||
} else {
|
||||
sprintf(str->err_msg, "Internal structure error (ASCII)");
|
||||
*error = 1;
|
||||
}
|
||||
return (trans);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// on arrête tout
|
||||
sprintf(str->err_msg, "Internal structure unknown (type %d)", trans.type);
|
||||
*error = 1;
|
||||
return (trans);
|
||||
break;
|
||||
}
|
||||
return (trans);
|
||||
}
|
||||
|
||||
static unsigned short int readshort(FILE * fp) {
|
||||
unsigned short int valint;
|
||||
|
||||
if (fread(&valint, sizeof(valint), 1, fp) == 1) {
|
||||
if (reverse_endian())
|
||||
return hts_swap16(valint);
|
||||
else
|
||||
return valint;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int tris(httrackp * opt, char *buffer) {
|
||||
char catbuff[CATBUFF_SIZE];
|
||||
|
||||
//
|
||||
// Java
|
||||
if ((buffer[0] == '[') && buffer[1] == 'L' && (!strstr(buffer, "java/")))
|
||||
return 2;
|
||||
if (strstr(buffer, ".gif") || strstr(buffer, ".jpg")
|
||||
|| strstr(buffer, ".jpeg") || strstr(buffer, ".au"))
|
||||
return 1;
|
||||
// Ajouts R.X: test type
|
||||
// Autres fichiers
|
||||
{
|
||||
char type[256];
|
||||
|
||||
if (get_httptype_sized(opt, type, sizeof(type), buffer,
|
||||
0)) // recognized type
|
||||
return 1;
|
||||
// ajout RX 05/2001
|
||||
else if (is_dyntype(get_ext(catbuff, sizeof(catbuff), buffer))) // asp,cgi...
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *printname(char rname[1024], char name[1024]) {
|
||||
char *p;
|
||||
char *p1;
|
||||
size_t j;
|
||||
|
||||
rname[0] = '\0';
|
||||
//
|
||||
|
||||
p = &name[0];
|
||||
|
||||
if (*p != '[') {
|
||||
return rname; // ""
|
||||
}
|
||||
p += 2;
|
||||
p1 = rname;
|
||||
for(j = 0; name[j] != '\0'; j++, p++) {
|
||||
if (*p == '/')
|
||||
*p1 = '.';
|
||||
if (*p == ';') {
|
||||
*p1 = '\0';
|
||||
strcat(rname, ".class");
|
||||
return rname;
|
||||
} else
|
||||
*p1 = *p;
|
||||
p1++;
|
||||
}
|
||||
p1 -= 3;
|
||||
*p1 = '\0';
|
||||
return rname;
|
||||
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/* ------------------------------------------------------------ */
|
||||
/*
|
||||
HTTrack Website Copier, Offline Browser for Windows and Unix
|
||||
Copyright (C) 1998 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: Java classes parser .h */
|
||||
/* Author: Yann Philippot */
|
||||
/* ------------------------------------------------------------ */
|
||||
|
||||
#ifndef HTSJAVA_DEFH
|
||||
#define HTSJAVA_DEFH
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef HTS_DEF_FWSTRUCT_JAVA_HEADER
|
||||
#define HTS_DEF_FWSTRUCT_JAVA_HEADER
|
||||
typedef struct JAVA_HEADER JAVA_HEADER;
|
||||
#endif
|
||||
/* 10-byte on-disk .class header image, fread() directly: fields need exact
|
||||
widths (LP64's 8-byte 'unsigned long' magic never matched 0xCAFEBABE). */
|
||||
struct JAVA_HEADER {
|
||||
uint32_t magic;
|
||||
uint16_t minor;
|
||||
uint16_t major;
|
||||
uint16_t count;
|
||||
};
|
||||
|
||||
#ifndef HTS_DEF_FWSTRUCT_RESP_STRUCT
|
||||
#define HTS_DEF_FWSTRUCT_RESP_STRUCT
|
||||
typedef struct RESP_STRUCT RESP_STRUCT;
|
||||
#endif
|
||||
struct RESP_STRUCT {
|
||||
int file_position;
|
||||
//
|
||||
unsigned int index1;
|
||||
unsigned int type;
|
||||
char name[1024];
|
||||
};
|
||||
|
||||
/* Library internal definictions */
|
||||
#ifdef HTS_INTERNAL_BYTECODE
|
||||
|
||||
EXTERNAL_FUNCTION int hts_plug_java(httrackp * opt, const char *argv);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user