summaryrefslogtreecommitdiff
path: root/src/htslib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/htslib.h')
-rw-r--r--src/htslib.h214
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