X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=parsers.c;h=6bf55ea00b21617bd2f718714062e5967292cd83;hp=2272e87bb8034c23a2178d038b5d5217262cc776;hb=9285f53c6431ca054e4a970d97ee22db090639ab;hpb=5f390b415777db21894f1b856ab3d21c9c24f7c6 diff --git a/parsers.c b/parsers.c index 2272e87b..6bf55ea0 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.37 2001/10/23 21:36:02 jongfoster Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.42 2001/11/22 21:59:30 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -41,6 +41,26 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.37 2001/10/23 21:36:02 jongfoster * * Revisions : * $Log: parsers.c,v $ + * Revision 1.42 2001/11/22 21:59:30 jongfoster + * Adding code to handle +no-cookies-keep + * + * Revision 1.41 2001/11/05 23:43:05 steudten + * Add time+date to log files. + * + * Revision 1.40 2001/10/26 20:13:09 jongfoster + * ctype.h is needed in Windows, too. + * + * Revision 1.39 2001/10/26 17:40:04 oes + * Introduced get_header_value() + * Removed http->user_agent, csp->referrer and csp->accept_types + * Removed client_accept() + * + * Revision 1.38 2001/10/25 03:40:48 david__schmidt + * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple + * threads to call select() simultaneously. So, it's time to do a real, live, + * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ + * (native). Both versions will work, but using __OS2__ offers multi-threading. + * * Revision 1.37 2001/10/23 21:36:02 jongfoster * Documenting sed()'s error behaviou (doc change only) * @@ -302,10 +322,10 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.37 2001/10/23 21:36:02 jongfoster #ifndef _WIN32 #include #include -#include -#include #endif +#include +#include #include #include @@ -321,6 +341,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.37 2001/10/23 21:36:02 jongfoster #include "errlog.h" #include "jbsockets.h" #include "miscutil.h" +#include "list.h" const char parsers_h_rcs[] = PARSERS_H_VERSION; @@ -347,9 +368,6 @@ const struct parsers client_patterns[] = { { "x-forwarded-for:", 16, client_x_forwarded }, { "Accept-Encoding:", 16, client_accept_encoding }, { "TE:", 3, client_te }, -#if defined(FEATURE_IMAGE_DETECT_MSIE) - { "Accept:", 7, client_accept }, -#endif /* defined(FEATURE_IMAGE_DETECT_MSIE) */ { "Host:", 5, crumble }, /* { "if-modified-since:", 18, crumble }, */ { "Keep-Alive:", 11, crumble }, @@ -546,6 +564,56 @@ char *get_header(struct client_state *csp) } +/********************************************************************* + * + * Function : get_header_value + * + * Description : Get the value of a given header from a chained list + * of header lines or return NULL if no such header is + * present in the list. + * + * Parameters : + * 1 : header_list = pointer to list + * 2 : header_name = string with name of header to look for. + * Trailing colon required, capitalization + * doesn't matter. + * + * Returns : NULL if not found, else value of header + * + *********************************************************************/ +char *get_header_value(const struct list *header_list, const char *header_name) +{ + struct list_entry *cur_entry; + char *ret = NULL; + size_t length = 0; + + assert(header_list); + assert(header_name); + length = strlen(header_name); + + for (cur_entry = header_list->first; cur_entry ; cur_entry = cur_entry->next) + { + if (cur_entry->str) + { + if (!strncmpic(cur_entry->str, header_name, length)) + { + /* + * Found: return pointer to start of value + */ + ret = (char *) (cur_entry->str + length); + while (*ret && ijb_isspace(*ret)) ret++; + return(ret); + } + } + } + + /* + * Not found + */ + return NULL; + +} + /********************************************************************* * * Function : sed @@ -630,7 +698,6 @@ void free_http_request(struct http_request *http) freez(http->path); freez(http->ver); freez(http->host_ip_addr_str); - freez(http->user_agent); } @@ -1075,10 +1142,6 @@ char *client_referrer(const struct parsers *v, const char *s, struct client_stat strclean(s, FORCE_PREFIX); #endif /* def FEATURE_FORCE_LOAD */ -#ifdef FEATURE_TRUST - csp->referrer = strdup(s); -#endif /* def FEATURE_TRUST */ - /* * Are we sending referer? */ @@ -1172,22 +1235,6 @@ char *client_uagent(const struct parsers *v, const char *s, struct client_state const char * newval; char * s2; - /* Save the client's User-Agent: value */ - if (strlen(s) >= 12) - { - csp->http->user_agent = strdup(s + 12); - } - -#ifdef FEATURE_IMAGE_DETECT_MSIE - if (strstr (s, "MSIE ")) - { - /* This is Microsoft Internet Explorer. - * Enable auto-detect. - */ - csp->accept_types |= ACCEPT_TYPE_IS_MSIE; - } -#endif /* def FEATURE_IMAGE_DETECT_MSIE */ - if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) { return(strdup(s)); @@ -1350,50 +1397,8 @@ char *client_x_forwarded(const struct parsers *v, const char *s, struct client_s } -#if defined(FEATURE_IMAGE_DETECT_MSIE) -/********************************************************************* - * - * Function : client_accept - * - * Description : Detect whether the client wants HTML or an image. - * Clients do not always make this information available - * in a sane way. Always passes the header through - * the proxy unchanged. - * - * Parameters : - * 1 : v = Ignored. - * 2 : s = Header string. Null terminated. - * 3 : csp = Current client state (buffers, headers, etc...) - * - * Returns : Duplicate of argument s. - * - *********************************************************************/ -char *client_accept(const struct parsers *v, const char *s, struct client_state *csp) -{ -#ifdef FEATURE_IMAGE_DETECT_MSIE - if (strstr (s, "image/gif")) - { - /* Client will accept HTML. If this seems counterintuitive, - * blame Microsoft. - */ - csp->accept_types |= ACCEPT_TYPE_MSIE_HTML; - } - else - { - csp->accept_types |= ACCEPT_TYPE_MSIE_IMAGE; - } -#endif /* def FEATURE_IMAGE_DETECT_MSIE */ - - return(strdup(s)); - -} -#endif /* defined(FEATURE_IMAGE_DETECT_MSIE) */ - - - /* the following functions add headers directly to the header list */ - /********************************************************************* * * Function : client_host_adder @@ -1648,7 +1653,20 @@ char *server_set_cookie(const struct parsers *v, const char *s, struct client_st #ifdef FEATURE_COOKIE_JAR if (csp->config->jar) { - fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1)); + /* + * Write timestamp into outbuf. + * + * Complex because not all OSs have tm_gmtoff or + * the %z field in strftime() + */ + char tempbuf[ BUFFER_SIZE ]; + time_t now; + struct tm *tm_now; + time (&now); + tm_now = localtime (&now); + strftime (tempbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", tm_now); + + fprintf(csp->config->jar, "%s %s\t%s\n", tempbuf, csp->http->host, (s + v->len + 1)); } #endif /* def FEATURE_COOKIE_JAR */ @@ -1656,9 +1674,86 @@ char *server_set_cookie(const struct parsers *v, const char *s, struct client_st { return(crumble(v, s, csp)); } + else if ((csp->action->flags & ACTION_NO_COOKIE_KEEP) != 0) + { + /* Flag whether or not to log a message */ + int changed = 0; - return(strdup(s)); + /* A variable to store the tag we're working on */ + char * cur_tag; + + /* Make a copy of the header we can write to */ + char * result = strdup(s); + if (result == NULL) + { + /* FIXME: This error handling is incorrect */ + return NULL; + } + + /* Skip "Set-Cookie:" (11 characters) in header */ + cur_tag = result + 11; + + /* skip whitespace between "Set-Cookie:" and value */ + while (*cur_tag && ijb_isspace(*cur_tag)) + { + cur_tag++; + } + + /* Loop through each tag in the cookie */ + while (*cur_tag) + { + /* Find next tag */ + char * next_tag = strchr(cur_tag, ';'); + if (next_tag != NULL) + { + /* Skip the ';' character itself */ + next_tag++; + + /* skip whitespace ";" and start of tag */ + while (*next_tag && ijb_isspace(*next_tag)) + { + next_tag++; + } + } + else + { + /* "Next tag" is the end of the string */ + next_tag = cur_tag + strlen(cur_tag); + } + + /* Is this the "Expires" tag? */ + if (strncmpic(cur_tag, "expires=", 8) == 0) + { + /* Delete the tag by copying the rest of the string over it. + * (Note that we cannot just use "strcpy(cur_tag, next_tag)", + * since the behaviour of strcpy is undefined for overlapping + * strings.) + */ + memmove(cur_tag, next_tag, strlen(next_tag) + 1); + + /* That changed the header, need to issue a log message */ + changed = 1; + /* Note that the next tag has now been moved to *cur_tag, + * so we do not need to update the cur_tag pointer. + */ + } + else + { + /* Move on to next cookie tag */ + cur_tag = next_tag; + } + } + + if (changed) + { + log_error(LOG_LEVEL_HEADER, "Changed cookie to a temporary one."); + } + + return result; + } + + return(strdup(s)); }