mirror of
https://github.com/xroche/httrack.git
synced 2026-07-16 05:40:59 +03:00
Compare commits
4 Commits
win-tests
...
export-con
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45f56e6194 | ||
|
|
d9ff780d0f | ||
|
|
b026c80bb6 | ||
|
|
e0648beff9 |
@@ -140,8 +140,9 @@ int back_connect_fallback_due(int addr_index, int addr_count, int elapsed,
|
||||
|
||||
/* Pending-connect result for a non-blocking socket reported ready by select():
|
||||
0 = connected, >0 = the connect errno (refused, unreachable, ...), -1 if the
|
||||
probe itself failed. A failed connect is reported writable too, so this is
|
||||
how success is told from failure without blocking. */
|
||||
probe itself failed. A failed connect is reported ready as well (writable on
|
||||
posix, exception set on winsock), so this is how success is told from failure
|
||||
without blocking. */
|
||||
static int connect_socket_error(T_SOC soc) {
|
||||
int soerr = 0;
|
||||
socklen_t len = (socklen_t) sizeof(soerr);
|
||||
@@ -2658,7 +2659,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
for (i_mod = 0; i_mod < (unsigned int) back_max; i_mod++) {
|
||||
unsigned int i = (i_mod + mod_random) % (back_max);
|
||||
|
||||
if (back[i].status > 0) {
|
||||
// winsock flags a failed connect in the exception set only: leave a
|
||||
// connecting slot to the connect handler, which can still fall back
|
||||
if (back[i].status > 0 && back[i].status != STATUS_CONNECTING) {
|
||||
if (!back[i].r.is_file) { // not file..
|
||||
if (back[i].r.soc != INVALID_SOCKET) { // hey, you never know..
|
||||
int err = FD_ISSET(back[i].r.soc, &fds_e);
|
||||
@@ -2672,10 +2675,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
}
|
||||
back[i].r.soc = INVALID_SOCKET;
|
||||
back[i].r.statuscode = STATUSCODE_CONNERROR;
|
||||
if (back[i].status == STATUS_CONNECTING)
|
||||
strcpybuff(back[i].r.msg, "Connect Error");
|
||||
else
|
||||
strcpybuff(back[i].r.msg, "Receive Error");
|
||||
strcpybuff(back[i].r.msg, "Receive Error");
|
||||
if (back[i].status == STATUS_ALIVE) { /* Keep-alive socket */
|
||||
back_delete(opt, cache, sback, i);
|
||||
} else {
|
||||
@@ -2708,10 +2708,11 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache,
|
||||
gestion_timeout = 1;
|
||||
|
||||
// connecté?
|
||||
dispo = FD_ISSET(back[i].r.soc, &fds_c);
|
||||
dispo = back[i].r.soc != INVALID_SOCKET &&
|
||||
(FD_ISSET(back[i].r.soc, &fds_c) ||
|
||||
FD_ISSET(back[i].r.soc, &fds_e));
|
||||
if (dispo) { // socket ready: connect() finished (ok or failed)
|
||||
// a refused/failed connect is reported writable too; probe SO_ERROR
|
||||
// and, on failure, fall back to the next address (or fail the slot)
|
||||
// probe SO_ERROR and, on failure, fall back to the next address
|
||||
if (connect_socket_error(back[i].r.soc) != 0) {
|
||||
if (!back_connect_next(opt, sback, i)) {
|
||||
deletehttp(&back[i].r);
|
||||
|
||||
@@ -385,7 +385,7 @@ char *hts_convertStringFromUTF8(const char *s, size_t size, const char *charset)
|
||||
return hts_convertStringCPFromUTF8(s, size, cp);
|
||||
}
|
||||
|
||||
char *hts_convertStringSystemToUTF8(const char *s, size_t size) {
|
||||
HTSEXT_API char *hts_convertStringSystemToUTF8(const char *s, size_t size) {
|
||||
return hts_convertStringCPToUTF8(s, size, GetACP());
|
||||
}
|
||||
|
||||
|
||||
@@ -175,7 +175,7 @@ extern char *hts_convertUCS2StringToUTF8(LPWSTR woutput, int wsize);
|
||||
* Convert current system codepage to UTF-8.
|
||||
* This function is WIN32 specific.
|
||||
**/
|
||||
extern char *hts_convertStringSystemToUTF8(const char *s, size_t size);
|
||||
HTSEXT_API char *hts_convertStringSystemToUTF8(const char *s, size_t size);
|
||||
|
||||
/**
|
||||
* Replace the CRT's ANSI argv by a UTF-8 one decoded from the real UTF-16
|
||||
|
||||
@@ -784,6 +784,16 @@ static int st_filterbounds(httrackp *opt, int argc, char **argv) {
|
||||
/* Depth caps the stack: uncapped this recurses 2046 frames, ~900KB (#574). */
|
||||
assertf(depth == maxdepth);
|
||||
assertf(strjokerfind(subj, pat) == NULL);
|
||||
/* Pin the cap from below: 32 segments must still match, so a cap set so low
|
||||
it would break real multi-segment filters (which use far fewer) fails. */
|
||||
for (i = 0; i < 32; i++) {
|
||||
pat[2 * i] = '*';
|
||||
pat[2 * i + 1] = 'a';
|
||||
}
|
||||
pat[64] = '\0';
|
||||
memset(subj, 'a', 32);
|
||||
subj[32] = '\0';
|
||||
assertf(strjoker(subj, pat, NULL, NULL) != NULL);
|
||||
freet(pat);
|
||||
freet(subj);
|
||||
printf("filterbounds: OK\n");
|
||||
|
||||
Reference in New Issue
Block a user