diff options
Diffstat (limited to 'src/htslib.h')
-rw-r--r-- | src/htslib.h | 214 |
1 files changed, 175 insertions, 39 deletions
diff --git a/src/htslib.h b/src/htslib.h index d3881d3..23a8400 100644 --- a/src/htslib.h +++ b/src/htslib.h @@ -43,7 +43,9 @@ Please visit our Website: http://www.httrack.com #include "htsglobal.h" /* basic net definitions */ +#include "htsbase.h" #include "htsbasenet.h" +#include "htsnet.h" /* cookies et auth */ #include "htsbauth.h" @@ -52,12 +54,15 @@ Please visit our Website: http://www.httrack.com // (à modifier avec celle-ci) #define POSTTOK "?>post" -#include <stdio.h> - #include "htsopt.h" +#define READ_ERROR (-1) +#define READ_EOF (-2) +#define READ_TIMEOUT (-3) +#define READ_INTERNAL_ERROR (-4) + // structure pour paramètres supplémentaires lors de la requête -typedef struct { +typedef struct htsrequest { short int user_agent_send; // user agent (ex: httrack/1.0 [sun]) short int http11; // l'en tête peut (doit) être signé HTTP/1.1 et non HTTP/1.0 short int nokeepalive; // pas de keep-alive @@ -65,13 +70,15 @@ typedef struct { short int nocompression; // Pas de compression short int flush_garbage; // recycled char user_agent[128]; + char referer[256]; + char from[256]; char lang_iso[64]; t_proxy proxy; // proxy } htsrequest; // structure pour retour d'une connexion/prise d'en tête -typedef struct { +typedef struct htsblk { int statuscode; // status-code, -1=erreur, 200=OK,201=..etc (cf RFC1945) short int notmodified; // page ou fichier NON modifié (transféré) short int is_write; // sortie sur disque (out) ou en mémoire (adr) @@ -83,6 +90,7 @@ typedef struct { int keep_alive_t; // KA timeout int keep_alive_max; // KA number of requests char* adr; // adresse du bloc de mémoire, NULL=vide + char* headers; // adresse des en têtes si présents FILE* out; // écriture directe sur disque (si is_write=1) LLint size; // taille fichier char msg[80]; // message éventuel si échec ("\0"=non précisé) @@ -93,6 +101,8 @@ typedef struct { LLint totalsize; // taille totale à télécharger (-1=inconnue) short int is_file; // ce n'est pas une socket mais un descripteur de fichier si 1 T_SOC soc; // ID socket + SOCaddr address; // IP address + int address_size; // IP address structure length FILE* fp; // fichier pour file:// #if HTS_USEOPENSSL short int ssl; // is this connection a SSL one? (https) @@ -105,8 +115,8 @@ typedef struct { LLint crange; // Content-Range int debugid; // debug connection /* */ - htsrequest req; // paramètres pour la requête - /*char digest[32+2]; // digest md5 généré par le moteur ("" si non généré)*/ + htsrequest req; // paramètres pour la requête + /*char digest[32+2]; // digest md5 généré par le moteur ("" si non généré)*/ } htsblk; @@ -144,12 +154,8 @@ typedef struct t_dnscache { - -/* -#ifdef __cplusplus -extern "C" { -#endif -*/ +/* Library internal definictions */ +#ifdef HTS_INTERNAL_BYTECODE // fonctions unix/winsock int hts_read(htsblk* r,char* buff,int size); @@ -215,6 +221,7 @@ void time_local_rfc822(char* s); struct tm* convert_time_rfc822(char* s); int set_filetime(char* file,struct tm* tm_time); int set_filetime_rfc822(char* file,char* date); +int get_filetime_rfc822(char* file,char* date); HTS_INLINE void time_rfc822(char* s,struct tm * A); HTS_INLINE void time_rfc822_local(char* s,struct tm * A); #ifndef HTTRACK_DEFLIB @@ -232,25 +239,23 @@ int linputsoc_t(T_SOC soc, char* s, int max, int timeout); int linput_trim(FILE* fp,char* s,int max); int linput_cpp(FILE* fp,char* s,int max); void rawlinput(FILE* fp,char* s,int max); -int strfield(const char* f,const char* s); -#define strfield2(f,s) ( (strlen(f)!=strlen(s)) ? 0 : (strfield(f,s)) ) char* strstrcase(char *s,char *o); int ident_url_absolute(char* url,char* adr,char* fil); void fil_simplifie(char* f); int is_unicode_utf8(unsigned char* buffer, unsigned int size); void map_characters(unsigned char* buffer, unsigned int size, unsigned int* map); -int ishtml(char* urlfil); -int ishtml_ext(char* a); +int ishtml(const char* urlfil); +int ishtml_ext(const char* a); int ishttperror(int err); -void guess_httptype(char *s,char *fil); -void get_httptype(char *s,char *fil,int flag); -int get_userhttptype(int setdefs,char *s,char *ext); +void guess_httptype(char *s,const char *fil); +void get_httptype(char *s,const char *fil,int flag); +int get_userhttptype(int setdefs,char *s,const char *ext); void give_mimext(char *s,char *st); -int is_knowntype(char *fil); -int is_userknowntype(char *fil); -int is_dyntype(char *fil); -char* get_ext(char *fil); -int may_unknown(char* st); +int is_knowntype(const char *fil); +int is_userknowntype(const char *fil); +int is_dyntype(const char *fil); +char* get_ext(const char *fil); +int may_unknown(const char* st); #ifndef HTTRACK_DEFLIB HTSEXT_API char* jump_identification(char*); HTSEXT_API char* jump_normalized(char*); @@ -259,6 +264,7 @@ HTSEXT_API char* fil_normalized(char* source, char* dest); HTSEXT_API char* adr_normalized(char* source, char* dest); #endif char* strrchr_limit(char* s, char c, char* limit); +char* strstr_limit(char* s, char* sub, char* limit); HTS_INLINE char* jump_protocol(char* source); void code64(unsigned char* a,int size_a,unsigned char* b,int crlf); #ifndef HTTRACK_DEFLIB @@ -270,15 +276,16 @@ HTSEXT_API void escape_uri_utf(char* s); HTSEXT_API void escape_check_url(char* s); HTSEXT_API char* escape_check_url_addr(char* s); HTSEXT_API void x_escape_http(char* s,int mode); +HTSEXT_API void x_escape_html(char* s); HTSEXT_API void escape_remove_control(char* s); +HTSEXT_API void escape_for_html_print(char* s, char* d); +HTSEXT_API void escape_for_html_print_full(char* s, char* d); #endif -int ehexh(char c); #ifndef HTTRACK_DEFLIB HTSEXT_API char* unescape_http(char* s); HTSEXT_API char* unescape_http_unharm(char* s, int no_high); HTSEXT_API char* antislash_unescaped(char* s); #endif -int ehex(char* s); char* concat(const char* a,const char* b); #define copychar(a) concat((a),NULL) #if HTS_DOSNAME @@ -296,14 +303,6 @@ char* concat(const char* a,const char* b); void hts_lowcase(char* s); void hts_replace(char *s,char from,char to); -/* Spaces: CR,LF,TAB,FF */ -#define is_space(c) ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) || ((c)=='\'') ) -#define is_realspace(c) ( ((c)==' ') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) ) -#define is_taborspace(c) ( ((c)==' ') || ((c)==9) ) -#define is_quote(c) ( ((c)=='\"') || ((c)=='\'') ) -#define is_retorsep(c) ( ((c)==10) || ((c)==13) || ((c)==9) ) -//HTS_INLINE int is_space(char); -//HTS_INLINE int is_realspace(char); void fprintfio(FILE* fp,char* buff,char* prefix); @@ -328,11 +327,6 @@ typedef void* ( *beginthread_type )( void * ); unsigned long _beginthread( beginthread_type start_address, unsigned stack_size, void *arglist ); #endif -/* -#ifdef __cplusplus -} -#endif -*/ @@ -360,6 +354,8 @@ void __cdecl htsdefault_uninit(void); int __cdecl htsdefault_start(void* opt); int __cdecl htsdefault_chopt(void* opt); int __cdecl htsdefault_end(void); +int __cdecl htsdefault_preprocesshtml(char** html,int* len,char* url_adresse,char* url_fichier); +int __cdecl htsdefault_postprocesshtml(char** html,int* len,char* url_adresse,char* url_fichier); int __cdecl htsdefault_checkhtml(char* html,int len,char* url_adresse,char* url_fichier); int __cdecl htsdefault_loop(void* back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats); char* __cdecl htsdefault_query(char* question); @@ -369,10 +365,150 @@ int __cdecl htsdefault_check(char* adr,char* fil,int status); void __cdecl htsdefault_pause(char* lockfile); void __cdecl htsdefault_filesave(char*); int __cdecl htsdefault_linkdetected(char* link); +int __cdecl htsdefault_linkdetected2(char* link, char* tag_start); int __cdecl htsdefault_xfrstatus(void* back); int __cdecl htsdefault_savename(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save); +int __cdecl htsdefault_sendheader(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* outgoing); +int __cdecl htsdefault_receiveheader(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* incoming); + // end defaut wrappers + +// htsmodule.c definitions +extern void* getFunctionPtr(httrackp* opt, char* file, char* fncname); +extern void clearCallbacks(htscallbacks* chain); + + + +#endif // internals + + +/* Spaces: CR,LF,TAB,FF */ +#define is_space(c) ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) || ((c)=='\'') ) +#define is_realspace(c) ( ((c)==' ') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) ) +#define is_taborspace(c) ( ((c)==' ') || ((c)==9) ) +#define is_quote(c) ( ((c)=='\"') || ((c)=='\'') ) +#define is_retorsep(c) ( ((c)==10) || ((c)==13) || ((c)==9) ) +//HTS_INLINE int is_space(char); +//HTS_INLINE int is_realspace(char); + +// compare le début de f avec s et retourne la position de la fin +// 'A=a' (case insensitive) +static int strfield(const char* f,const char* s) { + int r=0; + while (streql(*f,*s) && ((*f)!=0) && ((*s)!=0)) { f++; s++; r++; } + if (*s==0) + return r; + else + return 0; +} +static int strcmpnocase(char* a,char* b) { + while(*a) { + int cmp = hichar(*a) - hichar(*b); + if (cmp != 0) + return cmp; + a++; + b++; + } + return 0; +} + +#ifdef _WIN32 +#define strcasecmp(a,b) stricmp(a,b) +#define strncasecmp(a,b,n) strnicmp(a,b,n) +#endif + +#define strfield2(f,s) ( (strlen(f)!=strlen(s)) ? 0 : (strfield(f,s)) ) + +// is this MIME an hypertext MIME (text/html), html/js-style or other script/text type? +#define HTS_HYPERTEXT_DEFAULT_MIME "text/html" +#define is_hypertext_mime__(a) \ + ( (strfield2((a),"text/html")!=0)\ + || (strfield2((a),"application/x-javascript")!=0) \ + || (strfield2((a),"text/css")!=0) \ + /*|| (strfield2((a),"text/vnd.wap.wml")!=0)*/ \ + || (strfield2((a),"image/svg+xml")!=0) \ + || (strfield2((a),"image/svg-xml")!=0) \ + /*|| (strfield2((a),"audio/x-pn-realaudio")!=0) */\ + || (strfield2((a),"application/x-authorware-map")!=0) \ + ) +#define may_be_hypertext_mime__(a) \ + (\ + (strfield2((a),"audio/x-pn-realaudio")!=0) \ + || (strfield2((a),"audio/x-mpegurl")!=0) \ + ) + + +/* Library internal definictions */ +#ifdef HTS_INTERNAL_BYTECODE + +// check if (mime, file) is hypertext +static int is_hypertext_mime(const char* mime, const char* file) { + if (is_hypertext_mime__(mime)) + return 1; + if (may_unknown(mime)) { + char guessed[256]; + guessed[0] = '\0'; + guess_httptype(guessed, file); + return is_hypertext_mime__(guessed); + } + return 0; +} + +// check if (mime, file) might be "false" hypertext +static int may_be_hypertext_mime(const char* mime, const char* file) { + if (may_be_hypertext_mime__(mime)) + return 1; + if (file != NULL && file[0] != '\0' && may_unknown(mime)) { + char guessed[256]; + guessed[0] = '\0'; + guess_httptype(guessed, file); + return may_be_hypertext_mime__(guessed); + } + return 0; +} + +// compare (mime, file) with reference +static int compare_mime(const char* mime, const char* file, const char* reference) { + if (is_hypertext_mime__(mime) || may_be_hypertext_mime__(mime)) + return strfield2(mime, reference); + if (file != NULL && file[0] != '\0' && may_unknown(mime)) { + char guessed[256]; + guessed[0] = '\0'; + guess_httptype(guessed, file); + return strfield2(guessed, reference); + } + return 0; +} + +#endif + +#ifdef _WIN32_WCE_XXC +extern char cwd[MAX_PATH+1]; +static char *getcwd_ce(char *buffer, int maxlen) +{ + TCHAR fileUnc[MAX_PATH+1]; + char* plast; + + if(cwd[0] == 0) + { + GetModuleFileName(NULL, fileUnc, MAX_PATH); + WideCharToMultiByte(CP_ACP, 0, fileUnc, -1, cwd, MAX_PATH, NULL, NULL); + plast = strrchr(cwd, '\\'); + if(plast) + *plast = 0; + /* Special trick to keep start menu clean... */ + if(_stricmp(cwd, "\\windows\\start menu") == 0) + strcpy(cwd, "\\Apps"); + } + if(buffer) + strncpy(buffer, cwd, maxlen); + return cwd; +} +#undef getcwd +#define getcwd getcwd_ce +#endif + #endif |