X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=parsers.c;h=18c0a9c27fd13ae2ad72bbdf878256d35868a321;hp=ad686b3b7753027b6011df34a7f73e672aa7409a;hb=fe49d4642ec18cec07e1554a963f6fbc41591e88;hpb=87a69fc505def6be1c8a4d24ae225c3623b5e861 diff --git a/parsers.c b/parsers.c index ad686b3b..18c0a9c2 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.2 2001/05/17 23:02:36 oes Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.6 2001/05/26 13:39:32 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -11,7 +11,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.2 2001/05/17 23:02:36 oes Exp $"; * `client_x_forwarded_adder', `client_xtra_adder', * `content_type', `crumble', `destroy_list', `enlist', * `flush_socket', `free_http_request', `get_header', - * `list_to_text', `match', `parse_http_request', `sed', + * `list_to_text', `parse_http_request', `sed', * and `server_set_cookie'. * * Copyright : Written by and Copyright (C) 2001 the SourceForge @@ -41,6 +41,74 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.2 2001/05/17 23:02:36 oes Exp $"; * * Revisions : * $Log: parsers.c,v $ + * Revision 1.6 2001/05/26 13:39:32 jongfoster + * Only crunches Content-Length header if applying RE filtering. + * Without this fix, Microsoft Windows Update wouldn't work. + * + * Revision 1.5 2001/05/26 00:28:36 jongfoster + * Automatic reloading of config file. + * Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32). + * Most of the global variables have been moved to a new + * struct configuration_spec, accessed through csp->config->globalname + * Most of the globals remaining are used by the Win32 GUI. + * + * Revision 1.4 2001/05/22 18:46:04 oes + * + * - Enabled filtering banners by size rather than URL + * by adding patterns that replace all standard banner + * sizes with the "Junkbuster" gif to the re_filterfile + * + * - Enabled filtering WebBugs by providing a pattern + * which kills all 1x1 images + * + * - Added support for PCRE_UNGREEDY behaviour to pcrs, + * which is selected by the (nonstandard and therefore + * capital) letter 'U' in the option string. + * It causes the quantifiers to be ungreedy by default. + * Appending a ? turns back to greedy (!). + * + * - Added a new interceptor ijb-send-banner, which + * sends back the "Junkbuster" gif. Without imagelist or + * MSIE detection support, or if tinygif = 1, or the + * URL isn't recognized as an imageurl, a lame HTML + * explanation is sent instead. + * + * - Added new feature, which permits blocking remote + * script redirects and firing back a local redirect + * to the browser. + * The feature is conditionally compiled, i.e. it + * can be disabled with --disable-fast-redirects, + * plus it must be activated by a "fast-redirects" + * line in the config file, has its own log level + * and of course wants to be displayed by show-proxy-args + * Note: Boy, all the #ifdefs in 1001 locations and + * all the fumbling with configure.in and acconfig.h + * were *way* more work than the feature itself :-( + * + * - Because a generic redirect template was needed for + * this, tinygif = 3 now uses the same. + * + * - Moved GIFs, and other static HTTP response templates + * to project.h + * + * - Some minor fixes + * + * - Removed some >400 CRs again (Jon, you really worked + * a lot! ;-) + * + * Revision 1.3 2001/05/20 01:21:20 jongfoster + * Version 2.9.4 checkin. + * - Merged popupfile and cookiefile, and added control over PCRS + * filtering, in new "permissionsfile". + * - Implemented LOG_LEVEL_FATAL, so that if there is a configuration + * file error you now get a message box (in the Win32 GUI) rather + * than the program exiting with no explanation. + * - Made killpopup use the PCRS MIME-type checking and HTTP-header + * skipping. + * - Removed tabs from "config" + * - Moved duplicated url parsing code in "loaders.c" to a new funcition. + * - Bumped up version number. + * * Revision 1.2 2001/05/17 23:02:36 oes * - Made referrer option accept 'L' as a substitute for '§' * @@ -114,8 +182,9 @@ const struct parsers client_patterns[] = { const struct interceptors intercept_patterns[] = { { "show-proxy-args", 14, show_proxy_args }, + { "ijb-send-banner", 14, ijb_send_banner }, #ifdef TRUST_FILES - { "ij-untrusted-url", 14, ij_untrusted_url }, + { "ij-untrusted-url", 15, ij_untrusted_url }, #endif /* def TRUST_FILES */ { NULL, 0, NULL } }; @@ -125,8 +194,10 @@ const struct parsers server_patterns[] = { { "connection:", 11, crumble }, #if defined(PCRS) || defined(KILLPOPUPS) { "Content-Type:", 13, content_type }, - { "Content-Length:", 15, crumble }, #endif /* defined(PCRS) || defined(KILLPOPUPS) */ +#ifdef PCRS + { "Content-Length:", 15, content_length }, +#endif /* def PCRS */ { NULL, 0, NULL } }; @@ -144,43 +215,6 @@ void (* const add_server_headers[])(struct client_state *) = { }; -/********************************************************************* - * - * Function : match - * - * Description : Do a `strncmpic' on every pattern in pats. - * - * Parameters : - * 1 : buf = a string to match to a list of patterns - * 2 : pats = list of strings to compare against buf. - * - * Returns : Return the matching "struct parsers *", - * or NULL if no pattern matches. - * - *********************************************************************/ -static const struct parsers *match(char *buf, const struct parsers *pats) -{ - const struct parsers *v; - - if (buf == NULL) - { - /* hit me */ - log_error(LOG_LEVEL_ERROR, "NULL parameter to match()"); - return(NULL); - } - - for (v = pats; v->str ; v++) - { - if (strncmpic(buf, v->str, v->len) == 0) - { - return(v); - } - } - return(NULL); - -} - - /********************************************************************* * * Function : flush_socket @@ -484,17 +518,24 @@ char *sed(const struct parsers pats[], void (* const more_headers[])(struct clie char *hdr; void (* const *f)(); - for (p = csp->headers->next; p ; p = p->next) + for (v = pats; v->str ; v++) { - log_error(LOG_LEVEL_HEADER, "scan: %s", p->str); - - if ((v = match(p->str, pats))) + for (p = csp->headers->next; p ; p = p->next) { - hdr = v->parser(v, p->str, csp); - freez(p->str); - p->str = hdr; - } + if (v == pats) log_error(LOG_LEVEL_HEADER, "scan: %s", p->str); + if (p->str == NULL) + { + /* hit me */ + log_error(LOG_LEVEL_ERROR, "NULL header"); + } + else if (strncmpic(p->str, v->str, v->len) == 0) + { + hdr = v->parser(v, p->str, csp); + freez(p->str); + p->str = hdr; + } + } } /* place any additional headers on the csp->headers list */ @@ -736,10 +777,41 @@ char *content_type(const struct parsers *v, char *s, struct client_state *csp) return(strdup(s)); } - #endif /* defined(PCRS) || defined(KILLPOPUPS) */ +#ifdef PCRS +/********************************************************************* + * + * Function : content_length + * + * Description : Crunch Content-Length header if & only if we are + * filtering this page through PCRS. + * + * Parameters : + * 1 : v = ignored + * 2 : s = header string we are "considering" + * 3 : csp = Current client state (buffers, headers, etc...) + * + * Returns : A duplicate string pointer to this header (ie. pass thru) + * + *********************************************************************/ +char *content_length(const struct parsers *v, char *s, struct client_state *csp) +{ + if (((csp->permissions & PERMIT_RE_FILTER) != 0) && csp->is_text) + { + log_error(LOG_LEVEL_HEADER, "crunch!"); + return(NULL); + } + else + { + return(strdup(s)); + } +} + +#endif /* def PCRS */ + + /********************************************************************* * * Function : client_referrer @@ -768,18 +840,18 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp csp->referrer = strdup(s); - if (referrer == NULL) + if (csp->config->referrer == NULL) { log_error(LOG_LEVEL_HEADER, "crunch!"); return(NULL); } - if (*referrer == '.') + if (*csp->config->referrer == '.') { return(strdup(s)); } - if (*referrer == '@') + if (*csp->config->referrer == '@') { if (csp->permissions & PERMIT_COOKIE_READ) { @@ -797,7 +869,7 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp * to fool stupid checks for in-site links */ - if (*referrer == '§' || *referrer == 'L') + if (*csp->config->referrer == '§' || *csp->config->referrer == 'L') { if (csp->permissions & PERMIT_COOKIE_READ) { @@ -817,7 +889,7 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp log_error(LOG_LEVEL_HEADER, "modified"); s = strsav( NULL, "Referer: " ); - s = strsav( s, referrer ); + s = strsav( s, csp->config->referrer ); return(s); } @@ -851,18 +923,18 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) } #endif /* def DETECT_MSIE_IMAGES */ - if (uagent == NULL) + if (csp->config->uagent == NULL) { log_error(LOG_LEVEL_HEADER, "default"); return(strdup(DEFAULT_USER_AGENT)); } - if (*uagent == '.') + if (*csp->config->uagent == '.') { return(strdup(s)); } - if (*uagent == '@') + if (*csp->config->uagent == '@') { if (csp->permissions & PERMIT_COOKIE_READ) { @@ -878,7 +950,7 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) log_error(LOG_LEVEL_HEADER, "modified"); s = strsav( NULL, "User-Agent: " ); - s = strsav( s, uagent ); + s = strsav( s, csp->config->uagent ); return(s); } @@ -900,18 +972,18 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) *********************************************************************/ char *client_ua(const struct parsers *v, char *s, struct client_state *csp) { - if (uagent == NULL) + if (csp->config->uagent == NULL) { log_error(LOG_LEVEL_HEADER, "crunch!"); return(NULL); } - if (*uagent == '.') + if (*csp->config->uagent == '.') { return(strdup(s)); } - if (*uagent == '@') + if (*csp->config->uagent == '@') { if (csp->permissions & PERMIT_COOKIE_READ) { @@ -949,13 +1021,13 @@ char *client_ua(const struct parsers *v, char *s, struct client_state *csp) char *client_from(const struct parsers *v, char *s, struct client_state *csp) { /* if not set, zap it */ - if (from == NULL) + if (csp->config->from == NULL) { log_error(LOG_LEVEL_HEADER, "crunch!"); return(NULL); } - if (*from == '.') + if (*csp->config->from == '.') { return(strdup(s)); } @@ -963,7 +1035,7 @@ char *client_from(const struct parsers *v, char *s, struct client_state *csp) log_error(LOG_LEVEL_HEADER, " modified"); s = strsav( NULL, "From: " ); - s = strsav( s, from ); + s = strsav( s, csp->config->from ); return(s); } @@ -1022,7 +1094,7 @@ char *client_send_cookie(const struct parsers *v, char *s, struct client_state * *********************************************************************/ char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp) { - if (add_forwarded) + if (csp->config->add_forwarded) { csp->x_forwarded = strdup(s); } @@ -1107,7 +1179,7 @@ void client_cookie_adder(struct client_state *csp) tmp = strsav(tmp, l->str); } - for (l = wafer_list->next; l ; l = l->next) + for (l = csp->config->wafer_list->next; l ; l = l->next) { if (tmp) { @@ -1152,7 +1224,7 @@ void client_xtra_adder(struct client_state *csp) { struct list *l; - for (l = xtra_list->next; l ; l = l->next) + for (l = csp->config->xtra_list->next; l ; l = l->next) { log_error(LOG_LEVEL_HEADER, "addh: %s", l->str); enlist(csp->headers, l->str); @@ -1177,7 +1249,10 @@ void client_x_forwarded_adder(struct client_state *csp) { char *p = NULL; - if (add_forwarded == 0) return; + if (csp->config->add_forwarded == 0) + { + return; + } if (csp->x_forwarded) { @@ -1216,9 +1291,9 @@ void client_x_forwarded_adder(struct client_state *csp) char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp) { #ifdef JAR_FILES - if (jar) + if (csp->config->jar) { - fprintf(jar, "%s\t%s\n", csp->http->host, (s + v->len + 1)); + fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1)); } #endif /* def JAR_FILES */