summaryrefslogtreecommitdiff
path: root/src/proxy/proxytrack.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/proxy/proxytrack.h')
-rw-r--r--src/proxy/proxytrack.h288
1 files changed, 288 insertions, 0 deletions
diff --git a/src/proxy/proxytrack.h b/src/proxy/proxytrack.h
new file mode 100644
index 0000000..498f4d8
--- /dev/null
+++ b/src/proxy/proxytrack.h
@@ -0,0 +1,288 @@
+/* ------------------------------------------------------------ */
+/*
+HTTrack Website Copier, Offline Browser for Windows and Unix
+Copyright (C) Xavier Roche and other contributors
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+Please visit our Website: http://www.httrack.com
+*/
+
+/* ------------------------------------------------------------ */
+/* File: ProxyTrack, httrack cache-based proxy */
+/* Author: Xavier Roche */
+/* ------------------------------------------------------------ */
+
+#ifndef WEBHTTRACK_PROXYTRACK
+#define WEBHTTRACK_PROXYTRACK
+
+/* Version */
+#define PROXYTRACK_VERSION "0.4"
+
+/* Store manager */
+#include "../minizip/mztools.h"
+#include "store.h"
+
+#include <sys/stat.h>
+
+/* generic */
+
+int proxytrack_main(char* proxyAddr, int proxyPort,
+ char* icpAddr, int icpPort,
+ PT_Indexes index);
+
+/* 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) )
+
+/* Static definitions */
+
+#define _ ,
+#define CRITICAL_(msg, file, line) do { \
+ fprintf(stderr, "* critical: "); \
+ fprintf(stderr, msg); \
+ fprintf(stderr, " at %s:%d\n", file, line); \
+ fflush(stderr); \
+} while(0)
+#define CRITICAL(msg) do { \
+ fprintf(stderr, "* critical: "); \
+ fprintf(stderr, msg); \
+ fprintf(stderr, " at %s:%d\n", __FILE__, __LINE__); \
+ fflush(stderr); \
+} while(0)
+
+#define WARNING(msg) do { \
+ fprintf(stderr, "* warning: "); \
+ fprintf(stderr, msg); \
+ fprintf(stderr, "\n"); \
+ fflush(stderr); \
+} while(0)
+
+#define LOG(msg) do { \
+ fprintf(stderr, "* log: "); \
+ fprintf(stderr, msg); \
+ fprintf(stderr, "\n"); \
+ fflush(stderr); \
+} while(0)
+
+#if defined(_DEBUG) || defined(DEBUG)
+#define DEBUG(msg) do { \
+ fprintf(stderr, "* debug: "); \
+ fprintf(stderr, msg); \
+ fprintf(stderr, "\n"); \
+ fflush(stderr); \
+} while(0)
+#else
+#define DEBUG_(msg, file, line) do { } while(0)
+#define DEBUG(msg) do { } while(0)
+#endif
+
+/* Header for generated pages */
+#define PROXYTRACK_COMMENT_HEADER \
+ "<!-- Generated by ProxyTrack " PROXYTRACK_VERSION " build " __DATE__ " -->\r\n" \
+ "<!-- This is an add-on for HTTrack " HTTRACK_VERSIONID " -->\r\n"
+
+/* See IE "feature" (MSKB Q294807) */
+#define DISABLE_IE_FRIENDLY_HTTP_ERROR_MESSAGES \
+ "<!-- Start Disable IE Friendly HTTP Error Messages -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- _-._.--._._-._.--._._-._.--._._-._.--._._-._.--._. -->\r\n" \
+ "<!-- End Disable IE Friendly HTTP Error Messages -->\r\n"
+
+static char* gethomedir(void) {
+ char* home = getenv( "HOME" );
+ if (home)
+ return home;
+ else
+ return ".";
+}
+
+static int linput(FILE* fp,char* s,int max) {
+ int c;
+ int j=0;
+ do {
+ c=fgetc(fp);
+ if (c!=EOF) {
+ switch(c) {
+ case 13: break; // sauter CR
+ case 10: c=-1; break;
+ case 0: case 9: case 12: break; // sauter ces caractères
+ default: s[j++]=(char) c; break;
+ }
+ }
+ } while((c!=-1) && (c!=EOF) && (j<(max-1)));
+ s[j]='\0';
+ return j;
+}
+
+static int link_has_authority(const char* lien) {
+ const char* a=lien;
+ if (isalpha((const unsigned char)*a)) {
+ // Skip scheme?
+ while (isalpha((const unsigned char)*a))
+ a++;
+ if (*a == ':')
+ a++;
+ else
+ return 0;
+ }
+ if (strncmp(a,"//",2) == 0)
+ return 1;
+ return 0;
+}
+
+static const char* jump_protocol(const char* source) {
+ int p;
+ // scheme
+ // "Comparisons of scheme names MUST be case-insensitive" (RFC2616)
+ if ((p = strfield(source,"http:")))
+ source+=p;
+ else if ((p = strfield(source,"ftp:")))
+ source+=p;
+ else if ((p = strfield(source,"https:")))
+ source+=p;
+ else if ((p = strfield(source,"file:")))
+ source+=p;
+ else if ((p = strfield(source,"mms:")))
+ source+=p;
+ // net_path
+ if (strncmp(source,"//",2)==0)
+ source+=2;
+ return source;
+}
+
+static const char* strrchr_limit(const char* s, char c, const char* limit) {
+ if (limit == NULL) {
+ char* p = strrchr(s, c);
+ return p?(p+1):NULL;
+ } else {
+ char *a=NULL, *p;
+ for(;;) {
+ p=strchr((a)?a:s, c);
+ if ((p >= limit) || (p == NULL))
+ return a;
+ a=p+1;
+ }
+ }
+}
+
+static const char* jump_protocol_and_auth(const char* source) {
+ const char *a,*trytofind;
+ if (strcmp(source, "file://") == 0)
+ return source;
+ a = jump_protocol(source);
+ trytofind = strrchr_limit(a, '@', strchr(a,'/'));
+ return (trytofind != NULL)?trytofind:a;
+}
+
+#ifndef min
+#define min(a,b) ((a)>(b)?(b):(a))
+#endif
+#ifndef max
+#define max(a,b) ((a)>(b)?(a):(b))
+#endif
+static int linput_trim(FILE* fp,char* s,int max) {
+ int rlen=0;
+ char* ls=(char*) malloc(max+2);
+ s[0]='\0';
+ if (ls) {
+ char* a;
+ // lire ligne
+ rlen=linput(fp,ls,max);
+ if (rlen) {
+ // sauter espaces et tabs en fin
+ while( (rlen>0) && is_realspace(ls[max(rlen-1,0)]) )
+ ls[--rlen]='\0';
+ // sauter espaces en début
+ a=ls;
+ while((rlen>0) && ((*a==' ') || (*a=='\t'))) {
+ a++;
+ rlen--;
+ }
+ if (rlen>0) {
+ memcpy(s,a,rlen); // can copy \0 chars
+ s[rlen]='\0';
+ }
+ }
+ //
+ free(ls);
+ }
+ return rlen;
+}
+
+// copy of concat
+#define HTS_URLMAXSIZE 1024
+typedef struct concat_strc {
+ char buff[16][HTS_URLMAXSIZE*2*2];
+ int rol;
+} concat_strc;
+static char* concat(const char* a,const char* b) {
+ static concat_strc* strc = NULL;
+ if (strc == NULL) {
+ strc = (concat_strc*) calloc(16, sizeof(concat_strc));
+ }
+ strc->rol=((strc->rol+1)%16); // roving pointer
+ strcpy(strc->buff[strc->rol],a);
+ if (b) strcat(strc->buff[strc->rol],b);
+ return strc->buff[strc->rol];
+}
+
+#ifndef S_ISREG
+#define S_ISREG(m) ((m) & _S_IFREG)
+#endif
+static int fexist(char* s) {
+ struct stat st;
+ memset(&st, 0, sizeof(st));
+ if (stat(s, &st) == 0) {
+ if (S_ISREG(st.st_mode)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+#ifndef _WIN32
+#define fconv(a) (a)
+#define fconcat(a,b) concat(a,b)
+#endif
+
+#ifdef _WIN32
+static char* __fconv(char* a) {
+ int i;
+ for(i=0;i<(int) strlen(a);i++)
+ if (a[i]=='/') // convertir
+ a[i]='\\';
+ return a;
+}
+static char* fconcat(char* a,char* b) {
+ return __fconv(concat(a,b));
+}
+static char* fconv(char* a) {
+ return __fconv(concat(a,""));
+}
+#endif
+
+#endif