-const char parsers_rcs[] = "$Id: parsers.c,v 1.205 2009/08/19 15:26:36 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.210 2009/12/25 11:39:26 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
struct re_filterfile_spec *b;
struct list_entry *tag_name;
- int found_filters = 0;
const size_t header_length = strlen(header);
if (csp->flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE)
multi_action_index = ACTION_MULTI_CLIENT_HEADER_TAGGER;
}
- /* Check if there are any filters */
- for (i = 0; i < MAX_AF_FILES; i++)
- {
- fl = csp->rlist[i];
- if (NULL != fl)
- {
- if (NULL != fl->f)
- {
- found_filters = 1;
- break;
- }
- }
- }
-
- if (0 == found_filters)
+ if (filters_available(csp) == FALSE)
{
log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: "
"tagging enabled, but no taggers available.");
struct re_filterfile_spec *b;
struct list_entry *filtername;
- int i, found_filters = 0;
+ int i;
int wanted_filter_type;
int multi_action_index;
multi_action_index = ACTION_MULTI_CLIENT_HEADER_FILTER;
}
- /*
- * Need to check the set of re_filterfiles...
- */
- for (i = 0; i < MAX_AF_FILES; i++)
- {
- fl = csp->rlist[i];
- if (NULL != fl)
- {
- if (NULL != fl->f)
- {
- found_filters = 1;
- break;
- }
- }
- }
-
- if (0 == found_filters)
+ if (filters_available(csp) == FALSE)
{
log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: "
"header filtering enabled, but no matching filters available.");
}
+/*********************************************************************
+ *
+ * Function : get_content_length
+ *
+ * Description : Gets the content length specified in a
+ * Content-Length header.
+ *
+ * Parameters :
+ * 1 : header = The Content-Length header.
+ * 2 : length = Storage to return the value.
+ *
+ * Returns : JB_ERR_OK on success, or
+ * JB_ERR_PARSE if no value is recognized.
+ *
+ *********************************************************************/
+static jb_err get_content_length(const char *header, unsigned long long *length)
+{
+ assert(header[14] == ':');
+
+#ifdef _WIN32
+ assert(sizeof(unsigned long long) > 4);
+ if (1 != sscanf(header+14, ": %I64u", length))
+#else
+ if (1 != sscanf(header+14, ": %llu", length))
+#endif
+ {
+ return JB_ERR_PARSE;
+ }
+
+ return JB_ERR_OK;
+}
+
+
/*********************************************************************
*
* Function : client_save_content_length
*
* Description : Save the Content-Length sent by the client.
*
- * XXX: Shares code with the server version
- * that should be factored out.
- *
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
* 2 : header = On input, pointer to header to modify.
assert(*(*header+14) == ':');
-#ifdef _WIN32
- if (1 != sscanf(*header+14, ": %I64u", &content_length))
-#else
- if (1 != sscanf(*header+14, ": %llu", &content_length))
-#endif
+ if (JB_ERR_OK != get_content_length(*header, &content_length))
{
log_error(LOG_LEVEL_ERROR, "Crunching invalid header: %s", *header);
freez(*header);
}
else
{
- log_error(LOG_LEVEL_CONNECT,
- "Setting client content lenght %llu", content_length);
csp->expected_client_content_length = content_length;
}
assert(*(*header+14) == ':');
-#ifdef _WIN32
- if (1 != sscanf(*header+14, ": %I64u", &content_length))
-#else
- if (1 != sscanf(*header+14, ": %llu", &content_length))
-#endif
+ if (JB_ERR_OK != get_content_length(*header, &content_length))
{
log_error(LOG_LEVEL_ERROR, "Crunching invalid header: %s", *header);
freez(*header);
{
char *expiration_date = cur_tag + 8; /* Skip "[Ee]xpires=" */
+ if ((expiration_date[0] == '"')
+ && (expiration_date[1] != '\0'))
+ {
+ /*
+ * Skip quotation mark. RFC 2109 10.1.2 seems to hint
+ * that the expiration date isn't supposed to be quoted,
+ * but some servers do it anyway.
+ */
+ expiration_date++;
+ }
+
/* Did we detect the date properly? */
if (JB_ERR_OK != parse_header_time(expiration_date, &cookie_time))
{