mirror of
https://github.com/xroche/httrack.git
synced 2026-06-19 08:43:13 +03:00
Compare commits
21 Commits
docs/api-h
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb098b27b4 | ||
|
|
5f6a3fb917 | ||
|
|
f9e676dbe3 | ||
|
|
1b440c44b5 | ||
|
|
ac6dd1a570 | ||
|
|
4549ec3695 | ||
|
|
ac56c31b24 | ||
|
|
ee6beeeb7d | ||
|
|
6788bda380 | ||
|
|
7ead8d595e | ||
|
|
93f502990c | ||
|
|
0f4b2596b2 | ||
|
|
4a676bb5e1 | ||
|
|
36b4e834b8 | ||
|
|
bbb423f025 | ||
|
|
eed46e0b09 | ||
|
|
fa57f0148f | ||
|
|
76260d5e6e | ||
|
|
5d0913dfce | ||
|
|
9b7601a987 | ||
|
|
4ec38c4e66 |
@@ -2779,7 +2779,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
if (strcmp(back[i].url_fil, "/robots.txt")) {
|
if (strcmp(back[i].url_fil, "/robots.txt")) {
|
||||||
if (back[i].r.statuscode == HTTP_OK) { // 'OK'
|
if (back[i].r.statuscode == HTTP_OK) { // 'OK'
|
||||||
if (!is_hypertext_mime(opt, back[i].r.contenttype, back[i].url_fil)) { // pas HTML
|
if (!is_hypertext_mime(opt, back[i].r.contenttype, back[i].url_fil)) { // pas HTML
|
||||||
if (opt->getmode & 2) { // on peut ecrire des non html
|
if (opt->getmode & HTS_GETMODE_NONHTML) {
|
||||||
int fcheck = 0;
|
int fcheck = 0;
|
||||||
int last_errno = 0;
|
int last_errno = 0;
|
||||||
|
|
||||||
@@ -2852,7 +2852,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { // on coupe tout!
|
} else { // on coupe tout!
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
"File cancelled (non HTML): %s%s",
|
"File cancelled (non HTML): %s%s",
|
||||||
back[i].url_adr, back[i].url_fil);
|
back[i].url_adr, back[i].url_fil);
|
||||||
@@ -3661,7 +3661,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
#endif
|
#endif
|
||||||
if (sz >= 0) {
|
if (sz >= 0) {
|
||||||
if (!is_hypertext_mime(opt, back[i].r.contenttype, back[i].url_sav)) { // pas HTML
|
if (!is_hypertext_mime(opt, back[i].r.contenttype, back[i].url_sav)) { // pas HTML
|
||||||
if (opt->getmode & 2) { // on peut ecrire des non html **sinon ben euhh sera intercepté plus loin, donc rap sur ce qui va sortir**
|
if (opt->getmode & HTS_GETMODE_NONHTML) {
|
||||||
filenote(&opt->state.strc, back[i].url_sav, NULL); // noter fichier comme connu
|
filenote(&opt->state.strc, back[i].url_sav, NULL); // noter fichier comme connu
|
||||||
file_notify(opt, back[i].url_adr, back[i].url_fil,
|
file_notify(opt, back[i].url_adr, back[i].url_fil,
|
||||||
back[i].url_sav, 0, 1,
|
back[i].url_sav, 0, 1,
|
||||||
@@ -3838,7 +3838,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
/* funny log for commandline users */
|
/* funny log for commandline users */
|
||||||
//if (!opt->quiet) {
|
//if (!opt->quiet) {
|
||||||
// petite animation
|
// petite animation
|
||||||
if (opt->verbosedisplay == 1) {
|
if (opt->verbosedisplay == HTS_VERBOSE_SIMPLE) {
|
||||||
if (back[i].status == STATUS_READY) {
|
if (back[i].status == STATUS_READY) {
|
||||||
if (back[i].r.statuscode == HTTP_OK)
|
if (back[i].r.statuscode == HTTP_OK)
|
||||||
printf("* %s%s (" LLintP " bytes) - OK" VT_CLREOL "\r",
|
printf("* %s%s (" LLintP " bytes) - OK" VT_CLREOL "\r",
|
||||||
|
|||||||
@@ -370,7 +370,7 @@ int cache_selftests(httrackp *opt, const char *dir) {
|
|||||||
StringCopy(opt->path_html, base);
|
StringCopy(opt->path_html, base);
|
||||||
StringCopy(opt->path_html_utf8, base);
|
StringCopy(opt->path_html_utf8, base);
|
||||||
}
|
}
|
||||||
opt->cache = 1;
|
opt->cache = HTS_CACHE_PRIORITY;
|
||||||
|
|
||||||
/* pass 1: create everything in a single write session */
|
/* pass 1: create everything in a single write session */
|
||||||
selftest_open_for_write(&cache, opt);
|
selftest_open_for_write(&cache, opt);
|
||||||
@@ -547,7 +547,7 @@ static void golden_setup(httrackp *opt, const char *dir) {
|
|||||||
StringCopy(opt->path_log, base);
|
StringCopy(opt->path_log, base);
|
||||||
StringCopy(opt->path_html, base);
|
StringCopy(opt->path_html, base);
|
||||||
StringCopy(opt->path_html_utf8, base);
|
StringCopy(opt->path_html_utf8, base);
|
||||||
opt->cache = 1;
|
opt->cache = HTS_CACHE_PRIORITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cache_golden_selftest(httrackp *opt, const char *dir, int regen) {
|
int cache_golden_selftest(httrackp *opt, const char *dir, int regen) {
|
||||||
|
|||||||
@@ -135,7 +135,8 @@ HTSEXT_API T_SOC catch_url_init(int *port, /* 128 bytes */ char *adr) {
|
|||||||
// returns 0 if error
|
// returns 0 if error
|
||||||
// url: buffer where URL must be stored - or ip:port in case of failure
|
// url: buffer where URL must be stored - or ip:port in case of failure
|
||||||
// data: 32Kb
|
// data: 32Kb
|
||||||
HTSEXT_API int catch_url(T_SOC soc, char *url, char *method, char *data) {
|
HTSEXT_API hts_boolean catch_url(T_SOC soc, char *url, char *method,
|
||||||
|
char *data) {
|
||||||
int retour = 0;
|
int retour = 0;
|
||||||
|
|
||||||
// connexion (accept)
|
// connexion (accept)
|
||||||
|
|||||||
@@ -1835,9 +1835,10 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
a++; // sauter espace(s)
|
a++; // sauter espace(s)
|
||||||
if (strnotempty(a)) {
|
if (strnotempty(a)) {
|
||||||
#ifdef IGNORE_RESTRICTIVE_ROBOTS
|
#ifdef IGNORE_RESTRICTIVE_ROBOTS
|
||||||
if (strcmp(a, "/") != 0 || opt->robots >= 3)
|
if (strcmp(a, "/") != 0 ||
|
||||||
|
opt->robots >= HTS_ROBOTS_ALWAYS_STRICT)
|
||||||
#endif
|
#endif
|
||||||
{ /* ignoring disallow: / */
|
{ /* ignoring disallow: / */
|
||||||
if ((strlen(buff) + strlen(a) + 8) < sizeof(buff)) {
|
if ((strlen(buff) + strlen(a) + 8) < sizeof(buff)) {
|
||||||
strcatbuff(buff, a);
|
strcatbuff(buff, a);
|
||||||
strcatbuff(buff, "\n");
|
strcatbuff(buff, "\n");
|
||||||
@@ -1932,10 +1933,10 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
"Warning: store %s without scan: %s", r.contenttype,
|
"Warning: store %s without scan: %s", r.contenttype,
|
||||||
savename());
|
savename());
|
||||||
} else {
|
} else {
|
||||||
if ((opt->getmode & 2) != 0) { // ok autorisé
|
if ((opt->getmode & HTS_GETMODE_NONHTML) != 0) {
|
||||||
hts_log_print(opt, LOG_DEBUG, "Store %s: %s", r.contenttype,
|
hts_log_print(opt, LOG_DEBUG, "Store %s: %s", r.contenttype,
|
||||||
savename());
|
savename());
|
||||||
} else { // lien non autorisé! (ex: cgi-bin en html)
|
} else { // lien non autorisé! (ex: cgi-bin en html)
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
"non-html file ignored after upload at %s : %s",
|
"non-html file ignored after upload at %s : %s",
|
||||||
urladr(), urlfil());
|
urladr(), urlfil());
|
||||||
@@ -2052,7 +2053,7 @@ int httpmirror(char *url1, httrackp * opt) {
|
|||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
// faut-il sauter le(s) lien(s) suivant(s)? (fichiers images à passer après les html)
|
// faut-il sauter le(s) lien(s) suivant(s)? (fichiers images à passer après les html)
|
||||||
if (opt->getmode & 4) { // sauver les non html après
|
if (opt->getmode & HTS_GETMODE_HTML_FIRST) {
|
||||||
// sauter les fichiers selon la passe
|
// sauter les fichiers selon la passe
|
||||||
if (!numero_passe) {
|
if (!numero_passe) {
|
||||||
while((ptr < opt->lien_tot) ? (heap(ptr)->pass2) : 0)
|
while((ptr < opt->lien_tot) ? (heap(ptr)->pass2) : 0)
|
||||||
@@ -2584,7 +2585,7 @@ static int mkdir_compat(const char *pathname) {
|
|||||||
|
|
||||||
/* path must end with "/" or with the finename (/tmp/bar/ or /tmp/bar/foo.zip) */
|
/* path must end with "/" or with the finename (/tmp/bar/ or /tmp/bar/foo.zip) */
|
||||||
/* Note: preserve errno */
|
/* Note: preserve errno */
|
||||||
HTSEXT_API int dir_exists(const char *path) {
|
HTSEXT_API hts_boolean dir_exists(const char *path) {
|
||||||
const int err = errno;
|
const int err = errno;
|
||||||
STRUCT_STAT st;
|
STRUCT_STAT st;
|
||||||
char BIGSTK file[HTS_URLMAXSIZE * 2];
|
char BIGSTK file[HTS_URLMAXSIZE * 2];
|
||||||
@@ -3341,7 +3342,8 @@ int back_fill(struct_back * sback, httrackp * opt, cache_back * cache,
|
|||||||
int ptr, int numero_passe) {
|
int ptr, int numero_passe) {
|
||||||
int n = back_pluggable_sockets(sback, opt);
|
int n = back_pluggable_sockets(sback, opt);
|
||||||
|
|
||||||
if (opt->savename_delayed == 2 && !opt->delayed_cached) /* cancel (always delayed) */
|
if (opt->savename_delayed == HTS_SAVENAME_DELAYED_HARD &&
|
||||||
|
!opt->delayed_cached) /* cancel (always delayed) */
|
||||||
return 0;
|
return 0;
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
int p;
|
int p;
|
||||||
@@ -3645,7 +3647,7 @@ HTSEXT_API int hts_setpause(httrackp * opt, int p) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ask for termination
|
// ask for termination
|
||||||
HTSEXT_API int hts_request_stop(httrackp * opt, int force) {
|
HTSEXT_API int hts_request_stop(httrackp *opt, hts_boolean force) {
|
||||||
if (opt != NULL) {
|
if (opt != NULL) {
|
||||||
hts_log_print(opt, LOG_ERROR, "Exit requested by shell or user");
|
hts_log_print(opt, LOG_ERROR, "Exit requested by shell or user");
|
||||||
hts_mutexlock(&opt->state.lock);
|
hts_mutexlock(&opt->state.lock);
|
||||||
@@ -3655,7 +3657,7 @@ HTSEXT_API int hts_request_stop(httrackp * opt, int force) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HTSEXT_API int hts_has_stopped(httrackp * opt) {
|
HTSEXT_API hts_boolean hts_has_stopped(httrackp *opt) {
|
||||||
int ended;
|
int ended;
|
||||||
hts_mutexlock(&opt->state.lock);
|
hts_mutexlock(&opt->state.lock);
|
||||||
ended = opt->state.is_ended;
|
ended = opt->state.is_ended;
|
||||||
@@ -3677,12 +3679,12 @@ HTSEXT_API int hts_has_stopped(httrackp * opt) {
|
|||||||
//}
|
//}
|
||||||
// ajout d'URL
|
// ajout d'URL
|
||||||
// -1 : erreur
|
// -1 : erreur
|
||||||
HTSEXT_API int hts_addurl(httrackp * opt, char **url) {
|
HTSEXT_API hts_boolean hts_addurl(httrackp *opt, char **url) {
|
||||||
if (url)
|
if (url)
|
||||||
opt->state._hts_addurl = url;
|
opt->state._hts_addurl = url;
|
||||||
return (opt->state._hts_addurl != NULL);
|
return (opt->state._hts_addurl != NULL);
|
||||||
}
|
}
|
||||||
HTSEXT_API int hts_resetaddurl(httrackp * opt) {
|
HTSEXT_API hts_boolean hts_resetaddurl(httrackp *opt) {
|
||||||
opt->state._hts_addurl = NULL;
|
opt->state._hts_addurl = NULL;
|
||||||
return (opt->state._hts_addurl != NULL);
|
return (opt->state._hts_addurl != NULL);
|
||||||
}
|
}
|
||||||
@@ -3701,7 +3703,9 @@ HTSEXT_API int copy_htsopt(const httrackp * from, httrackp * to) {
|
|||||||
if (from->maxsoc > 0)
|
if (from->maxsoc > 0)
|
||||||
to->maxsoc = from->maxsoc;
|
to->maxsoc = from->maxsoc;
|
||||||
|
|
||||||
if (from->nearlink > -1)
|
/* hts_boolean/enum fields are unsigned (GCC), so a bare `> -1` unset-guard
|
||||||
|
is always false; cast to int to keep the -1 "unset" sentinel test. */
|
||||||
|
if ((int) from->nearlink > -1)
|
||||||
to->nearlink = from->nearlink;
|
to->nearlink = from->nearlink;
|
||||||
|
|
||||||
if (from->timeout > -1)
|
if (from->timeout > -1)
|
||||||
@@ -3728,18 +3732,18 @@ HTSEXT_API int copy_htsopt(const httrackp * from, httrackp * to) {
|
|||||||
if (from->hostcontrol > -1)
|
if (from->hostcontrol > -1)
|
||||||
to->hostcontrol = from->hostcontrol;
|
to->hostcontrol = from->hostcontrol;
|
||||||
|
|
||||||
if (from->errpage > -1)
|
if ((int) from->errpage > -1)
|
||||||
to->errpage = from->errpage;
|
to->errpage = from->errpage;
|
||||||
|
|
||||||
if (from->parseall > -1)
|
if ((int) from->parseall > -1)
|
||||||
to->parseall = from->parseall;
|
to->parseall = from->parseall;
|
||||||
|
|
||||||
// test all: bit 8 de travel
|
// test all: bit 8 de travel
|
||||||
if (from->travel > -1) {
|
if (from->travel > -1) {
|
||||||
if (from->travel & 256)
|
if (from->travel & HTS_TRAVEL_TEST_ALL)
|
||||||
to->travel |= 256;
|
to->travel |= HTS_TRAVEL_TEST_ALL;
|
||||||
else
|
else
|
||||||
to->travel &= 255;
|
to->travel &= HTS_TRAVEL_SCOPE_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -3843,7 +3847,7 @@ int htsAddLink(htsmoduleStruct * str, char *link) {
|
|||||||
a = opt->savename_type;
|
a = opt->savename_type;
|
||||||
b = opt->savename_83;
|
b = opt->savename_83;
|
||||||
opt->savename_type = 0;
|
opt->savename_type = 0;
|
||||||
opt->savename_83 = 0;
|
opt->savename_83 = HTS_SAVENAME_83_LONG;
|
||||||
// note: adr,fil peuvent être patchés
|
// note: adr,fil peuvent être patchés
|
||||||
r =
|
r =
|
||||||
url_savename(&afs, NULL, NULL, NULL, opt, sback, cache, hashptr, ptr, numero_passe,
|
url_savename(&afs, NULL, NULL, NULL, opt, sback, cache, hashptr, ptr, numero_passe,
|
||||||
|
|||||||
@@ -369,10 +369,6 @@ char *readfile_or(const char *fil, const char *defaultdata);
|
|||||||
void check_rate(TStamp stat_timestart, int maxrate);
|
void check_rate(TStamp stat_timestart, int maxrate);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// links
|
|
||||||
int liens_record(char *adr, char *fil, char *save, char *former_adr,
|
|
||||||
char *former_fil, char *codebase);
|
|
||||||
|
|
||||||
/* Backing (download-slot) scheduler. Operate on the back[] ring (struct_back).
|
/* Backing (download-slot) scheduler. Operate on the back[] ring (struct_back).
|
||||||
Not thread-safe; call from the single crawl loop. */
|
Not thread-safe; call from the single crawl loop. */
|
||||||
|
|
||||||
|
|||||||
@@ -612,12 +612,12 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
/* Terminal is a tty, may ask questions and display funny information */
|
/* Terminal is a tty, may ask questions and display funny information */
|
||||||
if (isatty(1)) {
|
if (isatty(1)) {
|
||||||
opt->quiet = 0;
|
opt->quiet = 0;
|
||||||
opt->verbosedisplay = 1;
|
opt->verbosedisplay = HTS_VERBOSE_SIMPLE;
|
||||||
}
|
}
|
||||||
/* Not a tty, no stdin input or funny output! */
|
/* Not a tty, no stdin input or funny output! */
|
||||||
else {
|
else {
|
||||||
opt->quiet = 1;
|
opt->quiet = 1;
|
||||||
opt->verbosedisplay = 0;
|
opt->verbosedisplay = HTS_VERBOSE_NONE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1431,7 +1431,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
StringBuff(opt->path_log), "hts-in_progress.lock"))) { // fichier lock?
|
StringBuff(opt->path_log), "hts-in_progress.lock"))) { // fichier lock?
|
||||||
//char s[32];
|
//char s[32];
|
||||||
|
|
||||||
opt->cache = 1; // cache prioritaire
|
opt->cache = HTS_CACHE_PRIORITY; // cache prioritaire
|
||||||
if (opt->quiet == 0) {
|
if (opt->quiet == 0) {
|
||||||
if ((fexist
|
if ((fexist
|
||||||
(fconcat
|
(fconcat
|
||||||
@@ -1465,7 +1465,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
(fconcat
|
(fconcat
|
||||||
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "index.html"))) {
|
(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), StringBuff(opt->path_html), "index.html"))) {
|
||||||
//char s[32];
|
//char s[32];
|
||||||
opt->cache = 2; // cache vient après test de validité
|
opt->cache = HTS_CACHE_TEST_UPDATE;
|
||||||
if (opt->quiet == 0) {
|
if (opt->quiet == 0) {
|
||||||
if ((fexist
|
if ((fexist
|
||||||
(fconcat
|
(fconcat
|
||||||
@@ -1558,25 +1558,25 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
return 0; // déja fait normalement
|
return 0; // déja fait normalement
|
||||||
//
|
//
|
||||||
case 'g': // récupérer un (ou plusieurs) fichiers isolés
|
case 'g': // récupérer un (ou plusieurs) fichiers isolés
|
||||||
opt->wizard = 2; // le wizard on peut plus s'en passer..
|
opt->wizard = HTS_WIZARD_AUTO;
|
||||||
//opt->wizard=0; // pas de wizard
|
//opt->wizard=0; // pas de wizard
|
||||||
opt->cache = 0; // ni de cache
|
opt->cache = HTS_CACHE_NONE; // ni de cache
|
||||||
opt->makeindex = 0; // ni d'index
|
opt->makeindex = 0; // ni d'index
|
||||||
httrack_logmode = 1; // erreurs à l'écran
|
httrack_logmode = 1; // erreurs à l'écran
|
||||||
opt->savename_type = 1003; // mettre dans le répertoire courant
|
opt->savename_type = 1003; // mettre dans le répertoire courant
|
||||||
opt->depth = 0; // ne pas explorer la page
|
opt->depth = 0; // ne pas explorer la page
|
||||||
opt->accept_cookie = 0; // pas de cookies
|
opt->accept_cookie = 0; // pas de cookies
|
||||||
opt->robots = 0; // pas de robots
|
opt->robots = HTS_ROBOTS_NEVER; // pas de robots
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
opt->wizard = 2; // wizard 'soft' (ne pose pas de questions)
|
opt->wizard = HTS_WIZARD_AUTO;
|
||||||
opt->travel = 0;
|
opt->travel = HTS_TRAVEL_SAME_ADDRESS;
|
||||||
opt->seeker = 1;
|
opt->seeker = HTS_SEEKER_DOWN;
|
||||||
break;
|
break;
|
||||||
case 'W':
|
case 'W':
|
||||||
opt->wizard = 1; // Wizard-Help (pose des questions)
|
opt->wizard = HTS_WIZARD_ASK; // Wizard-Help (pose des questions)
|
||||||
opt->travel = 0;
|
opt->travel = HTS_TRAVEL_SAME_ADDRESS;
|
||||||
opt->seeker = 1;
|
opt->seeker = HTS_SEEKER_DOWN;
|
||||||
break;
|
break;
|
||||||
case 'r': // n'est plus le recurse get bestial mais wizard itou!
|
case 'r': // n'est plus le recurse get bestial mais wizard itou!
|
||||||
if (isdigit((unsigned char) *(com + 1))) {
|
if (isdigit((unsigned char) *(com + 1))) {
|
||||||
@@ -1598,19 +1598,23 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
// note: les tests opt->depth sont pour éviter de faire
|
// note: les tests opt->depth sont pour éviter de faire
|
||||||
// un miroir du web (:-O) accidentelement ;-)
|
// un miroir du web (:-O) accidentelement ;-)
|
||||||
case 'a': /*if (opt->depth==9999) opt->depth=3; */
|
case 'a': /*if (opt->depth==9999) opt->depth=3; */
|
||||||
opt->travel = 0 + (opt->travel & 256);
|
opt->travel =
|
||||||
|
HTS_TRAVEL_SAME_ADDRESS + (opt->travel & HTS_TRAVEL_TEST_ALL);
|
||||||
break;
|
break;
|
||||||
case 'd': /*if (opt->depth==9999) opt->depth=3; */
|
case 'd': /*if (opt->depth==9999) opt->depth=3; */
|
||||||
opt->travel = 1 + (opt->travel & 256);
|
opt->travel =
|
||||||
|
HTS_TRAVEL_SAME_DOMAIN + (opt->travel & HTS_TRAVEL_TEST_ALL);
|
||||||
break;
|
break;
|
||||||
case 'l': /*if (opt->depth==9999) opt->depth=3; */
|
case 'l': /*if (opt->depth==9999) opt->depth=3; */
|
||||||
opt->travel = 2 + (opt->travel & 256);
|
opt->travel =
|
||||||
|
HTS_TRAVEL_SAME_TLD + (opt->travel & HTS_TRAVEL_TEST_ALL);
|
||||||
break;
|
break;
|
||||||
case 'e': /*if (opt->depth==9999) opt->depth=3; */
|
case 'e': /*if (opt->depth==9999) opt->depth=3; */
|
||||||
opt->travel = 7 + (opt->travel & 256);
|
opt->travel =
|
||||||
|
HTS_TRAVEL_EVERYWHERE + (opt->travel & HTS_TRAVEL_TEST_ALL);
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
opt->travel |= 256;
|
opt->travel |= HTS_TRAVEL_TEST_ALL;
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
opt->nearlink = 1;
|
opt->nearlink = 1;
|
||||||
@@ -1620,16 +1624,16 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
break;
|
break;
|
||||||
//
|
//
|
||||||
case 'U':
|
case 'U':
|
||||||
opt->seeker = 2;
|
opt->seeker = HTS_SEEKER_UP;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
opt->seeker = 1;
|
opt->seeker = HTS_SEEKER_DOWN;
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
opt->seeker = 0;
|
opt->seeker = 0;
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
opt->seeker = 3;
|
opt->seeker = HTS_SEEKER_DOWN | HTS_SEEKER_UP;
|
||||||
break;
|
break;
|
||||||
//
|
//
|
||||||
case 'Y':
|
case 'Y':
|
||||||
@@ -1659,12 +1663,12 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
//case 'A': opt->urlmode=1; break;
|
//case 'A': opt->urlmode=1; break;
|
||||||
//case 'R': opt->urlmode=2; break;
|
//case 'R': opt->urlmode=2; break;
|
||||||
case 'K':
|
case 'K':
|
||||||
opt->urlmode = 0;
|
opt->urlmode = HTS_URLMODE_ABSOLUTE;
|
||||||
if (isdigit((unsigned char) *(com + 1))) {
|
if (isdigit((unsigned char) *(com + 1))) {
|
||||||
sscanf(com + 1, "%d", &opt->urlmode);
|
sscanf(com + 1, "%d", (int *) &opt->urlmode);
|
||||||
if (opt->urlmode == 0) { // in fact K0 ==> K2
|
if (opt->urlmode == HTS_URLMODE_ABSOLUTE) { // in fact K0 ==> K2
|
||||||
// and K ==> K0
|
// and K ==> K0
|
||||||
opt->urlmode = 2;
|
opt->urlmode = HTS_URLMODE_RELATIVE;
|
||||||
}
|
}
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
@@ -1779,7 +1783,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
break;
|
break;
|
||||||
//
|
//
|
||||||
case 'b':
|
case 'b':
|
||||||
sscanf(com + 1, "%d", &opt->accept_cookie);
|
sscanf(com + 1, "%d", (int *) &opt->accept_cookie);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
break;
|
break;
|
||||||
@@ -1811,53 +1815,51 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
com++;
|
com++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'L':
|
case 'L': {
|
||||||
{
|
sscanf(com + 1, "%d", (int *) &opt->savename_83);
|
||||||
sscanf(com + 1, "%d", &opt->savename_83);
|
switch (opt->savename_83) {
|
||||||
switch (opt->savename_83) {
|
case 0: // 8-3 (ISO9660 L1)
|
||||||
case 0: // 8-3 (ISO9660 L1)
|
opt->savename_83 = HTS_SAVENAME_83_DOS;
|
||||||
opt->savename_83 = 1;
|
break;
|
||||||
break;
|
case 1:
|
||||||
case 1:
|
opt->savename_83 = HTS_SAVENAME_83_LONG;
|
||||||
opt->savename_83 = 0;
|
break;
|
||||||
break;
|
default: // 2 == ISO9660 (ISO9660 L2)
|
||||||
default: // 2 == ISO9660 (ISO9660 L2)
|
opt->savename_83 = HTS_SAVENAME_83_ISO9660;
|
||||||
opt->savename_83 = 2;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
|
||||||
com++;
|
|
||||||
}
|
}
|
||||||
break;
|
while (isdigit((unsigned char) *(com + 1)))
|
||||||
|
com++;
|
||||||
|
} break;
|
||||||
case 's':
|
case 's':
|
||||||
if (isdigit((unsigned char) *(com + 1))) {
|
if (isdigit((unsigned char) *(com + 1))) {
|
||||||
sscanf(com + 1, "%d", &opt->robots);
|
sscanf(com + 1, "%d", (int *) &opt->robots);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
} else
|
} else
|
||||||
opt->robots = 1;
|
opt->robots = HTS_ROBOTS_SOMETIMES;
|
||||||
#if DEBUG_ROBOTS
|
#if DEBUG_ROBOTS
|
||||||
printf("robots.txt mode set to %d\n", opt->robots);
|
printf("robots.txt mode set to %d\n", opt->robots);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
sscanf(com + 1, "%d", &opt->errpage);
|
sscanf(com + 1, "%d", (int *) &opt->errpage);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
sscanf(com + 1, "%d", &opt->check_type);
|
sscanf(com + 1, "%d", (int *) &opt->check_type);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
break;
|
break;
|
||||||
//
|
//
|
||||||
case 'C':
|
case 'C':
|
||||||
if (isdigit((unsigned char) *(com + 1))) {
|
if (isdigit((unsigned char) *(com + 1))) {
|
||||||
sscanf(com + 1, "%d", &opt->cache);
|
sscanf(com + 1, "%d", (int *) &opt->cache);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
} else
|
} else
|
||||||
opt->cache = 1;
|
opt->cache = HTS_CACHE_PRIORITY;
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
opt->all_in_cache = 1;
|
opt->all_in_cache = 1;
|
||||||
@@ -1913,7 +1915,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
case 'I':
|
case 'I':
|
||||||
opt->kindex = 1;
|
opt->kindex = 1;
|
||||||
if (isdigit((unsigned char) *(com + 1))) {
|
if (isdigit((unsigned char) *(com + 1))) {
|
||||||
sscanf(com + 1, "%d", &opt->kindex);
|
sscanf(com + 1, "%d", (int *) &opt->kindex);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
}
|
}
|
||||||
@@ -1985,9 +1987,9 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
}
|
}
|
||||||
break; // url hack
|
break; // url hack
|
||||||
case 'v':
|
case 'v':
|
||||||
opt->verbosedisplay = 2;
|
opt->verbosedisplay = HTS_VERBOSE_FULL;
|
||||||
if (isdigit((unsigned char) *(com + 1))) {
|
if (isdigit((unsigned char) *(com + 1))) {
|
||||||
sscanf(com + 1, "%d", &opt->verbosedisplay);
|
sscanf(com + 1, "%d", (int *) &opt->verbosedisplay);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
}
|
}
|
||||||
@@ -2000,9 +2002,9 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'N':
|
case 'N':
|
||||||
opt->savename_delayed = 2;
|
opt->savename_delayed = HTS_SAVENAME_DELAYED_HARD;
|
||||||
if (isdigit((unsigned char) *(com + 1))) {
|
if (isdigit((unsigned char) *(com + 1))) {
|
||||||
sscanf(com + 1, "%d", &opt->savename_delayed);
|
sscanf(com + 1, "%d", (int *) &opt->savename_delayed);
|
||||||
while(isdigit((unsigned char) *(com + 1)))
|
while(isdigit((unsigned char) *(com + 1)))
|
||||||
com++;
|
com++;
|
||||||
}
|
}
|
||||||
@@ -2045,7 +2047,7 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
// preserve: no footer, original links
|
// preserve: no footer, original links
|
||||||
case 'p':
|
case 'p':
|
||||||
StringClear(opt->footer);
|
StringClear(opt->footer);
|
||||||
opt->urlmode = 4;
|
opt->urlmode = HTS_URLMODE_KEEP_ORIGINAL;
|
||||||
break;
|
break;
|
||||||
case 'L': // URL list
|
case 'L': // URL list
|
||||||
if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) {
|
if ((na + 1 >= argc) || (argv[na + 1][0] == '-')) {
|
||||||
@@ -3092,6 +3094,78 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
htsmain_free();
|
htsmain_free();
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
|
case '9': { // copy_htsopt selftest: httrack -#9
|
||||||
|
httrackp *from = hts_create_opt();
|
||||||
|
httrackp *to = hts_create_opt();
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
/* from-values differ from both the to-values and the
|
||||||
|
hts_create_opt() defaults (nearlink FALSE, errpage/parseall
|
||||||
|
TRUE), so a copy that no-ops or just resets to defaults is
|
||||||
|
caught too, not only the unsigned-guard bug. */
|
||||||
|
from->retry = 7; /* int field: positive control */
|
||||||
|
to->retry = 0;
|
||||||
|
from->nearlink = HTS_TRUE;
|
||||||
|
to->nearlink = HTS_FALSE;
|
||||||
|
from->errpage = HTS_FALSE;
|
||||||
|
to->errpage = HTS_TRUE;
|
||||||
|
from->parseall = HTS_FALSE;
|
||||||
|
to->parseall = HTS_TRUE;
|
||||||
|
|
||||||
|
copy_htsopt(from, to);
|
||||||
|
|
||||||
|
if (to->retry != 7)
|
||||||
|
err = 1;
|
||||||
|
if (to->nearlink != HTS_TRUE)
|
||||||
|
err = 1;
|
||||||
|
if (to->errpage != HTS_FALSE)
|
||||||
|
err = 1;
|
||||||
|
if (to->parseall != HTS_FALSE)
|
||||||
|
err = 1;
|
||||||
|
|
||||||
|
hts_free_opt(from);
|
||||||
|
hts_free_opt(to);
|
||||||
|
printf("copy-htsopt: %s\n", err ? "FAIL" : "OK");
|
||||||
|
htsmain_free();
|
||||||
|
return err;
|
||||||
|
} break;
|
||||||
|
case 'Q': { // cookie request-header selftest: httrack -#Q
|
||||||
|
static t_cookie cookie;
|
||||||
|
char hdr[1024];
|
||||||
|
/* RFC 6265: bare name=value pairs, no $Version/$Path (#151). */
|
||||||
|
const char *expected = "Cookie: name=value; has_js=1" H_CRLF;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
const char *dom = "www.example.com";
|
||||||
|
int added;
|
||||||
|
|
||||||
|
cookie.max_len = (int) sizeof(cookie.data);
|
||||||
|
cookie.data[0] = '\0';
|
||||||
|
added = cookie_add(&cookie, "name", "value", dom, "/");
|
||||||
|
added |= cookie_add(&cookie, "has_js", "1", dom, "/");
|
||||||
|
/* different domain: must be filtered out */
|
||||||
|
added |= cookie_add(&cookie, "junk", "x", "other.org", "/");
|
||||||
|
if (added) {
|
||||||
|
printf("cookie-header: FAIL (cookie_add setup)\n");
|
||||||
|
htsmain_free();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
http_cookie_header_selftest(&cookie, dom, "/", hdr,
|
||||||
|
sizeof(hdr));
|
||||||
|
if (strcmp(hdr, expected) != 0)
|
||||||
|
err = 1;
|
||||||
|
if (strstr(hdr, "$Version") != NULL ||
|
||||||
|
strstr(hdr, "$Path") != NULL)
|
||||||
|
err = 1;
|
||||||
|
if (strstr(hdr, "junk") != NULL) // wrong-domain cookie leaked
|
||||||
|
err = 1;
|
||||||
|
printf("cookie-header: %s\n", err ? "FAIL" : "OK");
|
||||||
|
if (err)
|
||||||
|
printf(" got: %s\n", hdr);
|
||||||
|
htsmain_free();
|
||||||
|
return err;
|
||||||
|
} break;
|
||||||
case '!':
|
case '!':
|
||||||
HTS_PANIC_PRINTF
|
HTS_PANIC_PRINTF
|
||||||
("Option #! is disabled for security reasons");
|
("Option #! is disabled for security reasons");
|
||||||
@@ -3610,12 +3684,12 @@ static int hts_main_internal(int argc, char **argv, httrackp * opt) {
|
|||||||
printf("Mirror launched on %s by HTTrack Website Copier/"
|
printf("Mirror launched on %s by HTTrack Website Copier/"
|
||||||
HTTRACK_VERSION "%s " HTTRACK_AFF_AUTHORS "" LF, t,
|
HTTRACK_VERSION "%s " HTTRACK_AFF_AUTHORS "" LF, t,
|
||||||
hts_get_version_info(opt));
|
hts_get_version_info(opt));
|
||||||
if (opt->wizard == 0) {
|
if (opt->wizard == HTS_WIZARD_NONE) {
|
||||||
printf
|
printf
|
||||||
("mirroring %s with %d levels, %d sockets,t=%d,s=%d,logm=%d,lnk=%d,mdg=%d\n",
|
("mirroring %s with %d levels, %d sockets,t=%d,s=%d,logm=%d,lnk=%d,mdg=%d\n",
|
||||||
url, opt->depth, opt->maxsoc, opt->travel, opt->seeker,
|
url, opt->depth, opt->maxsoc, opt->travel, opt->seeker,
|
||||||
httrack_logmode, opt->urlmode, opt->getmode);
|
httrack_logmode, opt->urlmode, opt->getmode);
|
||||||
} else { // the magic wizard
|
} else { // the magic wizard
|
||||||
printf("mirroring %s with the wizard help..\n", url);
|
printf("mirroring %s with the wizard help..\n", url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,6 +242,14 @@ Please visit our Website: http://www.httrack.com
|
|||||||
#define HTS_NOPARAM "(none)"
|
#define HTS_NOPARAM "(none)"
|
||||||
#define HTS_NOPARAM2 "\"(none)\""
|
#define HTS_NOPARAM2 "\"(none)\""
|
||||||
|
|
||||||
|
/* Boolean flag for option fields and API yes/no returns. An enum (not C bool)
|
||||||
|
so it stays int-sized: option fields keep the httrackp layout/ABI, and a
|
||||||
|
return type stays compatible with the int it replaces. */
|
||||||
|
#ifndef HTS_DEF_DEFSTRUCT_hts_boolean
|
||||||
|
#define HTS_DEF_DEFSTRUCT_hts_boolean
|
||||||
|
typedef enum hts_boolean { HTS_FALSE = 0, HTS_TRUE = 1 } hts_boolean;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Larger/smaller of two values. Macros: arguments are evaluated twice. */
|
/* Larger/smaller of two values. Macros: arguments are evaluated twice. */
|
||||||
#define maximum(A,B) ( (A) > (B) ? (A) : (B) )
|
#define maximum(A,B) ( (A) > (B) ? (A) : (B) )
|
||||||
|
|
||||||
|
|||||||
198
src/htslib.c
198
src/htslib.c
@@ -874,6 +874,50 @@ static void print_buffer(buff_struct*const str, const char *format, ...) {
|
|||||||
assertf(str->pos < str->capacity);
|
assertf(str->pos < str->capacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Append the request "Cookie:" header line for every stored cookie matching
|
||||||
|
domain/path. RFC 6265 form: bare "name=value" pairs joined by "; ", no
|
||||||
|
$Version/$Path attributes (those are RFC 2965 syntax that modern servers
|
||||||
|
reject, issue #151). Returns the number of cookies emitted. */
|
||||||
|
static int append_cookie_header(buff_struct *bstr, t_cookie *cookie,
|
||||||
|
const char *domain, const char *path) {
|
||||||
|
char buffer[8192];
|
||||||
|
char *b;
|
||||||
|
int cook = 0;
|
||||||
|
int max_cookies = 8;
|
||||||
|
|
||||||
|
if (cookie == NULL)
|
||||||
|
return 0;
|
||||||
|
b = cookie->data;
|
||||||
|
do {
|
||||||
|
b = cookie_find(b, "", domain, path); // next matching cookie
|
||||||
|
if (b != NULL) {
|
||||||
|
max_cookies--;
|
||||||
|
if (!cook) {
|
||||||
|
print_buffer(bstr, "Cookie: ");
|
||||||
|
cook = 1;
|
||||||
|
} else
|
||||||
|
print_buffer(bstr, "; ");
|
||||||
|
print_buffer(bstr, "%s", cookie_get(buffer, b, 5));
|
||||||
|
print_buffer(bstr, "=%s", cookie_get(buffer, b, 6));
|
||||||
|
b = cookie_nextfield(b);
|
||||||
|
}
|
||||||
|
} while (b != NULL && max_cookies > 0);
|
||||||
|
if (cook)
|
||||||
|
print_buffer(bstr, H_CRLF);
|
||||||
|
return cook;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Self-test entry for append_cookie_header(): build the request Cookie line
|
||||||
|
into dst (always NUL-terminated). Returns the number of cookies emitted. */
|
||||||
|
int http_cookie_header_selftest(t_cookie *cookie, const char *domain,
|
||||||
|
const char *path, char *dst, size_t dst_size) {
|
||||||
|
buff_struct bstr = {dst, dst_size, 0};
|
||||||
|
|
||||||
|
assertf(dst != NULL && dst_size > 0);
|
||||||
|
dst[0] = '\0';
|
||||||
|
return append_cookie_header(&bstr, cookie, domain, path);
|
||||||
|
}
|
||||||
|
|
||||||
// envoi d'une requète
|
// envoi d'une requète
|
||||||
int http_sendhead(httrackp * opt, t_cookie * cookie, int mode,
|
int http_sendhead(httrackp * opt, t_cookie * cookie, int mode,
|
||||||
const char *xsend, const char *adr, const char *fil,
|
const char *xsend, const char *adr, const char *fil,
|
||||||
@@ -1048,34 +1092,9 @@ int http_sendhead(httrackp * opt, t_cookie * cookie, int mode,
|
|||||||
search_tag + strlen(POSTTOK) + 1))));
|
search_tag + strlen(POSTTOK) + 1))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// gestion cookies?
|
// send stored cookies matching this host/path
|
||||||
if (cookie) {
|
if (cookie) {
|
||||||
char buffer[8192];
|
append_cookie_header(&bstr, cookie, jump_identification_const(adr), fil);
|
||||||
char *b = cookie->data;
|
|
||||||
int cook = 0;
|
|
||||||
int max_cookies = 8;
|
|
||||||
|
|
||||||
do {
|
|
||||||
b = cookie_find(b, "", jump_identification_const(adr), fil); // prochain cookie satisfaisant aux conditions
|
|
||||||
if (b != NULL) {
|
|
||||||
max_cookies--;
|
|
||||||
if (!cook) {
|
|
||||||
print_buffer(&bstr, "Cookie: $Version=1; ");
|
|
||||||
cook = 1;
|
|
||||||
} else
|
|
||||||
print_buffer(&bstr, "; ");
|
|
||||||
print_buffer(&bstr, "%s", cookie_get(buffer, b, 5));
|
|
||||||
print_buffer(&bstr, "=%s", cookie_get(buffer, b, 6));
|
|
||||||
print_buffer(&bstr, "; $Path=%s", cookie_get(buffer, b, 2));
|
|
||||||
b = cookie_nextfield(b);
|
|
||||||
}
|
|
||||||
} while(b != NULL && max_cookies > 0);
|
|
||||||
if (cook) { // on a envoyé un (ou plusieurs) cookie?
|
|
||||||
print_buffer(&bstr, H_CRLF);
|
|
||||||
#if DEBUG_COOK
|
|
||||||
printf("Header:\n%s\n", bstr.buffer);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// gérer le keep-alive (garder socket)
|
// gérer le keep-alive (garder socket)
|
||||||
if (retour->req.http11 && !retour->req.nokeepalive) {
|
if (retour->req.http11 && !retour->req.nokeepalive) {
|
||||||
@@ -2580,8 +2599,8 @@ HTSEXT_API TStamp mtime_local(void) {
|
|||||||
assert(! "gettimeofday");
|
assert(! "gettimeofday");
|
||||||
}
|
}
|
||||||
|
|
||||||
return (TStamp) (((TStamp) tv.tv_sec * (TStamp) 1000)
|
return (TStamp) (((TStamp) tv.tv_sec * (TStamp) 1000) +
|
||||||
+ ((TStamp) tv.tv_usec / (TStamp) 1000000));
|
((TStamp) tv.tv_usec / (TStamp) 1000));
|
||||||
#else
|
#else
|
||||||
struct timeb B;
|
struct timeb B;
|
||||||
ftime(&B);
|
ftime(&B);
|
||||||
@@ -3646,8 +3665,9 @@ HTSEXT_API char *unescape_http(char *const catbuff, const size_t size, const cha
|
|||||||
// DOES NOT DECODE %25 (part of CHAR_DELIM)
|
// DOES NOT DECODE %25 (part of CHAR_DELIM)
|
||||||
// no_high & 1: decode high chars
|
// no_high & 1: decode high chars
|
||||||
// no_high & 2: decode space
|
// no_high & 2: decode space
|
||||||
HTSEXT_API char *unescape_http_unharm(char *const catbuff, const size_t size,
|
HTSEXT_API char *unescape_http_unharm(char *const catbuff, const size_t size,
|
||||||
const char *s, const int no_high) {
|
const char *s,
|
||||||
|
const hts_boolean no_high) {
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
|
|
||||||
RUNTIME_TIME_CHECK_SIZE(size);
|
RUNTIME_TIME_CHECK_SIZE(size);
|
||||||
@@ -3931,8 +3951,8 @@ void hts_replace(char *s, char from, char to) {
|
|||||||
|
|
||||||
// guess a local file's mime type (e.g. fil="toto.gif" -> s="image/gif")
|
// guess a local file's mime type (e.g. fil="toto.gif" -> s="image/gif")
|
||||||
// returns 1 if a type was written to s, 0 otherwise
|
// returns 1 if a type was written to s, 0 otherwise
|
||||||
int guess_httptype_sized(httrackp *opt, char *s, size_t ssize,
|
hts_boolean guess_httptype_sized(httrackp *opt, char *s, size_t ssize,
|
||||||
const char *fil) {
|
const char *fil) {
|
||||||
return get_httptype_sized(opt, s, ssize, fil, 1);
|
return get_httptype_sized(opt, s, ssize, fil, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3945,8 +3965,8 @@ void guess_httptype(httrackp * opt, char *s, const char *fil) {
|
|||||||
// write the mime type for fil into s (capacity ssize)
|
// write the mime type for fil into s (capacity ssize)
|
||||||
// flag: 1 to always return a type (the "application/..." / octet-stream
|
// flag: 1 to always return a type (the "application/..." / octet-stream
|
||||||
// fallback) returns 1 if a type was written to s, 0 otherwise
|
// fallback) returns 1 if a type was written to s, 0 otherwise
|
||||||
HTSEXT_API int get_httptype_sized(httrackp *opt, char *s, size_t ssize,
|
HTSEXT_API hts_boolean get_httptype_sized(httrackp *opt, char *s, size_t ssize,
|
||||||
const char *fil, int flag) {
|
const char *fil, hts_boolean flag) {
|
||||||
// userdef overrides get_httptype (a rule with an empty value, e.g. "--assume
|
// userdef overrides get_httptype (a rule with an empty value, e.g. "--assume
|
||||||
// cgi=", matches but writes nothing: report it as "no type" like the old
|
// cgi=", matches but writes nothing: report it as "no type" like the old
|
||||||
// code, whose callers tested strnotempty(s))
|
// code, whose callers tested strnotempty(s))
|
||||||
@@ -4196,7 +4216,7 @@ HTSEXT_API int is_userknowntype(httrackp * opt, const char *fil) {
|
|||||||
|
|
||||||
// page dynamique?
|
// page dynamique?
|
||||||
// is_dyntype(get_ext("foo.asp"))
|
// is_dyntype(get_ext("foo.asp"))
|
||||||
HTSEXT_API int is_dyntype(const char *fil) {
|
HTSEXT_API hts_boolean is_dyntype(const char *fil) {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
|
|
||||||
if (!fil)
|
if (!fil)
|
||||||
@@ -4214,7 +4234,7 @@ HTSEXT_API int is_dyntype(const char *fil) {
|
|||||||
|
|
||||||
// types critiques qui ne doivent pas être changés car renvoyés par des serveurs qui ne
|
// types critiques qui ne doivent pas être changés car renvoyés par des serveurs qui ne
|
||||||
// connaissent pas le type
|
// connaissent pas le type
|
||||||
int may_unknown(httrackp * opt, const char *st) {
|
hts_boolean may_unknown(httrackp *opt, const char *st) {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
|
|
||||||
// types média
|
// types média
|
||||||
@@ -5236,7 +5256,8 @@ HTSEXT_API int hts_uninit_module(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// legacy. do not use
|
// legacy. do not use
|
||||||
HTSEXT_API int hts_log(httrackp * opt, const char *prefix, const char *msg) {
|
HTSEXT_API hts_boolean hts_log(httrackp *opt, const char *prefix,
|
||||||
|
const char *msg) {
|
||||||
if (opt->log != NULL) {
|
if (opt->log != NULL) {
|
||||||
fspc(opt, opt->log, prefix);
|
fspc(opt, opt->log, prefix);
|
||||||
fprintf(opt->log, "%s" LF, msg);
|
fprintf(opt->log, "%s" LF, msg);
|
||||||
@@ -5434,69 +5455,72 @@ HTSEXT_API httrackp *hts_create_opt(void) {
|
|||||||
|
|
||||||
/* default settings */
|
/* default settings */
|
||||||
|
|
||||||
opt->wizard = 2; // wizard automatique
|
opt->wizard = HTS_WIZARD_AUTO; // wizard automatique
|
||||||
opt->quiet = 0; // questions
|
opt->quiet = HTS_FALSE;
|
||||||
//
|
//
|
||||||
opt->travel = 0; // même adresse
|
opt->travel = HTS_TRAVEL_SAME_ADDRESS; // même adresse
|
||||||
opt->depth = 9999; // mirror total par défaut
|
opt->depth = 9999; // mirror total par défaut
|
||||||
opt->extdepth = 0; // mais pas à l'extérieur
|
opt->extdepth = 0; // mais pas à l'extérieur
|
||||||
opt->seeker = 1; // down
|
opt->seeker = HTS_SEEKER_DOWN; // down
|
||||||
opt->urlmode = 2; // relatif par défaut
|
opt->urlmode = HTS_URLMODE_RELATIVE; // relatif par défaut
|
||||||
opt->no_type_change = 0; // change file types
|
opt->no_type_change = HTS_FALSE;
|
||||||
opt->debug = LOG_NOTICE; // small log
|
opt->debug = LOG_NOTICE; // small log
|
||||||
opt->getmode = 3; // linear scan
|
opt->getmode = HTS_GETMODE_HTML | HTS_GETMODE_NONHTML;
|
||||||
opt->maxsite = -1; // taille max site (aucune)
|
opt->maxsite = -1; // taille max site (aucune)
|
||||||
opt->maxfile_nonhtml = -1; // taille max fichier non html
|
opt->maxfile_nonhtml = -1; // taille max fichier non html
|
||||||
opt->maxfile_html = -1; // idem pour html
|
opt->maxfile_html = -1; // idem pour html
|
||||||
opt->maxsoc = 4; // nbre socket max
|
opt->maxsoc = 4; // nbre socket max
|
||||||
opt->fragment = -1; // pas de fragmentation
|
opt->fragment = -1; // pas de fragmentation
|
||||||
opt->nearlink = 0; // ne pas prendre les liens non-html "adjacents"
|
opt->nearlink = HTS_FALSE;
|
||||||
opt->makeindex = 1; // faire un index
|
opt->makeindex = HTS_TRUE;
|
||||||
opt->kindex = 0; // index 'keyword'
|
opt->kindex = HTS_FALSE;
|
||||||
opt->delete_old = 1; // effacer anciens fichiers
|
opt->delete_old = HTS_TRUE;
|
||||||
opt->background_on_suspend = 1; // Background the process if Control Z calls signal suspend.
|
opt->background_on_suspend = HTS_TRUE;
|
||||||
opt->makestat = 0; // pas de fichier de stats
|
opt->makestat = HTS_FALSE;
|
||||||
opt->maketrack = 0; // ni de tracking
|
opt->maketrack = HTS_FALSE;
|
||||||
opt->timeout = 120; // timeout par défaut (2 minutes)
|
opt->timeout = 120; // timeout par défaut (2 minutes)
|
||||||
opt->cache = 1; // cache prioritaire
|
opt->cache = HTS_CACHE_PRIORITY; // cache prioritaire
|
||||||
opt->shell = 0; // pas de shell par defaut
|
opt->shell = HTS_FALSE;
|
||||||
opt->proxy.active = 0; // pas de proxy
|
opt->proxy.active = 0; // pas de proxy
|
||||||
opt->user_agent_send = 1; // envoyer un user-agent
|
opt->user_agent_send = HTS_TRUE;
|
||||||
StringCopy(opt->user_agent,
|
StringCopy(opt->user_agent,
|
||||||
"Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)");
|
"Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)");
|
||||||
StringCopy(opt->referer, "");
|
StringCopy(opt->referer, "");
|
||||||
StringCopy(opt->from, "");
|
StringCopy(opt->from, "");
|
||||||
opt->savename_83 = 0; // noms longs par défaut
|
opt->savename_83 = HTS_SAVENAME_83_LONG; // long names by default
|
||||||
opt->savename_type = 0; // avec structure originale
|
opt->savename_type = 0; // avec structure originale
|
||||||
opt->savename_delayed = 2; // hard delayed type (default)
|
opt->savename_delayed =
|
||||||
opt->delayed_cached = 1; // cached delayed type (default)
|
HTS_SAVENAME_DELAYED_HARD; // always delay the type check (default)
|
||||||
opt->mimehtml = 0; // pas MIME-html
|
opt->delayed_cached = HTS_TRUE;
|
||||||
|
opt->mimehtml = HTS_FALSE;
|
||||||
opt->parsejava = HTSPARSE_DEFAULT; // parser classes
|
opt->parsejava = HTSPARSE_DEFAULT; // parser classes
|
||||||
opt->hostcontrol = 0; // PAS de control host pour timeout et traffic jammer
|
opt->hostcontrol = 0; // PAS de control host pour timeout et traffic jammer
|
||||||
opt->retry = 2; // 2 retry par défaut
|
opt->retry = 2; // 2 retry par défaut
|
||||||
opt->errpage = 1; // copier ou générer une page d'erreur en cas d'erreur (404 etc.)
|
opt->errpage = HTS_TRUE;
|
||||||
opt->check_type = 1; // vérifier type si inconnu (cgi,asp..) SAUF / considéré comme html
|
// d'erreur (404 etc.)
|
||||||
opt->all_in_cache = 0; // ne pas tout stocker en cache
|
opt->check_type = HTS_TRUE;
|
||||||
opt->robots = 2; // traiter les robots.txt
|
// considéré comme html
|
||||||
opt->external = 0; // liens externes normaux
|
opt->all_in_cache = HTS_FALSE;
|
||||||
opt->passprivacy = 0; // mots de passe dans les fichiers
|
opt->robots = HTS_ROBOTS_ALWAYS; // traiter les robots.txt
|
||||||
opt->includequery = 1; // include query-string par défaut
|
opt->external = HTS_FALSE;
|
||||||
opt->mirror_first_page = 0; // pas mode mirror links
|
opt->passprivacy = HTS_FALSE;
|
||||||
opt->accept_cookie = 1; // gérer les cookies
|
opt->includequery = HTS_TRUE;
|
||||||
|
opt->mirror_first_page = HTS_FALSE;
|
||||||
|
opt->accept_cookie = HTS_TRUE;
|
||||||
opt->cookie = NULL;
|
opt->cookie = NULL;
|
||||||
opt->http10 = 0; // laisser http/1.1
|
opt->http10 = HTS_FALSE;
|
||||||
opt->nokeepalive = 0; // pas keep-alive
|
opt->nokeepalive = HTS_FALSE;
|
||||||
opt->nocompression = 0; // pas de compression
|
opt->nocompression = HTS_FALSE;
|
||||||
opt->tolerant = 0; // ne pas accepter content-length incorrect
|
opt->tolerant = HTS_FALSE;
|
||||||
opt->parseall = 1; // tout parser (tags inconnus, par exemple)
|
opt->parseall = HTS_TRUE;
|
||||||
opt->parsedebug = 0; // pas de mode débuggage
|
opt->parsedebug = HTS_FALSE;
|
||||||
opt->norecatch = 0; // ne pas reprendre les fichiers effacés par l'utilisateur
|
opt->norecatch = HTS_FALSE;
|
||||||
opt->verbosedisplay = 0; // pas d'animation texte
|
opt->verbosedisplay = HTS_VERBOSE_NONE; // no text animation
|
||||||
opt->sizehack = 0; // size hack
|
opt->sizehack = HTS_FALSE;
|
||||||
opt->urlhack = 1; // url hack (normalizer)
|
opt->urlhack = HTS_TRUE;
|
||||||
StringCopy(opt->footer, HTS_DEFAULT_FOOTER);
|
StringCopy(opt->footer, HTS_DEFAULT_FOOTER);
|
||||||
opt->ftp_proxy = 1; // proxy http pour ftp
|
opt->ftp_proxy = HTS_TRUE;
|
||||||
opt->convert_utf8 = 1; // convert html to UTF-8
|
opt->convert_utf8 = HTS_TRUE;
|
||||||
StringCopy(opt->filelist, "");
|
StringCopy(opt->filelist, "");
|
||||||
StringCopy(opt->lang_iso, "en, *");
|
StringCopy(opt->lang_iso, "en, *");
|
||||||
StringCopy(opt->accept,
|
StringCopy(opt->accept,
|
||||||
@@ -5507,9 +5531,9 @@ HTSEXT_API httrackp *hts_create_opt(void) {
|
|||||||
//
|
//
|
||||||
opt->log = stdout;
|
opt->log = stdout;
|
||||||
opt->errlog = stderr;
|
opt->errlog = stderr;
|
||||||
opt->flush = 1; // flush sur les fichiers log
|
opt->flush = HTS_TRUE;
|
||||||
//opt->aff_progress=0;
|
// opt->aff_progress=0;
|
||||||
opt->keyboard = 0;
|
opt->keyboard = HTS_FALSE;
|
||||||
//
|
//
|
||||||
StringCopy(opt->path_html, "");
|
StringCopy(opt->path_html, "");
|
||||||
StringCopy(opt->path_html_utf8, "");
|
StringCopy(opt->path_html_utf8, "");
|
||||||
@@ -5526,10 +5550,10 @@ HTSEXT_API httrackp *hts_create_opt(void) {
|
|||||||
opt->waittime = -1; // wait until.. hh*3600+mm*60+ss
|
opt->waittime = -1; // wait until.. hh*3600+mm*60+ss
|
||||||
//
|
//
|
||||||
opt->exec = "";
|
opt->exec = "";
|
||||||
opt->is_update = 0; // not an update (yet)
|
opt->is_update = HTS_FALSE;
|
||||||
opt->dir_topindex = 0; // do not built top index (yet)
|
opt->dir_topindex = HTS_FALSE;
|
||||||
//
|
//
|
||||||
opt->bypass_limits = 0; // enforce limits by default
|
opt->bypass_limits = HTS_FALSE;
|
||||||
opt->state.stop = 0; // stopper
|
opt->state.stop = 0; // stopper
|
||||||
opt->state.exit_xh = 0; // abort
|
opt->state.exit_xh = 0; // abort
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -182,6 +182,11 @@ int http_sendhead(httrackp * opt, t_cookie * cookie, int mode, const char *xsend
|
|||||||
const char *adr, const char *fil,
|
const char *adr, const char *fil,
|
||||||
const char *referer_adr, const char *referer_fil,
|
const char *referer_adr, const char *referer_fil,
|
||||||
htsblk * retour);
|
htsblk * retour);
|
||||||
|
/* Build the request "Cookie:" header line for stored cookies matching
|
||||||
|
domain/path into dst (NUL-terminated). Exposed for the -#Q self-test;
|
||||||
|
wraps the same logic http_sendhead() uses. Returns cookies emitted. */
|
||||||
|
int http_cookie_header_selftest(t_cookie *cookie, const char *domain,
|
||||||
|
const char *path, char *dst, size_t dst_size);
|
||||||
|
|
||||||
//int newhttp(char* iadr,char* err=NULL);
|
//int newhttp(char* iadr,char* err=NULL);
|
||||||
T_SOC newhttp(httrackp * opt, const char *iadr, htsblk * retour, int port,
|
T_SOC newhttp(httrackp * opt, const char *iadr, htsblk * retour, int port,
|
||||||
|
|||||||
@@ -184,10 +184,11 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
|
|
||||||
/* 8-3 ? */
|
/* 8-3 ? */
|
||||||
switch (opt->savename_83) {
|
switch (opt->savename_83) {
|
||||||
case 1: // 8-3
|
case HTS_SAVENAME_83_DOS: // 8-3
|
||||||
max_char = 8;
|
max_char = 8;
|
||||||
break;
|
break;
|
||||||
case 2: // Level 2 File names may be up to 31 characters.
|
case HTS_SAVENAME_83_ISO9660: // Level 2 File names may be up to 31
|
||||||
|
// characters.
|
||||||
max_char = 31;
|
max_char = 31;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -324,7 +325,7 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* replace shtml to html.. */
|
/* replace shtml to html.. */
|
||||||
if (opt->savename_delayed == 2)
|
if (opt->savename_delayed == HTS_SAVENAME_DELAYED_HARD)
|
||||||
is_html = -1; /* ALWAYS delay type */
|
is_html = -1; /* ALWAYS delay type */
|
||||||
else
|
else
|
||||||
is_html = ishtml(opt, fil);
|
is_html = ishtml(opt, fil);
|
||||||
@@ -363,7 +364,9 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
) {
|
) {
|
||||||
// tester type avec requète HEAD si on ne connait pas le type du fichier
|
// tester type avec requète HEAD si on ne connait pas le type du fichier
|
||||||
if (!((opt->check_type == 1) && (fil[strlen(fil) - 1] == '/'))) // slash doit être html?
|
if (!((opt->check_type == 1) && (fil[strlen(fil) - 1] == '/'))) // slash doit être html?
|
||||||
if (opt->savename_delayed == 2 || (ishtest = ishtml(opt, fil)) < 0) { // on ne sait pas si c'est un html ou un fichier..
|
if (opt->savename_delayed == HTS_SAVENAME_DELAYED_HARD ||
|
||||||
|
(ishtest = ishtml(opt, fil)) <
|
||||||
|
0) { // unsure whether it's html or a file
|
||||||
// lire dans le cache
|
// lire dans le cache
|
||||||
htsblk r = cache_read_including_broken(opt, cache, adr, fil); // test uniquement
|
htsblk r = cache_read_including_broken(opt, cache, adr, fil); // test uniquement
|
||||||
|
|
||||||
@@ -393,11 +396,12 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
//
|
//
|
||||||
} else if (opt->savename_delayed != 2 && is_userknowntype(opt, fil)) { /* PATCH BY BRIAN SCHRÖDER.
|
} else if (opt->savename_delayed != HTS_SAVENAME_DELAYED_HARD &&
|
||||||
Lookup mimetype not only by extension,
|
is_userknowntype(opt, fil)) { /* PATCH BY BRIAN SCHRÖDER.
|
||||||
but also by filename */
|
Lookup mimetype not only by extension,
|
||||||
/* Note: "foo.cgi => text/html" means that foo.cgi shall have the text/html MIME file type,
|
but also by filename */
|
||||||
that is, ".html" */
|
/* Note: "foo.cgi => text/html" means that foo.cgi shall have the
|
||||||
|
text/html MIME file type, that is, ".html" */
|
||||||
char BIGSTK mime[1024];
|
char BIGSTK mime[1024];
|
||||||
|
|
||||||
mime[0] = ext[0] = '\0';
|
mime[0] = ext[0] = '\0';
|
||||||
@@ -408,9 +412,13 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// note: if savename_delayed is enabled, the naming will be temporary (and slightly invalid!)
|
// note: if savename_delayed is enabled, the naming will be temporary
|
||||||
// note: if we are about to stop (opt->state.stop), back_add() will fail later
|
// (and slightly invalid!)
|
||||||
else if (opt->savename_delayed != 0 && !opt->state.stop) {
|
//
|
||||||
|
// note: if we are about to stop (opt->state.stop), back_add() will
|
||||||
|
// fail later
|
||||||
|
else if (opt->savename_delayed != HTS_SAVENAME_DELAYED_NONE &&
|
||||||
|
!opt->state.stop) {
|
||||||
// Check if the file is ready in backing. We basically take the same logic as later.
|
// Check if the file is ready in backing. We basically take the same logic as later.
|
||||||
// FIXME: we should cleanup and factorize this unholy mess
|
// FIXME: we should cleanup and factorize this unholy mess
|
||||||
if (headers != NULL && headers->status >= 0 && !is_redirect) {
|
if (headers != NULL && headers->status >= 0 && !is_redirect) {
|
||||||
@@ -698,7 +706,7 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
}
|
}
|
||||||
// restaurer
|
// restaurer
|
||||||
opt->state._hts_in_html_parsing = hihp;
|
opt->state._hts_in_html_parsing = hihp;
|
||||||
} // caché?
|
} // caché?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1190,7 +1198,8 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
// Not used anymore unless non-delayed types.
|
// Not used anymore unless non-delayed types.
|
||||||
// de même en cas de manque d'extension on en place une de manière forcée..
|
// de même en cas de manque d'extension on en place une de manière forcée..
|
||||||
// cela évite les /chez/toto et les /chez/toto/index.html incompatibles
|
// cela évite les /chez/toto et les /chez/toto/index.html incompatibles
|
||||||
if (opt->savename_type != -1 && opt->savename_delayed != 2) {
|
if (opt->savename_type != -1 &&
|
||||||
|
opt->savename_delayed != HTS_SAVENAME_DELAYED_HARD) {
|
||||||
char *a = afs->save + strlen(afs->save) - 1;
|
char *a = afs->save + strlen(afs->save) - 1;
|
||||||
|
|
||||||
while((a > afs->save) && (*a != '.') && (*a != '/'))
|
while((a > afs->save) && (*a != '.') && (*a != '/'))
|
||||||
@@ -1236,31 +1245,21 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
size_t i;
|
size_t i;
|
||||||
for(i = 0 ; afs->save[i] != '\0' ; i++) {
|
for(i = 0 ; afs->save[i] != '\0' ; i++) {
|
||||||
unsigned char c = (unsigned char) afs->save[i];
|
unsigned char c = (unsigned char) afs->save[i];
|
||||||
if (c < 32 // control
|
if (c < 32 // control
|
||||||
|| c == 127 // unwise
|
|| c == 127 // unwise
|
||||||
|| c == '~' // unix unwise
|
|| c == '~' // unix unwise
|
||||||
|| c == '\\' // windows separator
|
|| c == '\\' // windows separator
|
||||||
|| c == ':' // windows forbidden
|
|| c == ':' // windows forbidden
|
||||||
|| c == '*' // windows forbidden
|
|| c == '*' // windows forbidden
|
||||||
|| c == '?' // windows forbidden
|
|| c == '?' // windows forbidden
|
||||||
|| c == '\"' // windows forbidden
|
|| c == '\"' // windows forbidden
|
||||||
|| c == '<' // windows forbidden
|
|| c == '<' // windows forbidden
|
||||||
|| c == '>' // windows forbidden
|
|| c == '>' // windows forbidden
|
||||||
|| c == '|' // windows forbidden
|
|| c == '|' // windows forbidden
|
||||||
//|| c == '@' // ?
|
//|| c == '@' // ?
|
||||||
||
|
|| (opt->savename_83 == HTS_SAVENAME_83_ISO9660 // CDROM
|
||||||
(
|
&& (c == '-' || c == '=' || c == '+'))) {
|
||||||
opt->savename_83 == 2 // CDROM
|
afs->save[i] = '_';
|
||||||
&&
|
|
||||||
(
|
|
||||||
c == '-'
|
|
||||||
|| c == '='
|
|
||||||
|| c == '+'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
afs->save[i] = '_';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1521,7 +1520,8 @@ int url_savename(lien_adrfilsave *const afs,
|
|||||||
char *a = afs->save + strlen(afs->save) - 1;
|
char *a = afs->save + strlen(afs->save) - 1;
|
||||||
char *b;
|
char *b;
|
||||||
int n = 2;
|
int n = 2;
|
||||||
char collisionSeparator = ((opt->savename_83 != 2) ? '-' : '_');
|
char collisionSeparator =
|
||||||
|
((opt->savename_83 != HTS_SAVENAME_83_ISO9660) ? '-' : '_');
|
||||||
|
|
||||||
tempo[0] = '\0';
|
tempo[0] = '\0';
|
||||||
|
|
||||||
|
|||||||
198
src/htsopt.h
198
src/htsopt.h
@@ -285,6 +285,102 @@ typedef enum htsparsejava_flags {
|
|||||||
HTSPARSE_NO_AGGRESSIVE = 8 // don't aggressively parse .js or .java
|
HTSPARSE_NO_AGGRESSIVE = 8 // don't aggressively parse .js or .java
|
||||||
} htsparsejava_flags;
|
} htsparsejava_flags;
|
||||||
|
|
||||||
|
/* Link-rewriting style for saved pages (opt->urlmode). */
|
||||||
|
#ifndef HTS_DEF_DEFSTRUCT_hts_urlmode
|
||||||
|
#define HTS_DEF_DEFSTRUCT_hts_urlmode
|
||||||
|
typedef enum hts_urlmode {
|
||||||
|
HTS_URLMODE_ABSOLUTE = 0, /**< absolute URL (http://host/path) everywhere */
|
||||||
|
HTS_URLMODE_ABSOLUTE_FILE = 1, /**< legacy file: form, unused */
|
||||||
|
HTS_URLMODE_RELATIVE = 2, /**< relative link (default) */
|
||||||
|
HTS_URLMODE_ABSOLUTE_URI = 3, /**< absolute URI from root (/path) */
|
||||||
|
HTS_URLMODE_KEEP_ORIGINAL = 4, /**< keep the original link, do not rewrite */
|
||||||
|
HTS_URLMODE_TRANSPARENT_PROXY = 5 /**< transparent-proxy URL */
|
||||||
|
} hts_urlmode;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Cache policy for updates and retries (opt->cache). */
|
||||||
|
#ifndef HTS_DEF_DEFSTRUCT_hts_cachemode
|
||||||
|
#define HTS_DEF_DEFSTRUCT_hts_cachemode
|
||||||
|
typedef enum hts_cachemode {
|
||||||
|
HTS_CACHE_NONE = 0, /**< no cache */
|
||||||
|
HTS_CACHE_PRIORITY = 1, /**< cache takes priority over the network */
|
||||||
|
HTS_CACHE_TEST_UPDATE = 2 /**< check for update before reuse (default) */
|
||||||
|
} hts_cachemode;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Interactive wizard level (opt->wizard). */
|
||||||
|
#ifndef HTS_DEF_DEFSTRUCT_hts_wizard
|
||||||
|
#define HTS_DEF_DEFSTRUCT_hts_wizard
|
||||||
|
typedef enum hts_wizard {
|
||||||
|
HTS_WIZARD_NONE = 0, /**< no wizard */
|
||||||
|
HTS_WIZARD_ASK = 1, /**< wizard asks questions */
|
||||||
|
HTS_WIZARD_AUTO = 2 /**< wizard runs without asking */
|
||||||
|
} hts_wizard;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* robots.txt / meta-robots obedience level (opt->robots). */
|
||||||
|
#ifndef HTS_DEF_DEFSTRUCT_hts_robots
|
||||||
|
#define HTS_DEF_DEFSTRUCT_hts_robots
|
||||||
|
typedef enum hts_robots {
|
||||||
|
HTS_ROBOTS_NEVER = 0, /**< ignore robots rules */
|
||||||
|
HTS_ROBOTS_SOMETIMES = 1, /**< partial obedience (default) */
|
||||||
|
HTS_ROBOTS_ALWAYS = 2, /**< obey robots rules */
|
||||||
|
HTS_ROBOTS_ALWAYS_STRICT = 3 /**< obey even strict rules */
|
||||||
|
} hts_robots;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* What to fetch (opt->getmode bitmask). */
|
||||||
|
typedef enum hts_getmode {
|
||||||
|
HTS_GETMODE_HTML = 1 << 0, /**< save HTML files */
|
||||||
|
HTS_GETMODE_NONHTML = 1 << 1, /**< save non-HTML files */
|
||||||
|
HTS_GETMODE_HTML_FIRST = 1 << 2 /**< fetch HTML first, then the other files */
|
||||||
|
} hts_getmode;
|
||||||
|
|
||||||
|
/* Allowed directions in the directory tree (opt->seeker bitmask). */
|
||||||
|
typedef enum hts_seeker {
|
||||||
|
HTS_SEEKER_DOWN = 1 << 0, /**< may descend into subdirectories */
|
||||||
|
HTS_SEEKER_UP = 1 << 1 /**< may ascend to parent directories */
|
||||||
|
} hts_seeker;
|
||||||
|
|
||||||
|
/* opt->travel: link-following scope in the low byte, flags OR'd in above it. */
|
||||||
|
typedef enum hts_travel_scope {
|
||||||
|
HTS_TRAVEL_SAME_ADDRESS = 0, /**< stay on the same address (host) */
|
||||||
|
HTS_TRAVEL_SAME_DOMAIN = 1, /**< stay on the same principal domain */
|
||||||
|
HTS_TRAVEL_SAME_TLD = 2, /**< stay on the same TLD (e.g. .com) */
|
||||||
|
HTS_TRAVEL_EVERYWHERE = 7, /**< follow links anywhere on the web */
|
||||||
|
HTS_TRAVEL_TEST_ALL = 1 << 8 /**< also test forbidden URLs (-t) */
|
||||||
|
} hts_travel_scope;
|
||||||
|
|
||||||
|
/* Mask selecting the scope value out of opt->travel. */
|
||||||
|
#define HTS_TRAVEL_SCOPE_MASK 0xff
|
||||||
|
|
||||||
|
/* Text progress display detail (opt->verbosedisplay). */
|
||||||
|
typedef enum hts_verbosedisplay {
|
||||||
|
HTS_VERBOSE_NONE = 0, /**< no animated progress display (default) */
|
||||||
|
HTS_VERBOSE_SIMPLE = 1, /**< minimal single-line progress */
|
||||||
|
HTS_VERBOSE_FULL = 2 /**< full animated progress */
|
||||||
|
} hts_verbosedisplay;
|
||||||
|
|
||||||
|
/* Delayed file-type resolution policy (opt->savename_delayed). */
|
||||||
|
typedef enum hts_savename_delayed {
|
||||||
|
HTS_SAVENAME_DELAYED_NONE = 0, /**< resolve the type immediately */
|
||||||
|
HTS_SAVENAME_DELAYED_SOFT = 1, /**< delay the type check when unknown */
|
||||||
|
HTS_SAVENAME_DELAYED_HARD = 2 /**< always delay the type check (default) */
|
||||||
|
} hts_savename_delayed;
|
||||||
|
|
||||||
|
/* Saved-name length layout (opt->savename_83). */
|
||||||
|
typedef enum hts_savename_83 {
|
||||||
|
HTS_SAVENAME_83_LONG = 0, /**< long file names (default) */
|
||||||
|
HTS_SAVENAME_83_DOS = 1, /**< DOS 8.3 names (ISO9660 level 1) */
|
||||||
|
HTS_SAVENAME_83_ISO9660 = 2 /**< ISO9660 level 2 names (up to 31 chars) */
|
||||||
|
} hts_savename_83;
|
||||||
|
|
||||||
|
/* Host-banning triggers (opt->hostcontrol bitmask). */
|
||||||
|
typedef enum hts_hostcontrol {
|
||||||
|
HTS_HOSTCONTROL_BAN_TIMEOUT = 1 << 0, /**< ban a timing-out host */
|
||||||
|
HTS_HOSTCONTROL_BAN_SLOW = 1 << 1 /**< ban a too-slow host */
|
||||||
|
} hts_hostcontrol;
|
||||||
|
|
||||||
#ifndef HTS_DEF_FWSTRUCT_lien_buffers
|
#ifndef HTS_DEF_FWSTRUCT_lien_buffers
|
||||||
#define HTS_DEF_FWSTRUCT_lien_buffers
|
#define HTS_DEF_FWSTRUCT_lien_buffers
|
||||||
typedef struct lien_buffers lien_buffers;
|
typedef struct lien_buffers lien_buffers;
|
||||||
@@ -308,15 +404,16 @@ typedef struct httrackp httrackp;
|
|||||||
struct httrackp {
|
struct httrackp {
|
||||||
size_t size_httrackp; /**< size of this structure (version/ABI guard) */
|
size_t size_httrackp; /**< size of this structure (version/ABI guard) */
|
||||||
/* */
|
/* */
|
||||||
int wizard; /**< interactive wizard level (none/full/light) */
|
hts_wizard wizard; /**< interactive wizard level (none/ask/auto) */
|
||||||
int flush; /**< fflush() log files after each write */
|
hts_boolean flush; /**< fflush() log files after each write */
|
||||||
int travel; /**< link-following scope (same domain, etc.) */
|
int travel; /**< link-following scope (same domain, etc.) */
|
||||||
int seeker; /**< allowed direction: go up and/or down the tree */
|
int seeker; /**< allowed direction: go up and/or down the tree */
|
||||||
int depth; /**< maximum recursion depth (-rN) */
|
int depth; /**< maximum recursion depth (-rN) */
|
||||||
int extdepth; /**< maximum recursion depth outside the start domain */
|
int extdepth; /**< maximum recursion depth outside the start domain */
|
||||||
int urlmode; /**< saved-link rewriting style (relative, absolute, etc.) */
|
hts_urlmode
|
||||||
int no_type_change; // do not change file type according to MIME
|
urlmode; /**< saved-link rewriting style (relative, absolute, etc.) */
|
||||||
int debug; /**< debug logging level */
|
hts_boolean no_type_change; // do not change file type according to MIME
|
||||||
|
hts_log_type debug; /**< debug logging level */
|
||||||
int getmode; /**< what to fetch (HTML, images, ...) bitmask */
|
int getmode; /**< what to fetch (HTML, images, ...) bitmask */
|
||||||
FILE *log; /**< informational log stream; NULL mutes it */
|
FILE *log; /**< informational log stream; NULL mutes it */
|
||||||
FILE *errlog; /**< error log stream; NULL mutes it */
|
FILE *errlog; /**< error log stream; NULL mutes it */
|
||||||
@@ -325,28 +422,31 @@ struct httrackp {
|
|||||||
LLint maxfile_html; /**< max bytes per HTML file */
|
LLint maxfile_html; /**< max bytes per HTML file */
|
||||||
int maxsoc; /**< max simultaneous sockets (-cN) */
|
int maxsoc; /**< max simultaneous sockets (-cN) */
|
||||||
LLint fragment; /**< split site after this many bytes */
|
LLint fragment; /**< split site after this many bytes */
|
||||||
int nearlink; /**< also fetch images/data adjacent to a page but off-site */
|
hts_boolean
|
||||||
int makeindex; /**< build a top-level index.html */
|
nearlink; /**< also fetch images/data adjacent to a page but off-site */
|
||||||
int kindex; /**< build a keyword index */
|
hts_boolean makeindex; /**< build a top-level index.html */
|
||||||
int delete_old; /**< delete locally obsolete files after update */
|
hts_boolean kindex; /**< build a keyword index */
|
||||||
|
hts_boolean delete_old; /**< delete locally obsolete files after update */
|
||||||
int timeout; /**< connection timeout in seconds */
|
int timeout; /**< connection timeout in seconds */
|
||||||
int rateout; /**< minimum transfer rate (bytes/s) before abort */
|
int rateout; /**< minimum transfer rate (bytes/s) before abort */
|
||||||
int maxtime; /**< max total mirror duration in seconds */
|
int maxtime; /**< max total mirror duration in seconds */
|
||||||
int maxrate; /**< max transfer rate cap (bytes/s) */
|
int maxrate; /**< max transfer rate cap (bytes/s) */
|
||||||
float maxconn; /**< max connections per second */
|
float maxconn; /**< max connections per second */
|
||||||
int waittime; /**< scheduled start time (wall-clock seconds) */
|
int waittime; /**< scheduled start time (wall-clock seconds) */
|
||||||
int cache; /**< cache generation mode */
|
hts_cachemode cache; /**< cache generation mode */
|
||||||
// int aff_progress; // progress bar
|
// int aff_progress; // progress bar
|
||||||
int shell; /**< driven by a shell over stdin/stdout pipes */
|
hts_boolean shell; /**< driven by a shell over stdin/stdout pipes */
|
||||||
t_proxy proxy; /**< proxy configuration */
|
t_proxy proxy; /**< proxy configuration */
|
||||||
int savename_83; /**< force 8.3 (DOS) file names */
|
hts_savename_83
|
||||||
|
savename_83; /**< saved-name length layout (long/DOS/ISO9660) */
|
||||||
int savename_type; /**< saved-name layout (original tree, flat, ...) */
|
int savename_type; /**< saved-name layout (original tree, flat, ...) */
|
||||||
String
|
String
|
||||||
savename_userdef; /**< user-defined name template (e.g. %h%p/%n%q.%t) */
|
savename_userdef; /**< user-defined name template (e.g. %h%p/%n%q.%t) */
|
||||||
int savename_delayed; // delayed type check
|
hts_savename_delayed savename_delayed; /**< delayed type-check policy */
|
||||||
int delayed_cached; // delayed type check can be cached to speedup updates
|
hts_boolean
|
||||||
int mimehtml; /**< produce a single MIME/MHTML archive */
|
delayed_cached; // delayed type check can be cached to speedup updates
|
||||||
int user_agent_send; /**< send a User-Agent header */
|
hts_boolean mimehtml; /**< produce a single MIME/MHTML archive */
|
||||||
|
hts_boolean user_agent_send; /**< send a User-Agent header */
|
||||||
String user_agent; /**< User-Agent value (e.g. httrack/1.0) */
|
String user_agent; /**< User-Agent value (e.g. httrack/1.0) */
|
||||||
String referer; /**< Referer value to send */
|
String referer; /**< Referer value to send */
|
||||||
String from; /**< From value to send */
|
String from; /**< From value to send */
|
||||||
@@ -355,37 +455,39 @@ struct httrackp {
|
|||||||
String path_html_utf8; /**< output directory for the mirror, UTF-8 form */
|
String path_html_utf8; /**< output directory for the mirror, UTF-8 form */
|
||||||
String path_bin; /**< directory for HTML templates */
|
String path_bin; /**< directory for HTML templates */
|
||||||
int retry; /**< extra retries on a failed transfer */
|
int retry; /**< extra retries on a failed transfer */
|
||||||
int makestat; /**< maintain a transfer-statistics log */
|
hts_boolean makestat; /**< maintain a transfer-statistics log */
|
||||||
int maketrack; /**< maintain an operations-statistics log */
|
hts_boolean maketrack; /**< maintain an operations-statistics log */
|
||||||
int parsejava; /**< Java/JS parsing mode; see htsparsejava_flags */
|
int parsejava; /**< Java/JS parsing mode; see htsparsejava_flags */
|
||||||
int hostcontrol; /**< drop hosts that are too slow, etc. */
|
int hostcontrol; /**< ban slow/timing-out hosts; see hts_hostcontrol bits */
|
||||||
int errpage; /**< generate an error page on 404 and similar */
|
hts_boolean errpage; /**< generate an error page on 404 and similar */
|
||||||
int check_type; /**< probe unknown-type links (cgi/asp/dir) and follow moves
|
hts_boolean
|
||||||
*/
|
check_type; /**< probe unknown-type links (cgi/asp/dir) and follow moves
|
||||||
int all_in_cache; /**< keep all retrieved data in the cache */
|
*/
|
||||||
int robots; /**< robots.txt handling level */
|
hts_boolean all_in_cache; /**< keep all retrieved data in the cache */
|
||||||
int external; /**< render external links as error pages */
|
hts_robots robots; /**< robots.txt handling level */
|
||||||
int passprivacy; /**< strip passwords from external links */
|
hts_boolean external; /**< render external links as error pages */
|
||||||
int includequery; /**< include the query string in saved names */
|
hts_boolean passprivacy; /**< strip passwords from external links */
|
||||||
int mirror_first_page; /**< only mirror the links of the first page */
|
hts_boolean includequery; /**< include the query string in saved names */
|
||||||
|
hts_boolean mirror_first_page; /**< only mirror the links of the first page */
|
||||||
String sys_com; /**< system command to run */
|
String sys_com; /**< system command to run */
|
||||||
int sys_com_exec; /**< actually execute sys_com */
|
hts_boolean sys_com_exec; /**< actually execute sys_com */
|
||||||
int accept_cookie; /**< accept and send cookies */
|
hts_boolean accept_cookie; /**< accept and send cookies */
|
||||||
t_cookie *cookie; /**< cookie store */
|
t_cookie *cookie; /**< cookie store */
|
||||||
int http10; /**< force HTTP/1.0 */
|
hts_boolean http10; /**< force HTTP/1.0 */
|
||||||
int nokeepalive; /**< disable keep-alive */
|
hts_boolean nokeepalive; /**< disable keep-alive */
|
||||||
int nocompression; /**< disable content compression */
|
hts_boolean nocompression; /**< disable content compression */
|
||||||
int sizehack; /**< treat same-size response as "updated" */
|
hts_boolean sizehack; /**< treat same-size response as "updated" */
|
||||||
int urlhack; // force "url normalization" to avoid loops
|
hts_boolean urlhack; // force "url normalization" to avoid loops
|
||||||
int tolerant; /**< accept an incorrect Content-Length */
|
hts_boolean tolerant; /**< accept an incorrect Content-Length */
|
||||||
int parseall; /**< parse aggressively, including unknown tags with links */
|
hts_boolean
|
||||||
int parsedebug; /**< parser debug mode */
|
parseall; /**< parse aggressively, including unknown tags with links */
|
||||||
int norecatch; /**< do not re-fetch files the user deleted locally */
|
hts_boolean parsedebug; /**< parser debug mode */
|
||||||
int verbosedisplay; /**< animated text progress display */
|
hts_boolean norecatch; /**< do not re-fetch files the user deleted locally */
|
||||||
|
hts_verbosedisplay verbosedisplay; /**< animated text progress display */
|
||||||
String footer; /**< footer/info line injected into pages */
|
String footer; /**< footer/info line injected into pages */
|
||||||
int maxcache; /**< in-memory cache backing limit (bytes) */
|
int maxcache; /**< in-memory cache backing limit (bytes) */
|
||||||
// int maxcache_anticipate; // maximum links to anticipate (upper bound)
|
// int maxcache_anticipate; // maximum links to anticipate (upper bound)
|
||||||
int ftp_proxy; /**< use the HTTP proxy for FTP too */
|
hts_boolean ftp_proxy; /**< use the HTTP proxy for FTP too */
|
||||||
String filelist; /**< file listing URLs to include */
|
String filelist; /**< file listing URLs to include */
|
||||||
String urllist; /**< file listing filters to include */
|
String urllist; /**< file listing filters to include */
|
||||||
htsfilters filters; /**< filter pointers (+/-pattern rules) */
|
htsfilters filters; /**< filter pointers (+/-pattern rules) */
|
||||||
@@ -399,20 +501,20 @@ struct httrackp {
|
|||||||
String headers; // Additional headers
|
String headers; // Additional headers
|
||||||
String mimedefs; // ext1=mimetype1\next2=mimetype2..
|
String mimedefs; // ext1=mimetype1\next2=mimetype2..
|
||||||
String mod_blacklist; /**< blacklisted modules */
|
String mod_blacklist; /**< blacklisted modules */
|
||||||
int convert_utf8; // filenames UTF-8 conversion (3.46)
|
hts_boolean convert_utf8; // filenames UTF-8 conversion (3.46)
|
||||||
//
|
//
|
||||||
int maxlink; /**< max number of links */
|
int maxlink; /**< max number of links */
|
||||||
int maxfilter; /**< max number of filters */
|
int maxfilter; /**< max number of filters */
|
||||||
//
|
//
|
||||||
const char *exec; /**< path of the running executable */
|
const char *exec; /**< path of the running executable */
|
||||||
//
|
//
|
||||||
int quiet; /**< suppress non-wizard questions */
|
hts_boolean quiet; /**< suppress non-wizard questions */
|
||||||
int keyboard; /**< poll stdin for keyboard input */
|
hts_boolean keyboard; /**< poll stdin for keyboard input */
|
||||||
int bypass_limits; // bypass built-in limits
|
hts_boolean bypass_limits; // bypass built-in limits
|
||||||
int background_on_suspend; // background process on suspend signal
|
hts_boolean background_on_suspend; // background process on suspend signal
|
||||||
//
|
//
|
||||||
int is_update; /**< this run is an update (show "File updated...") */
|
hts_boolean is_update; /**< this run is an update (show "File updated...") */
|
||||||
int dir_topindex; /**< rebuild the top index afterwards */
|
hts_boolean dir_topindex; /**< rebuild the top index afterwards */
|
||||||
//
|
//
|
||||||
// callbacks
|
// callbacks
|
||||||
t_hts_htmlcheck_callbacks
|
t_hts_htmlcheck_callbacks
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Now, parsing
|
// Now, parsing
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) { // récupérer les html sur disque
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
// créer le fichier html local
|
// créer le fichier html local
|
||||||
HT_ADD_FOP; // écrire peu à peu le fichier
|
HT_ADD_FOP; // écrire peu à peu le fichier
|
||||||
}
|
}
|
||||||
@@ -553,7 +553,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
if (opt->depth == heap(ptr)->depth) { // on note toujours les premiers liens
|
if (opt->depth == heap(ptr)->depth) { // on note toujours les premiers liens
|
||||||
if (!in_media) {
|
if (!in_media) {
|
||||||
if (opt->makeindex && (ptr > 0)) {
|
if (opt->makeindex && (ptr > 0)) {
|
||||||
if (opt->getmode & 1) { // autorisation d'écrire
|
if (opt->getmode & HTS_GETMODE_HTML) {
|
||||||
p = strfield(html, "title");
|
p = strfield(html, "title");
|
||||||
if (p) {
|
if (p) {
|
||||||
if (*(html - 1) == '/')
|
if (*(html - 1) == '/')
|
||||||
@@ -704,7 +704,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt->getmode & 1) { // sauver html
|
if (opt->getmode & HTS_GETMODE_HTML) { // sauver html
|
||||||
p = 0;
|
p = 0;
|
||||||
switch (emited_footer) {
|
switch (emited_footer) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -740,7 +740,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
|
|
||||||
if (strchr(r->adr, '\r'))
|
if (strchr(r->adr, '\r'))
|
||||||
eol = "\r\n";
|
eol = "\r\n";
|
||||||
if (StringNotEmpty(opt->footer) || opt->urlmode != 4) { /* != preserve */
|
if (StringNotEmpty(opt->footer) ||
|
||||||
|
opt->urlmode != HTS_URLMODE_KEEP_ORIGINAL) {
|
||||||
if (StringNotEmpty(opt->footer)) {
|
if (StringNotEmpty(opt->footer)) {
|
||||||
char BIGSTK tempo[1024 + HTS_URLMAXSIZE * 2];
|
char BIGSTK tempo[1024 + HTS_URLMAXSIZE * 2];
|
||||||
char gmttime[256];
|
char gmttime[256];
|
||||||
@@ -1746,7 +1747,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
|
|
||||||
// écrire codebase avant, flusher avant code
|
// écrire codebase avant, flusher avant code
|
||||||
if ((p_type == -1) || (p_type == -2)) {
|
if ((p_type == -1) || (p_type == -2)) {
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
HT_add_adr; // refresh
|
HT_add_adr; // refresh
|
||||||
}
|
}
|
||||||
lastsaved = html; // dernier écrit+1
|
lastsaved = html; // dernier écrit+1
|
||||||
@@ -1837,7 +1838,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
|
|
||||||
// ne pas flusher après code si on doit écrire le codebase avant!
|
// ne pas flusher après code si on doit écrire le codebase avant!
|
||||||
if ((p_type != -1) && (p_type != 2) && (p_type != -2)) {
|
if ((p_type != -1) && (p_type != 2) && (p_type != -2)) {
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
HT_add_adr; // refresh
|
HT_add_adr; // refresh
|
||||||
}
|
}
|
||||||
lastsaved = html; // dernier écrit+1
|
lastsaved = html; // dernier écrit+1
|
||||||
@@ -1914,7 +1915,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
if (*html != '#') { // Not empty+unique #
|
if (*html != '#') { // Not empty+unique #
|
||||||
if (eadr - html == 1) { // 1=link empty with delim (end_adr-start_adr)
|
if (eadr - html == 1) { // 1=link empty with delim (end_adr-start_adr)
|
||||||
if (quote) {
|
if (quote) {
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
HT_ADD("#"); // We add this for a <href="">
|
HT_ADD("#"); // We add this for a <href="">
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2569,7 +2570,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
if ((p_type == 2) || (p_type == -2)) { // base href ou codebase, pas un lien
|
if ((p_type == 2) || (p_type == -2)) { // base href ou codebase, pas un lien
|
||||||
hts_log_print(opt, LOG_DEBUG, "Code/Codebase: %s%s",
|
hts_log_print(opt, LOG_DEBUG, "Code/Codebase: %s%s",
|
||||||
afs.af.adr, afs.af.fil);
|
afs.af.adr, afs.af.fil);
|
||||||
} else if ((opt->getmode & 4) == 0) {
|
} else if ((opt->getmode & HTS_GETMODE_HTML_FIRST) ==
|
||||||
|
0) {
|
||||||
hts_log_print(opt, LOG_DEBUG, "Record: %s%s -> %s",
|
hts_log_print(opt, LOG_DEBUG, "Record: %s%s -> %s",
|
||||||
afs.af.adr, afs.af.fil, afs.save);
|
afs.af.adr, afs.af.fil, afs.save);
|
||||||
} else {
|
} else {
|
||||||
@@ -2592,8 +2594,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
lastsaved = eadr - 1 + 1; // sauter "
|
lastsaved = eadr - 1 + 1; // sauter "
|
||||||
}
|
}
|
||||||
/* */
|
/* */
|
||||||
else if (opt->urlmode == 0) { // URL absolue dans tous les cas
|
else if (opt->urlmode == HTS_URLMODE_ABSOLUTE) {
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) { // ecrire les html
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
if (!link_has_authority(afs.af.adr)) {
|
if (!link_has_authority(afs.af.adr)) {
|
||||||
HT_ADD("http://");
|
HT_ADD("http://");
|
||||||
} else {
|
} else {
|
||||||
@@ -2620,12 +2622,14 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
}
|
}
|
||||||
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
||||||
/* */
|
/* */
|
||||||
} else if (opt->urlmode == 4) { // ne rien faire!
|
} else if (opt->urlmode == HTS_URLMODE_KEEP_ORIGINAL) {
|
||||||
/* */
|
/* */
|
||||||
/* leave the link 'as is' */
|
/* leave the link 'as is' */
|
||||||
/* Sinon, dépend de interne/externe */
|
/* Sinon, dépend de interne/externe */
|
||||||
} else if (forbidden_url == 1) { // le lien ne sera pas chargé, référence externe!
|
} else if (forbidden_url ==
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
1) { // le lien ne sera pas chargé, référence
|
||||||
|
// externe!
|
||||||
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
if (p_type != -1) { // pas que le nom de fichier (pas classe java)
|
if (p_type != -1) { // pas que le nom de fichier (pas classe java)
|
||||||
if (!opt->external) {
|
if (!opt->external) {
|
||||||
if (!link_has_authority(afs.af.adr)) {
|
if (!link_has_authority(afs.af.adr)) {
|
||||||
@@ -2674,7 +2678,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
'/') ? 1 : (ishtml(opt, afs.af.fil)))) {
|
'/') ? 1 : (ishtml(opt, afs.af.fil)))) {
|
||||||
case 1:
|
case 1:
|
||||||
case -2: // html ou répertoire
|
case -2: // html ou répertoire
|
||||||
if (opt->getmode & 1) { // sauver html
|
if (opt->getmode & HTS_GETMODE_HTML) {
|
||||||
patch_it = 1; // redirect
|
patch_it = 1; // redirect
|
||||||
add_url = 1; // avec link?
|
add_url = 1; // avec link?
|
||||||
cat_name = "external.html";
|
cat_name = "external.html";
|
||||||
@@ -2847,7 +2851,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// érire codebase="chemin"
|
// érire codebase="chemin"
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) &&
|
||||||
|
(ptr > 0)) {
|
||||||
char BIGSTK tempo4[HTS_URLMAXSIZE * 2];
|
char BIGSTK tempo4[HTS_URLMAXSIZE * 2];
|
||||||
|
|
||||||
tempo4[0] = '\0';
|
tempo4[0] = '\0';
|
||||||
@@ -2875,9 +2880,11 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
lastsaved = eadr - 1;
|
lastsaved = eadr - 1;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
else if (opt->urlmode==1) { // ABSOLU, c'est le cas le moins courant
|
else if (opt->urlmode==1) { // ABSOLU, c'est le cas le
|
||||||
|
moins courant
|
||||||
// NE FONCTIONNE PAS!! (et est inutile)
|
// NE FONCTIONNE PAS!! (et est inutile)
|
||||||
if ((opt->getmode & 1) && (ptr>0)) { // ecrire les html
|
if ((opt->getmode & 1) && (ptr>0)) { // ecrire les
|
||||||
|
html
|
||||||
// écrire le lien modifié, absolu
|
// écrire le lien modifié, absolu
|
||||||
HT_ADD("file:");
|
HT_ADD("file:");
|
||||||
if (*save=='/')
|
if (*save=='/')
|
||||||
@@ -2885,7 +2892,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
else
|
else
|
||||||
HT_ADD(save)
|
HT_ADD(save)
|
||||||
}
|
}
|
||||||
lastsaved=eadr-1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
lastsaved=eadr-1; // dernier écrit+1 (enfin euh apres
|
||||||
|
on fait un ++ alors hein)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
else if (opt->mimehtml) {
|
else if (opt->mimehtml) {
|
||||||
@@ -2895,18 +2903,18 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
make_content_id(afs.af.adr, afs.af.fil, cid, sizeof(cid));
|
make_content_id(afs.af.adr, afs.af.fil, cid, sizeof(cid));
|
||||||
HT_ADD_HTMLESCAPED(cid);
|
HT_ADD_HTMLESCAPED(cid);
|
||||||
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
||||||
} else if (opt->urlmode == 3) { // URI absolue /
|
} else if (opt->urlmode == HTS_URLMODE_ABSOLUTE_URI) {
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) { // ecrire les html
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
HT_ADD_HTMLESCAPED(afs.af.fil);
|
HT_ADD_HTMLESCAPED(afs.af.fil);
|
||||||
}
|
}
|
||||||
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
||||||
} else if (opt->urlmode == 5) { // transparent proxy URL
|
} else if (opt->urlmode == HTS_URLMODE_TRANSPARENT_PROXY) {
|
||||||
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
||||||
const char *uri;
|
const char *uri;
|
||||||
int i;
|
int i;
|
||||||
char *pos;
|
char *pos;
|
||||||
|
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) { // ecrire les html
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
if (!link_has_authority(afs.af.adr)) {
|
if (!link_has_authority(afs.af.adr)) {
|
||||||
HT_ADD("http://");
|
HT_ADD("http://");
|
||||||
} else {
|
} else {
|
||||||
@@ -2947,7 +2955,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
HT_ADD_HTMLESCAPED(tempo);
|
HT_ADD_HTMLESCAPED(tempo);
|
||||||
}
|
}
|
||||||
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
lastsaved = eadr - 1; // dernier écrit+1 (enfin euh apres on fait un ++ alors hein)
|
||||||
} else if (opt->urlmode == 2) { // RELATIF
|
} else if (opt->urlmode == HTS_URLMODE_RELATIVE) {
|
||||||
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
char BIGSTK tempo[HTS_URLMAXSIZE * 2];
|
||||||
|
|
||||||
tempo[0] = '\0';
|
tempo[0] = '\0';
|
||||||
@@ -3009,7 +3017,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// érire codebase="chemin"
|
// érire codebase="chemin"
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) &&
|
||||||
|
(ptr > 0)) {
|
||||||
char BIGSTK tempo4[HTS_URLMAXSIZE * 2];
|
char BIGSTK tempo4[HTS_URLMAXSIZE * 2];
|
||||||
|
|
||||||
tempo4[0] = '\0';
|
tempo4[0] = '\0';
|
||||||
@@ -3027,7 +3036,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
//lastsaved=adr; // dernier écrit+1
|
//lastsaved=adr; // dernier écrit+1
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
// convert to local codepage - NOT, already converted into %NN, and passed to the remote server so we do not have anything to do
|
// convert to local codepage - NOT, already converted into %NN, and passed to the remote server so we do not have anything to do
|
||||||
//if (str->page_charset_ != NULL && *str->page_charset_ != '\0') {
|
//if (str->page_charset_ != NULL && *str->page_charset_ != '\0') {
|
||||||
// char *const local_save = hts_convertStringFromUTF8(tempo, strlen(tempo), str->page_charset_);
|
// char *const local_save = hts_convertStringFromUTF8(tempo, strlen(tempo), str->page_charset_);
|
||||||
@@ -3061,7 +3070,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
"Error building relative link %s and %s",
|
"Error building relative link %s and %s",
|
||||||
afs.save, relativesavename());
|
afs.save, relativesavename());
|
||||||
}
|
}
|
||||||
} // sinon le lien sera écrit normalement
|
} // sinon le lien sera écrit normalement
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (fexist(save)) { // le fichier existe..
|
if (fexist(save)) { // le fichier existe..
|
||||||
@@ -3089,7 +3098,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
opt->maxlink);
|
opt->maxlink);
|
||||||
hts_log_print(opt, LOG_INFO,
|
hts_log_print(opt, LOG_INFO,
|
||||||
"To avoid that: use #L option for more links (example: -#L1000000)");
|
"To avoid that: use #L option for more links (example: -#L1000000)");
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
if (fp) {
|
if (fp) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
@@ -3101,9 +3110,9 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
int pass_fix, dejafait = 0;
|
int pass_fix, dejafait = 0;
|
||||||
|
|
||||||
// Calculer la priorité de ce lien
|
// Calculer la priorité de ce lien
|
||||||
if ((opt->getmode & 4) == 0) { // traiter html après
|
if ((opt->getmode & HTS_GETMODE_HTML_FIRST) == 0) {
|
||||||
pass_fix = 0;
|
pass_fix = 0;
|
||||||
} else { // vérifier que ce n'est pas un !html
|
} else { // vérifier que ce n'est pas un !html
|
||||||
if (!ishtml(opt, afs.af.fil))
|
if (!ishtml(opt, afs.af.fil))
|
||||||
pass_fix = 1; // priorité inférieure (traiter après)
|
pass_fix = 1; // priorité inférieure (traiter après)
|
||||||
else
|
else
|
||||||
@@ -3167,7 +3176,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
if (checkrobots(_ROBOTS, afs.af.adr, "") == -1) { // robots.txt ?
|
if (checkrobots(_ROBOTS, afs.af.adr, "") == -1) { // robots.txt ?
|
||||||
// enregistrer robots.txt (MACRO)
|
// enregistrer robots.txt (MACRO)
|
||||||
if (!hts_record_link(opt, afs.af.adr, "/robots.txt", "", "", "", NULL)) {
|
if (!hts_record_link(opt, afs.af.adr, "/robots.txt", "", "", "", NULL)) {
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) &&
|
||||||
|
(ptr > 0)) {
|
||||||
if (fp) {
|
if (fp) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
@@ -3206,7 +3216,8 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
// enregistrer
|
// enregistrer
|
||||||
if (!hts_record_link(opt, afs.af.adr, afs.af.fil, afs.save,
|
if (!hts_record_link(opt, afs.af.adr, afs.af.fil, afs.save,
|
||||||
former.adr, former.fil, codebase)) {
|
former.adr, former.fil, codebase)) {
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) &&
|
||||||
|
(ptr > 0)) {
|
||||||
if (fp) {
|
if (fp) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
@@ -3351,7 +3362,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
}
|
}
|
||||||
// ----------
|
// ----------
|
||||||
// écrire peu à peu
|
// écrire peu à peu
|
||||||
if ((opt->getmode & 1) && (ptr > 0))
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0))
|
||||||
HT_add_adr;
|
HT_add_adr;
|
||||||
lastsaved = html; // dernier écrit+1
|
lastsaved = html; // dernier écrit+1
|
||||||
// ----------
|
// ----------
|
||||||
@@ -3411,7 +3422,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
opt->state._hts_in_html_parsing = 0; // flag
|
opt->state._hts_in_html_parsing = 0; // flag
|
||||||
opt->state._hts_cancel = 0; // pas de cancel
|
opt->state._hts_cancel = 0; // pas de cancel
|
||||||
|
|
||||||
if ((opt->getmode & 1) && (ptr > 0)) {
|
if ((opt->getmode & HTS_GETMODE_HTML) && (ptr > 0)) {
|
||||||
{
|
{
|
||||||
char *cAddr = TypedArrayElts(output_buffer);
|
char *cAddr = TypedArrayElts(output_buffer);
|
||||||
int cSize = (int) TypedArraySize(output_buffer);
|
int cSize = (int) TypedArraySize(output_buffer);
|
||||||
@@ -3443,7 +3454,7 @@ int htsparse(htsmoduleStruct * str, htsmoduleStructExtended * stre) {
|
|||||||
//
|
//
|
||||||
} // if !error
|
} // if !error
|
||||||
|
|
||||||
if (opt->getmode & 1) {
|
if (opt->getmode & HTS_GETMODE_HTML) {
|
||||||
if (fp) {
|
if (fp) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
@@ -3711,7 +3722,8 @@ int hts_mirror_check_moved(htsmoduleStruct * str,
|
|||||||
//case -1: can_retry=1; break;
|
//case -1: can_retry=1; break;
|
||||||
case STATUSCODE_TIMEOUT:
|
case STATUSCODE_TIMEOUT:
|
||||||
if (opt->hostcontrol) { // timeout et retry épuisés
|
if (opt->hostcontrol) { // timeout et retry épuisés
|
||||||
if ((opt->hostcontrol & 1) && (heap(ptr)->retry <= 0)) {
|
if ((opt->hostcontrol & HTS_HOSTCONTROL_BAN_TIMEOUT) &&
|
||||||
|
(heap(ptr)->retry <= 0)) {
|
||||||
hts_log_print(opt, LOG_DEBUG, "Link banned: %s%s", urladr(), urlfil());
|
hts_log_print(opt, LOG_DEBUG, "Link banned: %s%s", urladr(), urlfil());
|
||||||
host_ban(opt, ptr, sback, jump_identification_const(urladr()));
|
host_ban(opt, ptr, sback, jump_identification_const(urladr()));
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
@@ -3724,7 +3736,7 @@ int hts_mirror_check_moved(htsmoduleStruct * str,
|
|||||||
break;
|
break;
|
||||||
case STATUSCODE_SLOW:
|
case STATUSCODE_SLOW:
|
||||||
if ((opt->hostcontrol) && (heap(ptr)->retry <= 0)) { // too slow
|
if ((opt->hostcontrol) && (heap(ptr)->retry <= 0)) { // too slow
|
||||||
if (opt->hostcontrol & 2) {
|
if (opt->hostcontrol & HTS_HOSTCONTROL_BAN_SLOW) {
|
||||||
hts_log_print(opt, LOG_DEBUG, "Link banned: %s%s", urladr(), urlfil());
|
hts_log_print(opt, LOG_DEBUG, "Link banned: %s%s", urladr(), urlfil());
|
||||||
host_ban(opt, ptr, sback, jump_identification_const(urladr()));
|
host_ban(opt, ptr, sback, jump_identification_const(urladr()));
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
@@ -4250,10 +4262,10 @@ int hts_mirror_wait_for_next_file(htsmoduleStruct * str,
|
|||||||
char com[256];
|
char com[256];
|
||||||
|
|
||||||
linput(stdin, com, 200);
|
linput(stdin, com, 200);
|
||||||
if (opt->verbosedisplay == 2)
|
if (opt->verbosedisplay == HTS_VERBOSE_FULL)
|
||||||
opt->verbosedisplay = 1;
|
opt->verbosedisplay = HTS_VERBOSE_SIMPLE;
|
||||||
else
|
else
|
||||||
opt->verbosedisplay = 2;
|
opt->verbosedisplay = HTS_VERBOSE_FULL;
|
||||||
/* Info for wrappers */
|
/* Info for wrappers */
|
||||||
hts_log_print(opt, LOG_INFO, "engine: change-options");
|
hts_log_print(opt, LOG_INFO, "engine: change-options");
|
||||||
RUN_CALLBACK0(opt, chopt);
|
RUN_CALLBACK0(opt, chopt);
|
||||||
@@ -4363,7 +4375,7 @@ int hts_mirror_wait_for_next_file(htsmoduleStruct * str,
|
|||||||
printf("%c\x0d", ("/-\\|")[roll]);
|
printf("%c\x0d", ("/-\\|")[roll]);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
} else if (opt->verbosedisplay == 1) {
|
} else if (opt->verbosedisplay == HTS_VERBOSE_SIMPLE) {
|
||||||
if (b >= 0) {
|
if (b >= 0) {
|
||||||
if (back[b].r.statuscode == HTTP_OK)
|
if (back[b].r.statuscode == HTTP_OK)
|
||||||
printf("%d/%d: %s%s (" LLintP " bytes) - OK\33[K\r", ptr, opt->lien_tot,
|
printf("%d/%d: %s%s (" LLintP " bytes) - OK\33[K\r", ptr, opt->lien_tot,
|
||||||
@@ -4454,8 +4466,8 @@ int hts_wait_delayed(htsmoduleStruct * str, lien_adrfilsave *afs,
|
|||||||
char in_error_msg[32];
|
char in_error_msg[32];
|
||||||
|
|
||||||
// resolve unresolved type
|
// resolve unresolved type
|
||||||
if (opt->savename_delayed != 0 && *forbidden_url == 0 && IS_DELAYED_EXT(afs->save)
|
if (opt->savename_delayed != HTS_SAVENAME_DELAYED_NONE &&
|
||||||
&& !opt->state.stop) {
|
*forbidden_url == 0 && IS_DELAYED_EXT(afs->save) && !opt->state.stop) {
|
||||||
int loops;
|
int loops;
|
||||||
int continue_loop;
|
int continue_loop;
|
||||||
|
|
||||||
@@ -4839,7 +4851,7 @@ int hts_wait_delayed(htsmoduleStruct * str, lien_adrfilsave *afs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // delayed type check ?
|
} // delayed type check ?
|
||||||
|
|
||||||
ENGINE_SAVE_CONTEXT_BASE();
|
ENGINE_SAVE_CONTEXT_BASE();
|
||||||
|
|
||||||
|
|||||||
@@ -1213,7 +1213,7 @@ HTSEXT_API find_handle hts_findfirst(char *path) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HTSEXT_API int hts_findnext(find_handle find) {
|
HTSEXT_API hts_boolean hts_findnext(find_handle find) {
|
||||||
if (find) {
|
if (find) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if ((FindNextFileA(find->handle, &find->hdata)))
|
if ((FindNextFileA(find->handle, &find->hdata)))
|
||||||
@@ -1273,7 +1273,7 @@ HTSEXT_API int hts_findgetsize(find_handle find) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
HTSEXT_API int hts_findisdir(find_handle find) {
|
HTSEXT_API hts_boolean hts_findisdir(find_handle find) {
|
||||||
if (find) {
|
if (find) {
|
||||||
if (!hts_findissystem(find)) {
|
if (!hts_findissystem(find)) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -1287,7 +1287,7 @@ HTSEXT_API int hts_findisdir(find_handle find) {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
HTSEXT_API int hts_findisfile(find_handle find) {
|
HTSEXT_API hts_boolean hts_findisfile(find_handle find) {
|
||||||
if (find) {
|
if (find) {
|
||||||
if (!hts_findissystem(find)) {
|
if (!hts_findissystem(find)) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -1301,7 +1301,7 @@ HTSEXT_API int hts_findisfile(find_handle find) {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
HTSEXT_API int hts_findissystem(find_handle find) {
|
HTSEXT_API hts_boolean hts_findissystem(find_handle find) {
|
||||||
if (find) {
|
if (find) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (find->hdata.
|
if (find->hdata.
|
||||||
|
|||||||
@@ -108,15 +108,15 @@ HTSEXT_API int hts_buildtopindex(httrackp * opt, const char *path,
|
|||||||
// Portable directory find functions
|
// Portable directory find functions
|
||||||
// Directory find functions
|
// Directory find functions
|
||||||
HTSEXT_API find_handle hts_findfirst(char *path);
|
HTSEXT_API find_handle hts_findfirst(char *path);
|
||||||
HTSEXT_API int hts_findnext(find_handle find);
|
HTSEXT_API hts_boolean hts_findnext(find_handle find);
|
||||||
HTSEXT_API int hts_findclose(find_handle find);
|
HTSEXT_API int hts_findclose(find_handle find);
|
||||||
|
|
||||||
//
|
//
|
||||||
HTSEXT_API char *hts_findgetname(find_handle find);
|
HTSEXT_API char *hts_findgetname(find_handle find);
|
||||||
HTSEXT_API int hts_findgetsize(find_handle find);
|
HTSEXT_API int hts_findgetsize(find_handle find);
|
||||||
HTSEXT_API int hts_findisdir(find_handle find);
|
HTSEXT_API hts_boolean hts_findisdir(find_handle find);
|
||||||
HTSEXT_API int hts_findisfile(find_handle find);
|
HTSEXT_API hts_boolean hts_findisfile(find_handle find);
|
||||||
HTSEXT_API int hts_findissystem(find_handle find);
|
HTSEXT_API hts_boolean hts_findissystem(find_handle find);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
158
src/htswizard.c
158
src/htswizard.c
@@ -178,7 +178,7 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
// -------------------- PHASE 1 --------------------
|
// -------------------- PHASE 1 --------------------
|
||||||
|
|
||||||
/* Doit-on traiter les non html? */
|
/* Doit-on traiter les non html? */
|
||||||
if ((opt->getmode & 2) == 0) { // non on ne doit pas
|
if ((opt->getmode & HTS_GETMODE_NONHTML) == 0) { // non on ne doit pas
|
||||||
if (!ishtml(opt, fil)) { // non il ne faut pas
|
if (!ishtml(opt, fil)) { // non il ne faut pas
|
||||||
//adr[0]='\0'; // ne pas traiter ce lien, pas traiter
|
//adr[0]='\0'; // ne pas traiter ce lien, pas traiter
|
||||||
forbidden_url = 1; // interdire récupération du lien
|
forbidden_url = 1; // interdire récupération du lien
|
||||||
@@ -266,11 +266,11 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
test2 =
|
test2 =
|
||||||
(strchr(tempo2 + ((*tempo2 == '/') ? 1 : 0), '/') != NULL);
|
(strchr(tempo2 + ((*tempo2 == '/') ? 1 : 0), '/') != NULL);
|
||||||
if ((test1) && (test2)) { // on ne peut que descendre
|
if ((test1) && (test2)) { // on ne peut que descendre
|
||||||
if ((opt->seeker & 1) == 0) { // interdiction de descendre
|
if ((opt->seeker & HTS_SEEKER_DOWN) == 0) {
|
||||||
forbidden_url = 1;
|
forbidden_url = 1;
|
||||||
hts_log_print(opt, LOG_DEBUG, "lower link canceled: %s%s", adr,
|
hts_log_print(opt, LOG_DEBUG, "lower link canceled: %s%s", adr,
|
||||||
fil);
|
fil);
|
||||||
} else { // autorisé à priori - NEW
|
} else { // autorisé à priori - NEW
|
||||||
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
||||||
forbidden_url = 0;
|
forbidden_url = 0;
|
||||||
hts_log_print(opt, LOG_DEBUG, "lower link authorized: %s%s",
|
hts_log_print(opt, LOG_DEBUG, "lower link authorized: %s%s",
|
||||||
@@ -278,7 +278,7 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ((test1) || (test2)) { // on peut descendre pour accéder au lien
|
} else if ((test1) || (test2)) { // on peut descendre pour accéder au lien
|
||||||
if ((opt->seeker & 1) != 0) { // on peut descendre - NEW
|
if ((opt->seeker & HTS_SEEKER_DOWN) != 0) {
|
||||||
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
||||||
forbidden_url = 0;
|
forbidden_url = 0;
|
||||||
hts_log_print(opt, LOG_DEBUG, "lower link authorized: %s%s",
|
hts_log_print(opt, LOG_DEBUG, "lower link authorized: %s%s",
|
||||||
@@ -290,11 +290,11 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
|
|
||||||
// up
|
// up
|
||||||
if ((!strncmp(tempo, "../", 3)) && (!strncmp(tempo2, "../", 3))) { // impossible sans monter
|
if ((!strncmp(tempo, "../", 3)) && (!strncmp(tempo2, "../", 3))) { // impossible sans monter
|
||||||
if ((opt->seeker & 2) == 0) { // interdiction de monter
|
if ((opt->seeker & HTS_SEEKER_UP) == 0) {
|
||||||
forbidden_url = 1;
|
forbidden_url = 1;
|
||||||
hts_log_print(opt, LOG_DEBUG, "upper link canceled: %s%s", adr,
|
hts_log_print(opt, LOG_DEBUG, "upper link canceled: %s%s", adr,
|
||||||
fil);
|
fil);
|
||||||
} else { // autorisé à monter - NEW
|
} else { // autorisé à monter - NEW
|
||||||
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
||||||
forbidden_url = 0;
|
forbidden_url = 0;
|
||||||
hts_log_print(opt, LOG_DEBUG, "upper link authorized: %s%s",
|
hts_log_print(opt, LOG_DEBUG, "upper link authorized: %s%s",
|
||||||
@@ -302,13 +302,13 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ((!strncmp(tempo, "../", 3)) || (!strncmp(tempo2, "../", 3))) { // Possible en montant
|
} else if ((!strncmp(tempo, "../", 3)) || (!strncmp(tempo2, "../", 3))) { // Possible en montant
|
||||||
if ((opt->seeker & 2) != 0) { // autorisé à monter - NEW
|
if ((opt->seeker & HTS_SEEKER_UP) != 0) {
|
||||||
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
if (!heap(ptr)->link_import) { // ne résulte pas d'un 'moved'
|
||||||
forbidden_url = 0;
|
forbidden_url = 0;
|
||||||
hts_log_print(opt, LOG_DEBUG, "upper link authorized: %s%s",
|
hts_log_print(opt, LOG_DEBUG, "upper link authorized: %s%s",
|
||||||
adr, fil);
|
adr, fil);
|
||||||
}
|
}
|
||||||
} // sinon autorisé en descente
|
} // sinon autorisé en descente
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -345,83 +345,81 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
|
|
||||||
//if (!opt->wizard) { // mode non wizard
|
//if (!opt->wizard) { // mode non wizard
|
||||||
// doit-on traiter ce lien?.. vérifier droits de sortie
|
// doit-on traiter ce lien?.. vérifier droits de sortie
|
||||||
switch ((opt->travel & 255)) {
|
switch ((opt->travel & HTS_TRAVEL_SCOPE_MASK)) {
|
||||||
case 0:
|
case HTS_TRAVEL_SAME_ADDRESS:
|
||||||
if (!opt->wizard) // mode non wizard
|
if (!opt->wizard) // mode non wizard
|
||||||
forbidden_url = 1;
|
forbidden_url = 1;
|
||||||
break; // interdicton de sortir au dela de l'adresse
|
break; // interdicton de sortir au dela de l'adresse
|
||||||
case 1:{ // sortie sur le même dom.xxx
|
case HTS_TRAVEL_SAME_DOMAIN: {
|
||||||
size_t i = strlen(adr) - 1;
|
size_t i = strlen(adr) - 1;
|
||||||
size_t j = strlen(urladr()) - 1;
|
size_t j = strlen(urladr()) - 1;
|
||||||
|
|
||||||
if ((i > 0) && (j > 0)) {
|
if ((i > 0) && (j > 0)) {
|
||||||
while((i > 0) && (adr[i] != '.'))
|
while ((i > 0) && (adr[i] != '.'))
|
||||||
i--;
|
|
||||||
while((j > 0) && (urladr()[j] != '.'))
|
|
||||||
j--;
|
|
||||||
if ((i > 0) && (j > 0)) {
|
|
||||||
i--;
|
|
||||||
j--;
|
|
||||||
while((i > 0) && (adr[i] != '.'))
|
|
||||||
i--;
|
|
||||||
while((j > 0) && (urladr()[j] != '.'))
|
|
||||||
j--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((i > 0) && (j > 0)) {
|
|
||||||
if (!strfield2(adr + i, urladr() + j)) { // !=
|
|
||||||
if (!opt->wizard) { // mode non wizard
|
|
||||||
//printf("refused: %s\n",adr);
|
|
||||||
forbidden_url = 1; // pas même domaine
|
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
|
||||||
"foreign domain link canceled: %s%s", adr, fil);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (opt->wizard) { // mode wizard
|
|
||||||
forbidden_url = 0; // même domaine
|
|
||||||
hts_log_print(opt, LOG_DEBUG, "same domain link authorized: %s%s",
|
|
||||||
adr, fil);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else
|
|
||||||
forbidden_url = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:{ // sortie sur le même .xxx
|
|
||||||
size_t i = strlen(adr) - 1;
|
|
||||||
size_t j = strlen(urladr()) - 1;
|
|
||||||
|
|
||||||
while((i > 0) && (adr[i] != '.'))
|
|
||||||
i--;
|
i--;
|
||||||
while((j > 0) && (urladr()[j] != '.'))
|
while ((j > 0) && (urladr()[j] != '.'))
|
||||||
j--;
|
j--;
|
||||||
if ((i > 0) && (j > 0)) {
|
if ((i > 0) && (j > 0)) {
|
||||||
if (!strfield2(adr + i, urladr() + j)) { // !-
|
i--;
|
||||||
if (!opt->wizard) { // mode non wizard
|
j--;
|
||||||
//printf("refused: %s\n",adr);
|
while ((i > 0) && (adr[i] != '.'))
|
||||||
forbidden_url = 1; // pas même .xx
|
i--;
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
while ((j > 0) && (urladr()[j] != '.'))
|
||||||
"foreign location link canceled: %s%s", adr, fil);
|
j--;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (opt->wizard) { // mode wizard
|
|
||||||
forbidden_url = 0; // même domaine
|
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
|
||||||
"same location link authorized: %s%s", adr, fil);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
forbidden_url = 1;
|
|
||||||
}
|
}
|
||||||
break;
|
if ((i > 0) && (j > 0)) {
|
||||||
case 7: // everywhere!!
|
if (!strfield2(adr + i, urladr() + j)) { // !=
|
||||||
|
if (!opt->wizard) { // mode non wizard
|
||||||
|
// printf("refused: %s\n",adr);
|
||||||
|
forbidden_url = 1; // pas même domaine
|
||||||
|
hts_log_print(opt, LOG_DEBUG, "foreign domain link canceled: %s%s",
|
||||||
|
adr, fil);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (opt->wizard) { // mode wizard
|
||||||
|
forbidden_url = 0; // même domaine
|
||||||
|
hts_log_print(opt, LOG_DEBUG, "same domain link authorized: %s%s",
|
||||||
|
adr, fil);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else
|
||||||
|
forbidden_url = 1;
|
||||||
|
} break;
|
||||||
|
case HTS_TRAVEL_SAME_TLD: {
|
||||||
|
size_t i = strlen(adr) - 1;
|
||||||
|
size_t j = strlen(urladr()) - 1;
|
||||||
|
|
||||||
|
while ((i > 0) && (adr[i] != '.'))
|
||||||
|
i--;
|
||||||
|
while ((j > 0) && (urladr()[j] != '.'))
|
||||||
|
j--;
|
||||||
|
if ((i > 0) && (j > 0)) {
|
||||||
|
if (!strfield2(adr + i, urladr() + j)) { // !-
|
||||||
|
if (!opt->wizard) { // mode non wizard
|
||||||
|
// printf("refused: %s\n",adr);
|
||||||
|
forbidden_url = 1; // pas même .xx
|
||||||
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
|
"foreign location link canceled: %s%s", adr, fil);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (opt->wizard) { // mode wizard
|
||||||
|
forbidden_url = 0; // même domaine
|
||||||
|
hts_log_print(opt, LOG_DEBUG, "same location link authorized: %s%s",
|
||||||
|
adr, fil);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
forbidden_url = 1;
|
||||||
|
} break;
|
||||||
|
case HTS_TRAVEL_EVERYWHERE:
|
||||||
if (opt->wizard) { // mode wizard
|
if (opt->wizard) { // mode wizard
|
||||||
forbidden_url = 0;
|
forbidden_url = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} // switch
|
} // switch
|
||||||
|
|
||||||
// ANCIENNE POS -- récupérer les liens à côtés d'un lien (nearlink)
|
// ANCIENNE POS -- récupérer les liens à côtés d'un lien (nearlink)
|
||||||
|
|
||||||
@@ -583,7 +581,7 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
// on doit poser la question.. peut on la poser?
|
// on doit poser la question.. peut on la poser?
|
||||||
// (oui je sais quel preuve de délicatesse, merci merci)
|
// (oui je sais quel preuve de délicatesse, merci merci)
|
||||||
if ((question) && (ptr > 0) && (!force_mirror)) {
|
if ((question) && (ptr > 0) && (!force_mirror)) {
|
||||||
if (opt->wizard == 2) { // éliminer tous les liens non répertoriés comme autorisés (ou inconnus)
|
if (opt->wizard == HTS_WIZARD_AUTO) {
|
||||||
question = 0;
|
question = 0;
|
||||||
forbidden_url = 1;
|
forbidden_url = 1;
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
@@ -600,8 +598,8 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
printf("robots.txt forbidden: %s%s\n", adr, fil);
|
printf("robots.txt forbidden: %s%s\n", adr, fil);
|
||||||
#endif
|
#endif
|
||||||
// question résolue, par les filtres, et mode robot non strict
|
// question résolue, par les filtres, et mode robot non strict
|
||||||
if ((!question) && (filters_answer) && (opt->robots == 1)
|
if ((!question) && (filters_answer) &&
|
||||||
&& (forbidden_url != 1)) {
|
(opt->robots == HTS_ROBOTS_SOMETIMES) && (forbidden_url != 1)) {
|
||||||
r = 0; // annuler interdiction des robots
|
r = 0; // annuler interdiction des robots
|
||||||
if (!forbidden_url) {
|
if (!forbidden_url) {
|
||||||
hts_log_print(opt, LOG_DEBUG,
|
hts_log_print(opt, LOG_DEBUG,
|
||||||
@@ -685,7 +683,7 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
io_flush;
|
io_flush;
|
||||||
} else { // lien primaire: autoriser répertoire entier
|
} else { // lien primaire: autoriser répertoire entier
|
||||||
if (!force_mirror) {
|
if (!force_mirror) {
|
||||||
if ((opt->seeker & 1) == 0) { // interdiction de descendre
|
if ((opt->seeker & HTS_SEEKER_DOWN) == 0) {
|
||||||
n = 7;
|
n = 7;
|
||||||
} else {
|
} else {
|
||||||
n = 5; // autoriser miroir répertoires descendants (lien primaire)
|
n = 5; // autoriser miroir répertoires descendants (lien primaire)
|
||||||
@@ -712,7 +710,7 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
switch (n) {
|
switch (n) {
|
||||||
case -1: // sauter tout le reste
|
case -1: // sauter tout le reste
|
||||||
forbidden_url = 1;
|
forbidden_url = 1;
|
||||||
opt->wizard = 2; // sauter tout le reste
|
opt->wizard = HTS_WIZARD_AUTO; // sauter tout le reste
|
||||||
break;
|
break;
|
||||||
case 0: // forbid the same link: adr/fil
|
case 0: // forbid the same link: adr/fil
|
||||||
forbidden_url = 1;
|
forbidden_url = 1;
|
||||||
@@ -796,7 +794,7 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 5: // allow the whole directory and its children
|
case 5: // allow the whole directory and its children
|
||||||
if ((opt->seeker & 2) == 0) { // not allowed to go up
|
if ((opt->seeker & HTS_SEEKER_UP) == 0) { // not allowed to go up
|
||||||
size_t i = strlen(fil) - 1;
|
size_t i = strlen(fil) - 1;
|
||||||
|
|
||||||
while((fil[i] != '/') && (i > 0))
|
while((fil[i] != '/') && (i > 0))
|
||||||
@@ -872,7 +870,7 @@ static int hts_acceptlink_(httrackp * opt, int ptr,
|
|||||||
// lien non autorisé, peut-on juste le tester?
|
// lien non autorisé, peut-on juste le tester?
|
||||||
if (just_test_it) {
|
if (just_test_it) {
|
||||||
if (forbidden_url == 1) {
|
if (forbidden_url == 1) {
|
||||||
if (opt->travel & 256) { // tester tout de même
|
if (opt->travel & HTS_TRAVEL_TEST_ALL) { // tester tout de même
|
||||||
if (strfield(adr, "ftp://") == 0) { // PAS ftp!
|
if (strfield(adr, "ftp://") == 0) { // PAS ftp!
|
||||||
forbidden_url = 1; // oui oui toujours interdit (note: sert à rien car ==1 mais c pour comprendre)
|
forbidden_url = 1; // oui oui toujours interdit (note: sert à rien car ==1 mais c pour comprendre)
|
||||||
*just_test_it = 1; // mais on teste
|
*just_test_it = 1; // mais on teste
|
||||||
|
|||||||
@@ -206,7 +206,8 @@ HTSEXT_API htsErrorCallback hts_get_error_callback(void);
|
|||||||
/* Logging */
|
/* Logging */
|
||||||
/** Legacy: write prefix then msg to opt->log. Returns 0 if written, 1 if
|
/** Legacy: write prefix then msg to opt->log. Returns 0 if written, 1 if
|
||||||
opt->log is NULL. Prefer hts_log_print(). */
|
opt->log is NULL. Prefer hts_log_print(). */
|
||||||
HTSEXT_API int hts_log(httrackp * opt, const char *prefix, const char *msg);
|
HTSEXT_API hts_boolean hts_log(httrackp *opt, const char *prefix,
|
||||||
|
const char *msg);
|
||||||
|
|
||||||
/** printf-style log at level @p type (an hts_log_type, optionally |LOG_ERRNO).
|
/** printf-style log at level @p type (an hts_log_type, optionally |LOG_ERRNO).
|
||||||
Forwards to the registered log callback, and when the level is <= opt->debug
|
Forwards to the registered log callback, and when the level is <= opt->debug
|
||||||
@@ -254,15 +255,6 @@ HTSEXT_API int htswrap_add(httrackp * opt, const char *name, void *fct);
|
|||||||
or 0 if none or unknown. */
|
or 0 if none or unknown. */
|
||||||
HTSEXT_API uintptr_t htswrap_read(httrackp * opt, const char *name);
|
HTSEXT_API uintptr_t htswrap_read(httrackp * opt, const char *name);
|
||||||
|
|
||||||
/** @warning No implementation is linked into the library; calling this fails to
|
|
||||||
link. For per-callback user data use the CHAIN_FUNCTION() ARGUMENT and
|
|
||||||
CALLBACKARG_USERDEF() instead. */
|
|
||||||
HTSEXT_API int htswrap_set_userdef(httrackp * opt, void *userdef);
|
|
||||||
|
|
||||||
/** @warning No implementation is linked into the library; calling this fails to
|
|
||||||
link. Read per-callback user data with CALLBACKARG_USERDEF() instead. */
|
|
||||||
HTSEXT_API void *htswrap_get_userdef(httrackp * opt);
|
|
||||||
|
|
||||||
/* Internal library allocators, if a different libc is being used by the client */
|
/* Internal library allocators, if a different libc is being used by the client */
|
||||||
/** strdup() through the library allocator. Returns a heap copy freed with
|
/** strdup() through the library allocator. Returns a heap copy freed with
|
||||||
hts_free(), or NULL on failure. */
|
hts_free(), or NULL on failure. */
|
||||||
@@ -322,7 +314,8 @@ HTSEXT_API T_SOC catch_url_init(int *port, char *adr);
|
|||||||
"ip:port". The buffers are caller-allocated and not bounds-checked: @p data
|
"ip:port". The buffers are caller-allocated and not bounds-checked: @p data
|
||||||
must be CATCH_URL_DATA_SIZE bytes, and @p url / @p method must fit the
|
must be CATCH_URL_DATA_SIZE bytes, and @p url / @p method must fit the
|
||||||
captured request line. */
|
captured request line. */
|
||||||
HTSEXT_API int catch_url(T_SOC soc, char *url, char *method, char *data);
|
HTSEXT_API hts_boolean catch_url(T_SOC soc, char *url, char *method,
|
||||||
|
char *data);
|
||||||
|
|
||||||
/* State */
|
/* State */
|
||||||
/** Whether the engine is parsing HTML. Returns 0 if not, otherwise the percent
|
/** Whether the engine is parsing HTML. Returns 0 if not, otherwise the percent
|
||||||
@@ -343,10 +336,10 @@ HTSEXT_API int hts_is_exiting(httrackp * opt);
|
|||||||
caller-owned, NULL-terminated array of strings; the engine stores the
|
caller-owned, NULL-terminated array of strings; the engine stores the
|
||||||
pointer without copying, so the array and its strings must stay valid until
|
pointer without copying, so the array and its strings must stay valid until
|
||||||
the engine consumes them. @return nonzero if a list is now set. */
|
the engine consumes them. @return nonzero if a list is now set. */
|
||||||
HTSEXT_API int hts_addurl(httrackp * opt, char **url);
|
HTSEXT_API hts_boolean hts_addurl(httrackp *opt, char **url);
|
||||||
|
|
||||||
/** Clear any pending add-URL list set by hts_addurl(). Always returns 0. */
|
/** Clear any pending add-URL list set by hts_addurl(). Always returns 0. */
|
||||||
HTSEXT_API int hts_resetaddurl(httrackp * opt);
|
HTSEXT_API hts_boolean hts_resetaddurl(httrackp *opt);
|
||||||
|
|
||||||
/** Apply the runtime-tunable options from @p from onto @p to, to adjust a live
|
/** Apply the runtime-tunable options from @p from onto @p to, to adjust a live
|
||||||
mirror. Only fields set to a non-sentinel value are copied; the rest of @p
|
mirror. Only fields set to a non-sentinel value are copied; the rest of @p
|
||||||
@@ -365,7 +358,7 @@ HTSEXT_API int hts_setpause(httrackp * opt, int);
|
|||||||
lock, so it is safe to call from another thread). @p force is currently
|
lock, so it is safe to call from another thread). @p force is currently
|
||||||
ignored.
|
ignored.
|
||||||
@return 0; no-op if @p opt is NULL. */
|
@return 0; no-op if @p opt is NULL. */
|
||||||
HTSEXT_API int hts_request_stop(httrackp * opt, int force);
|
HTSEXT_API int hts_request_stop(httrackp *opt, hts_boolean force);
|
||||||
|
|
||||||
/** Queue a single in-progress file, by URL, to be cancelled by the engine.
|
/** Queue a single in-progress file, by URL, to be cancelled by the engine.
|
||||||
@p url is copied internally. Takes the state lock, so it is thread-safe.
|
@p url is copied internally. Takes the state lock, so it is thread-safe.
|
||||||
@@ -382,7 +375,7 @@ HTSEXT_API void hts_cancel_parsing(httrackp * opt);
|
|||||||
|
|
||||||
/** Nonzero once the mirror has fully ended. Read under the engine state lock,
|
/** Nonzero once the mirror has fully ended. Read under the engine state lock,
|
||||||
so safe to poll from another thread. Wait for this before hts_free_opt(). */
|
so safe to poll from another thread. Wait for this before hts_free_opt(). */
|
||||||
HTSEXT_API int hts_has_stopped(httrackp * opt);
|
HTSEXT_API hts_boolean hts_has_stopped(httrackp *opt);
|
||||||
|
|
||||||
/* Tools */
|
/* Tools */
|
||||||
/** Ensure the directory chain leading to @p path exists, creating missing
|
/** Ensure the directory chain leading to @p path exists, creating missing
|
||||||
@@ -399,7 +392,7 @@ HTSEXT_API int structcheck_utf8(const char *path);
|
|||||||
/** Whether the directory containing @p path exists. The basename is stripped
|
/** Whether the directory containing @p path exists. The basename is stripped
|
||||||
first, so passing a file path tests its parent directory. @return 1 if it is
|
first, so passing a file path tests its parent directory. @return 1 if it is
|
||||||
a directory, 0 otherwise. */
|
a directory, 0 otherwise. */
|
||||||
HTSEXT_API int dir_exists(const char *path);
|
HTSEXT_API hts_boolean dir_exists(const char *path);
|
||||||
|
|
||||||
/** Write the HTTP reason phrase for @p statuscode into @p msg, a caller buffer
|
/** Write the HTTP reason phrase for @p statuscode into @p msg, a caller buffer
|
||||||
of at least 64 bytes. For an unknown code a non-empty @p msg is kept,
|
of at least 64 bytes. For an unknown code a non-empty @p msg is kept,
|
||||||
@@ -582,20 +575,15 @@ HTSEXT_API char *unescape_http(char *const catbuff, const size_t size, const cha
|
|||||||
must-avoid escapes are kept encoded, and %25 is never decoded). @p no_high &
|
must-avoid escapes are kept encoded, and %25 is never decoded). @p no_high &
|
||||||
1 also decodes high (>= 128) bytes; @p no_high & 2 also decodes an escaped
|
1 also decodes high (>= 128) bytes; @p no_high & 2 also decodes an escaped
|
||||||
space. Returns @p catbuff. */
|
space. Returns @p catbuff. */
|
||||||
HTSEXT_API char *unescape_http_unharm(char *const catbuff, const size_t size, const char *s, const int no_high);
|
HTSEXT_API char *unescape_http_unharm(char *const catbuff, const size_t size,
|
||||||
|
const char *s, const hts_boolean no_high);
|
||||||
/** @warning No implementation is linked into the library; calling this fails to
|
|
||||||
link. */
|
|
||||||
HTSEXT_API char *antislash_unescaped(char *catbuff, const char *s);
|
|
||||||
|
|
||||||
HTSEXT_API void escape_remove_control(char *s);
|
|
||||||
|
|
||||||
/** Determine the MIME type of local file name @p fil into @p s (capacity
|
/** Determine the MIME type of local file name @p fil into @p s (capacity
|
||||||
@p ssize): user --assume rules, then ".html", then the built-in extension
|
@p ssize): user --assume rules, then ".html", then the built-in extension
|
||||||
table. @p flag != 0 forces a fallback type. @return 1 if a type was written,
|
table. @p flag != 0 forces a fallback type. @return 1 if a type was written,
|
||||||
0 otherwise. */
|
0 otherwise. */
|
||||||
HTSEXT_API int get_httptype_sized(httrackp *opt, char *s, size_t ssize,
|
HTSEXT_API hts_boolean get_httptype_sized(httrackp *opt, char *s, size_t ssize,
|
||||||
const char *fil, int flag);
|
const char *fil, hts_boolean flag);
|
||||||
|
|
||||||
/** @deprecated Use get_httptype_sized(). Assumes @p s has at least
|
/** @deprecated Use get_httptype_sized(). Assumes @p s has at least
|
||||||
HTS_MIMETYPE_SIZE capacity. */
|
HTS_MIMETYPE_SIZE capacity. */
|
||||||
@@ -615,7 +603,7 @@ HTSEXT_API int is_userknowntype(httrackp * opt, const char *fil);
|
|||||||
|
|
||||||
/** 1 if @p fil, an extension such as "asp" or "php" (not a full filename), is a
|
/** 1 if @p fil, an extension such as "asp" or "php" (not a full filename), is a
|
||||||
known dynamic-page type, else 0. */
|
known dynamic-page type, else 0. */
|
||||||
HTSEXT_API int is_dyntype(const char *fil);
|
HTSEXT_API hts_boolean is_dyntype(const char *fil);
|
||||||
|
|
||||||
/** Extract the extension of @p fil (text after the last '.', stopping at '?')
|
/** Extract the extension of @p fil (text after the last '.', stopping at '?')
|
||||||
into caller scratch @p catbuff (capacity @p size) and return it. Returns ""
|
into caller scratch @p catbuff (capacity @p size) and return it. Returns ""
|
||||||
@@ -625,12 +613,12 @@ HTSEXT_API const char *get_ext(char *catbuff, size_t size, const char *fil);
|
|||||||
|
|
||||||
/** 1 if MIME type @p st must not be reclassified or renamed (hypertext types
|
/** 1 if MIME type @p st must not be reclassified or renamed (hypertext types
|
||||||
and a built-in keep-list of commonly mislabeled types), else 0. */
|
and a built-in keep-list of commonly mislabeled types), else 0. */
|
||||||
HTSEXT_API int may_unknown(httrackp * opt, const char *st);
|
HTSEXT_API hts_boolean may_unknown(httrackp *opt, const char *st);
|
||||||
|
|
||||||
/** Guess the MIME type of local file @p fil into @p s (capacity @p ssize),
|
/** Guess the MIME type of local file @p fil into @p s (capacity @p ssize),
|
||||||
always producing a type. @return 1 if a type was written. */
|
always producing a type. @return 1 if a type was written. */
|
||||||
HTSEXT_API int guess_httptype_sized(httrackp *opt, char *s, size_t ssize,
|
HTSEXT_API hts_boolean guess_httptype_sized(httrackp *opt, char *s,
|
||||||
const char *fil);
|
size_t ssize, const char *fil);
|
||||||
|
|
||||||
/** @deprecated Use guess_httptype_sized(). Assumes @p s has at least
|
/** @deprecated Use guess_httptype_sized(). Assumes @p s has at least
|
||||||
HTS_MIMETYPE_SIZE capacity. */
|
HTS_MIMETYPE_SIZE capacity. */
|
||||||
@@ -692,7 +680,7 @@ HTSEXT_API find_handle hts_findfirst(char *path);
|
|||||||
|
|
||||||
/** Advance to the next directory entry. Returns 1 if an entry is available, 0
|
/** Advance to the next directory entry. Returns 1 if an entry is available, 0
|
||||||
at end of directory. */
|
at end of directory. */
|
||||||
HTSEXT_API int hts_findnext(find_handle find);
|
HTSEXT_API hts_boolean hts_findnext(find_handle find);
|
||||||
|
|
||||||
/** Close the iteration and free @p find. Always returns 0; NULL is accepted. */
|
/** Close the iteration and free @p find. Always returns 0; NULL is accepted. */
|
||||||
HTSEXT_API int hts_findclose(find_handle find);
|
HTSEXT_API int hts_findclose(find_handle find);
|
||||||
@@ -707,16 +695,16 @@ HTSEXT_API int hts_findgetsize(find_handle find);
|
|||||||
|
|
||||||
/** 1 if the current entry is a directory, else 0 (a system/special entry, see
|
/** 1 if the current entry is a directory, else 0 (a system/special entry, see
|
||||||
hts_findissystem(), reports 0). */
|
hts_findissystem(), reports 0). */
|
||||||
HTSEXT_API int hts_findisdir(find_handle find);
|
HTSEXT_API hts_boolean hts_findisdir(find_handle find);
|
||||||
|
|
||||||
/** 1 if the current entry is a regular file, else 0 (a system/special entry,
|
/** 1 if the current entry is a regular file, else 0 (a system/special entry,
|
||||||
see hts_findissystem(), reports 0). */
|
see hts_findissystem(), reports 0). */
|
||||||
HTSEXT_API int hts_findisfile(find_handle find);
|
HTSEXT_API hts_boolean hts_findisfile(find_handle find);
|
||||||
|
|
||||||
/** 1 if the current entry is a special/system entry to skip: "." or "..", on
|
/** 1 if the current entry is a special/system entry to skip: "." or "..", on
|
||||||
POSIX also device/fifo/socket nodes, on Windows also system, hidden or
|
POSIX also device/fifo/socket nodes, on Windows also system, hidden or
|
||||||
temporary entries. Else 0. */
|
temporary entries. Else 0. */
|
||||||
HTSEXT_API int hts_findissystem(find_handle find);
|
HTSEXT_API hts_boolean hts_findissystem(find_handle find);
|
||||||
|
|
||||||
/* UTF-8 aware FILE API */
|
/* UTF-8 aware FILE API */
|
||||||
/* On non-Windows these macros resolve directly to the POSIX calls. On Windows
|
/* On non-Windows these macros resolve directly to the POSIX calls. On Windows
|
||||||
|
|||||||
@@ -288,7 +288,7 @@ static void __cdecl htsshow_uninit(t_hts_callbackarg * carg) {
|
|||||||
}
|
}
|
||||||
static int __cdecl htsshow_start(t_hts_callbackarg * carg, httrackp * opt) {
|
static int __cdecl htsshow_start(t_hts_callbackarg * carg, httrackp * opt) {
|
||||||
use_show = 0;
|
use_show = 0;
|
||||||
if (opt->verbosedisplay == 2) {
|
if (opt->verbosedisplay == HTS_VERBOSE_FULL) {
|
||||||
use_show = 1;
|
use_show = 1;
|
||||||
vt_clear();
|
vt_clear();
|
||||||
}
|
}
|
||||||
@@ -852,7 +852,7 @@ static void sig_doback(int blind) { // mettre en backing
|
|||||||
if (global_opt != NULL) {
|
if (global_opt != NULL) {
|
||||||
// suppress logging and asking lousy questions
|
// suppress logging and asking lousy questions
|
||||||
global_opt->quiet = 1;
|
global_opt->quiet = 1;
|
||||||
global_opt->verbosedisplay = 0;
|
global_opt->verbosedisplay = HTS_VERBOSE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!blind)
|
if (!blind)
|
||||||
|
|||||||
15
tests/01_engine-cookies.test
Executable file
15
tests/01_engine-cookies.test
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Issue #151 guard: the request Cookie header must be bare RFC 6265 name=value
|
||||||
|
# pairs, no $Version/$Path attributes. Driven by the 'httrack -#Q' selftest.
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# A trailing token is required; a bare '-#Q' falls through to the usage screen.
|
||||||
|
out=$(httrack -#Q run)
|
||||||
|
|
||||||
|
# Exact-match the success line so a fall-through to usage can't pass the test.
|
||||||
|
test "$out" = "cookie-header: OK" || {
|
||||||
|
echo "expected 'cookie-header: OK', got: $out" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
17
tests/01_engine-copyopt.test
Executable file
17
tests/01_engine-copyopt.test
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Regression guard for the unsigned-enum sentinel trap: copy_htsopt's
|
||||||
|
# `if (from->X > -1)` guard is always false for unsigned hts_boolean fields, so
|
||||||
|
# they silently stop being copied. Driven by the in-process 'httrack -#9' test.
|
||||||
|
# Keep POSIX-portable (harness runs it via $(BASH), a plain /bin/sh on macOS).
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# A trailing token is required; a bare '-#9' falls through to the usage screen.
|
||||||
|
out=$(httrack -#9 run)
|
||||||
|
|
||||||
|
# Exact-match the success line so a fall-through to usage can't pass the test.
|
||||||
|
test "$out" = "copy-htsopt: OK" || {
|
||||||
|
echo "expected 'copy-htsopt: OK', got: $out" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
@@ -24,6 +24,8 @@ TESTS = \
|
|||||||
01_engine-cache-golden.test \
|
01_engine-cache-golden.test \
|
||||||
01_engine-charset.test \
|
01_engine-charset.test \
|
||||||
01_engine-cmdline.test \
|
01_engine-cmdline.test \
|
||||||
|
01_engine-cookies.test \
|
||||||
|
01_engine-copyopt.test \
|
||||||
01_engine-doitlog.test \
|
01_engine-doitlog.test \
|
||||||
01_engine-entities.test \
|
01_engine-entities.test \
|
||||||
01_engine-filter.test \
|
01_engine-filter.test \
|
||||||
|
|||||||
Reference in New Issue
Block a user