X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=parsers.c;h=88cddcb1db9c3ed16b1d390da23f3f2f31f72dae;hb=bd8c476f053258f68476b246c435ad09baae85ab;hp=5445cc571f3c50d8fa697d7988d99382fd265f92;hpb=2f86c770ec87c33518b40e47e229ab8cd813853a;p=privoxy.git diff --git a/parsers.c b/parsers.c index 5445cc57..88cddcb1 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.40 2001/10/26 20:13:09 jongfoster Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.44 2001/12/14 01:22:54 steudten Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -41,6 +41,19 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.40 2001/10/26 20:13:09 jongfoster * * Revisions : * $Log: parsers.c,v $ + * Revision 1.44 2001/12/14 01:22:54 steudten + * Remove 'user:pass@' from 'proto://user:pass@host' for the + * new added header 'Host: ..'. (See Req ID 491818) + * + * Revision 1.43 2001/11/23 00:26:38 jongfoster + * Fixing two really stupid errors in my previous commit + * + * 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. * @@ -1407,11 +1420,22 @@ char *client_x_forwarded(const struct parsers *v, const char *s, struct client_s *********************************************************************/ void client_host_adder(struct client_state *csp) { - char *p = NULL; + char *p = NULL, + *pos = NULL; + if ( !csp->http->hostport || !*(csp->http->hostport)) return; p = strsav(p, "Host: "); - p = strsav(p, csp->http->hostport); - + /* + ** remove 'user:pass@' from 'proto://user:pass@host' + */ + if ( (pos = strchr( csp->http->hostport, '@')) != NULL ) + { + p = strsav(p, pos+1); + } + else + { + p = strsav(p, csp->http->hostport); + } log_error(LOG_LEVEL_HEADER, "addh: %s", p); enlist(csp->headers, p); @@ -1645,22 +1669,25 @@ char *server_http(const struct parsers *v, const char *s, struct client_state *c char *server_set_cookie(const struct parsers *v, const char *s, struct client_state *csp) { #ifdef FEATURE_COOKIE_JAR - - /* - * 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); - if (csp->config->jar) { + /* + * 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); +#ifdef HAVE_LOCALTIME_R + tm_now = *localtime_r(&now, &tm_now); +#else + tm_now = *localtime (&now); +#endif + 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 */ @@ -1669,9 +1696,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)); }