diff --git a/CHANGES b/CHANGES index 8f359e37..465e7c63 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,10 @@ -26 Jan 2010 - trunk +27 Jan 2010 - trunk ------------------- + * Added DURATION, which contains the time ellapsed since the beginning + of the current transaction, in milliseconds. [Ivan Ristic] + * Adjusted phase 5 to execute just prior to mod_log_config. This should allow phase 5 rules to to implement conditional logging, as well as pave support for allowing access to all ModSecurity variables from diff --git a/apache2/re_variables.c b/apache2/re_variables.c index 46705e6d..878bba5a 100644 --- a/apache2/re_variables.c +++ b/apache2/re_variables.c @@ -1426,6 +1426,23 @@ static int var_urlencoded_error_generate(modsec_rec *msr, msre_var *var, msre_ru } } +/* DURATION */ + +static int var_duration_generate(modsec_rec *msr, msre_var *var, msre_rule *rule, + apr_table_t *vartab, apr_pool_t *mptmp) +{ + msre_var *rvar = NULL; + + rvar = apr_pmemdup(mptmp, var, sizeof(msre_var)); + rvar->value = apr_psprintf(mptmp, "%" APR_TIME_T_FMT, + (apr_time_msec(apr_time_now() - msr->r->request_time))); + rvar->value_len = strlen(rvar->value); + + apr_table_addn(vartab, rvar->name, (void *)rvar); + + return 1; +} + /* TIME */ static int var_time_generate(modsec_rec *msr, msre_var *var, msre_rule *rule, @@ -3017,6 +3034,17 @@ void msre_engine_register_default_variables(msre_engine *engine) { VAR_DONT_CACHE, /* dynamic */ PHASE_RESPONSE_HEADERS ); + + /* DURATION */ + msre_engine_variable_register(engine, + "DURATION", + VAR_SIMPLE, + 0, 0, + NULL, + var_duration_generate, + VAR_DONT_CACHE, /* dynamic */ + PHASE_REQUEST_HEADERS + ); /* TIME */ msre_engine_variable_register(engine,