X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=parsers.c;h=6bf55ea00b21617bd2f718714062e5967292cd83;hp=9f702733be3e009903042b8bc24686e2671ce57a;hb=7f6618fbbc136561473528f0f1002f3c25dd9053;hpb=9fac7e2943b479bde2b2836be885d600fbfcd7f8 diff --git a/parsers.c b/parsers.c index 9f702733..6bf55ea0 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.38 2001/10/25 03:40:48 david__schmidt 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,20 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.38 2001/10/25 03:40:48 david__sch * * 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, @@ -308,10 +322,10 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.38 2001/10/25 03:40:48 david__sch #ifndef _WIN32 #include #include -#include -#include #endif +#include +#include #include #include @@ -1639,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 */ @@ -1647,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)); }