From: <no...@so...> - 2007-03-05 13:25:35
|
Update of /cvsroot/ijbswa/current In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv23782 Modified Files: parsers.c parsers.h Log Message: - Cosmetical changes for LOG_LEVEL_RE_FILTER messages. - Handle "Cookie:" and "Connection:" headers a bit smarter (don't crunch them just to recreate them later on). - Add another non-standard time format for the cookie expiration date detection. - Fix a valgrind warning. Index: parsers.c =================================================================== RCS file: /cvsroot/ijbswa/current/parsers.c,v retrieving revision 1.91 retrieving revision 1.92 diff -u -d -r1.91 -r1.92 --- parsers.c 24 Feb 2007 12:27:32 -0000 1.91 +++ parsers.c 5 Mar 2007 13:25:32 -0000 1.92 @@ -45,6 +45,14 @@ * * Revisions : * $Log$ + * Revision 1.92 2007/03/05 13:25:32 fabiankeil + * - Cosmetical changes for LOG_LEVEL_RE_FILTER messages. + * - Handle "Cookie:" and "Connection:" headers a bit smarter + * (don't crunch them just to recreate them later on). + * - Add another non-standard time format for the cookie + * expiration date detection. + * - Fix a valgrind warning. + * * Revision 1.91 2007/02/24 12:27:32 fabiankeil * Improve cookie expiration date detection. * @@ -684,7 +692,7 @@ { "Host:", 5, client_host }, { "if-modified-since:", 18, client_if_modified_since }, { "Keep-Alive:", 11, crumble }, - { "connection:", 11, crumble }, + { "connection:", 11, connection }, { "proxy-connection:", 17, crumble }, { "max-forwards:", 13, client_max_forwards }, { "Accept-Language:", 16, client_accept_language }, @@ -698,7 +706,7 @@ const struct parsers server_patterns[] = { { "HTTP", 4, server_http }, { "set-cookie:", 11, server_set_cookie }, - { "connection:", 11, crumble }, + { "connection:", 11, connection }, { "Content-Type:", 13, server_content_type }, { "Content-MD5:", 12, server_content_md5 }, { "Content-Encoding:", 17, server_content_encoding }, @@ -1548,7 +1556,7 @@ continue; } - log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s (size %d) with filter %s...", + log_error(LOG_LEVEL_RE_FILTER, "filtering \'%s\' (size %d) with \'%s\' ...", *header, size, b->name); /* Apply all jobs from the joblist */ @@ -1579,7 +1587,7 @@ } } } - log_error(LOG_LEVEL_RE_FILTER, " ...produced %d hits (new size %d).", current_hits, size); + log_error(LOG_LEVEL_RE_FILTER, "... produced %d hits (new size %d).", current_hits, size); hits += current_hits; } } @@ -1603,6 +1611,56 @@ /********************************************************************* * + * Function : connection + * + * Description : Makes sure that the value of the Connection: header + * is "close" and signals connection_close_adder + * to do nothing. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : header = On input, pointer to header to modify. + * On output, pointer to the modified header, or NULL + * to remove the header. This function frees the + * original string if necessary. + * + * Returns : JB_ERR_OK on success, or + * JB_ERR_MEMORY on out-of-memory error. + * + *********************************************************************/ +jb_err connection(struct client_state *csp, char **header) +{ + char *old_header = *header; + + /* Do we have a 'Connection: close' header? */ + if (strcmpic(*header, "Connection: close")) + { + /* No, create one */ + *header = strdup("Connection: close"); + if (header == NULL) + { + return JB_ERR_MEMORY; + } + log_error(LOG_LEVEL_HEADER, "Replaced: \'%s\' with \'%s\'", old_header, *header); + freez(old_header); + } + + /* Signal connection_close_adder() to return early. */ + if (csp->flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE) + { + csp->flags |= CSP_FLAG_SERVER_CONNECTION_CLOSE_SET; + } + else + { + csp->flags |= CSP_FLAG_CLIENT_CONNECTION_CLOSE_SET; + } + + return JB_ERR_OK; +} + + +/********************************************************************* + * * Function : crumble * * Description : This is called if a header matches a pattern to "crunch" @@ -1645,13 +1703,13 @@ jb_err crunch_server_header(struct client_state *csp, char **header) { const char *crunch_pattern; - /*Is there a header to crunch*/ + /* Do we feel like crunching? */ if ((csp->action->flags & ACTION_CRUNCH_SERVER_HEADER)) { crunch_pattern = csp->action->string[ACTION_STRING_SERVER_HEADER]; - /*Is the current header the lucky one?*/ + /* Is the current header the lucky one? */ if (strstr(*header, crunch_pattern)) { log_error(LOG_LEVEL_HEADER, "Crunching server header: %s (contains: %s)", *header, crunch_pattern); @@ -2186,6 +2244,7 @@ return JB_ERR_OK; } + /********************************************************************* * * Function : client_accept_encoding @@ -2473,13 +2532,13 @@ jb_err crunch_client_header(struct client_state *csp, char **header) { const char *crunch_pattern; - /*Is there a header to crunch*/ - + + /* Do we feel like crunching? */ if ((csp->action->flags & ACTION_CRUNCH_CLIENT_HEADER)) { crunch_pattern = csp->action->string[ACTION_STRING_CLIENT_HEADER]; - /*Is the current header the lucky one?*/ + /* Is the current header the lucky one? */ if (strstr(*header, crunch_pattern)) { log_error(LOG_LEVEL_HEADER, "Crunching client header: %s (contains: %s)", *header, crunch_pattern); @@ -2615,9 +2674,10 @@ * * Function : client_send_cookie * - * Description : Handle the "cookie" header properly. Called from `sed'. - * If cookie is accepted, add it to the cookie_list, - * else we crunch it. Mmmmmmmmmmm ... cookie ...... + * Description : Crunches the "cookie" header if necessary. + * Called from `sed'. + * + * XXX: Stupid name, doesn't send squat. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) @@ -2632,25 +2692,13 @@ *********************************************************************/ jb_err client_send_cookie(struct client_state *csp, char **header) { - jb_err result = JB_ERR_OK; - - if ((csp->action->flags & ACTION_NO_COOKIE_READ) == 0) - { - /* strlen("cookie: ") == 8 */ - result = enlist(csp->cookie_list, *header + 8); - } - else + if (csp->action->flags & ACTION_NO_COOKIE_READ) { - log_error(LOG_LEVEL_HEADER, "Crunched outgoing cookie -- yum!"); + log_error(LOG_LEVEL_HEADER, "Crunched outgoing cookie: %s", *header); + freez(*header); } - /* - * Always remove the cookie here. The cookie header - * will be sent at the end of the header. - */ - freez(*header); - - return result; + return JB_ERR_OK; } @@ -2831,6 +2879,9 @@ csp->http->hostport, csp->http->host, csp->http->port); } + /* Signal client_host_adder() to return right away */ + csp->flags |= CSP_FLAG_HOST_HEADER_IS_SET; + return JB_ERR_OK; } @@ -3047,8 +3098,16 @@ char *p; jb_err err; + if (csp->flags & CSP_FLAG_HOST_HEADER_IS_SET) + { + /* Header already set by the client, nothing to do. */ + return JB_ERR_OK; + } + if ( !csp->http->hostport || !*(csp->http->hostport)) { + /* XXX: When does this happen and why is it OK? */ + log_error(LOG_LEVEL_INFO, "Weirdness in client_host_adder detected and ignored."); return JB_ERR_OK; } @@ -3064,6 +3123,7 @@ p = csp->http->hostport; } + /* XXX: Just add it, we already made sure that it will be unique */ log_error(LOG_LEVEL_HEADER, "addh-unique: Host: %s", p); err = enlist_unique_header(csp->headers, "Host", p); return err; @@ -3077,6 +3137,8 @@ * * Description : Used in the add_client_headers list. Called from `sed'. * + * XXX: Remove csp->cookie_list which is no longer used. + * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * @@ -3157,6 +3219,8 @@ *********************************************************************/ jb_err client_accept_encoding_adder(struct client_state *csp) { + assert(0); /* Not in use */ + if ( ((csp->action->flags & ACTION_NO_COMPRESSION) != 0) && (!strcmpic(csp->http->ver, "HTTP/1.1")) ) { @@ -3252,9 +3316,10 @@ * * Function : connection_close_adder * - * Description : Adds a "Connection: close" header to csp->headers - * as a temporary fix for the needed but missing HTTP/1.1 - * support. Called from `sed'. + * Description : "Temporary" fix for the needed but missing HTTP/1.1 + * support. Adds a "Connection: close" header to csp->headers + * unless the header was already present. Called from `sed'. + * * FIXME: This whole function shouldn't be neccessary! * * Parameters : @@ -3266,7 +3331,27 @@ *********************************************************************/ jb_err connection_close_adder(struct client_state *csp) { + const unsigned int flags = csp->flags; + + /* + * Return right away if + * + * - we're parsing server headers and the server header + * "Connection: close" is already set, or if + * + * - we're parsing client headers and the client header + * "Connection: close" is already set. + */ + if ((flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE + && flags & CSP_FLAG_SERVER_CONNECTION_CLOSE_SET) + ||(!(flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE) + && flags & CSP_FLAG_CLIENT_CONNECTION_CLOSE_SET)) + { + return JB_ERR_OK; + } + log_error(LOG_LEVEL_HEADER, "Adding: Connection: close"); + return enlist(csp->headers, "Connection: close"); } @@ -3294,6 +3379,9 @@ *********************************************************************/ jb_err server_http(struct client_state *csp, char **header) { + /* Signal that were now parsing server headers. */ + csp->flags |= CSP_FLAG_CLIENT_HEADER_PARSING_DONE; + sscanf(*header, "HTTP/%*d.%*d %d", &(csp->http->status)); if (csp->http->status == 206) { @@ -3357,10 +3445,10 @@ tm_now = *localtime_r(&now, &tm_now); #elif FEATURE_PTHREAD pthread_mutex_lock(&localtime_mutex); - tm_now = *localtime (&now); + tm_now = *localtime (&now); pthread_mutex_unlock(&localtime_mutex); #else - tm_now = *localtime (&now); + tm_now = *localtime (&now); #endif strftime(tempbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); @@ -3422,11 +3510,11 @@ { char *match; const char *expiration_date = cur_tag + 8; /* Skip "[Ee]xpires=" */ - + memset(&tm_cookie, 0, sizeof(tm_cookie)); /* * Try the valid time formats we know about. * - * XXX: This should be factored out into a separate function. + * XXX: This should be moved to parse_header_time(). * * XXX: Maybe the log messages should be removed * for the next stable release. They just exist to @@ -3466,6 +3554,13 @@ "cookie \'%s\' send by %s appears to be using time format 4.", *header, csp->http->url); } + else if (NULL != (match = strptime(expiration_date, "%A %b %e %H:%M:%S %Y", &tm_cookie))) + { + /* Thu Mar 08 23:00:00 2007 GMT */ + log_error(LOG_LEVEL_HEADER, + "cookie \'%s\' send by %s appears to be using time format 5.", + *header, csp->http->url); + } /* Did any of them match? */ if (NULL == match) @@ -3526,11 +3621,10 @@ } else { - log_error(LOG_LEVEL_HEADER, - "Cookie \'%s\' is still valid and has to be rewritten.", *header); - /* - * Delete the tag by copying the rest of the string over it. + * Still valid, delete expiration date 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.) Index: parsers.h =================================================================== RCS file: /cvsroot/ijbswa/current/parsers.h,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- parsers.h 1 Jan 2007 19:36:37 -0000 1.35 +++ parsers.h 5 Mar 2007 13:25:32 -0000 1.36 @@ -43,6 +43,14 @@ * * Revisions : * $Log$ + * Revision 1.36 2007/03/05 13:25:32 fabiankeil + * - Cosmetical changes for LOG_LEVEL_RE_FILTER messages. + * - Handle "Cookie:" and "Connection:" headers a bit smarter + * (don't crunch them just to recreate them later on). + * - Add another non-standard time format for the cookie + * expiration date detection. + * - Fix a valgrind warning. + * * Revision 1.35 2007/01/01 19:36:37 fabiankeil * Integrate a modified version of Wil Mahan's * zlib patch (PR #895531). @@ -246,7 +254,11 @@ extern struct tm *parse_header_time(char *header, time_t *tm); extern jb_err get_destination_from_headers(const struct list *headers, struct http_request *http); +/* XXX: Why do we export these anyway? */ extern jb_err crumble (struct client_state *csp, char **header); +extern jb_err connection (struct client_state *csp, char **header); +extern jb_err filter_header (struct client_state *csp, char **header); + extern jb_err client_referrer (struct client_state *csp, char **header); extern jb_err client_uagent (struct client_state *csp, char **header); extern jb_err client_ua (struct client_state *csp, char **header); @@ -261,7 +273,6 @@ extern jb_err client_accept_language (struct client_state *csp, char **header); extern jb_err client_if_none_match (struct client_state *csp, char **header); extern jb_err crunch_client_header (struct client_state *csp, char **header); -extern jb_err filter_header (struct client_state *csp, char **header); extern jb_err filter_client_header (struct client_state *csp, char **header); extern jb_err filter_server_header (struct client_state *csp, char **header); extern jb_err client_x_filter (struct client_state *csp, char **header); |