Blame SOURCES/httpd-2.4.34-session-expiry-updt-int.patch

9364d6
diff --git a/docs/manual/mod/mod_session.html.en b/docs/manual/mod/mod_session.html.en
9364d6
index 6834f8e..9f8301f 100644
9364d6
--- a/docs/manual/mod/mod_session.html.en
9364d6
+++ b/docs/manual/mod/mod_session.html.en
9364d6
@@ -82,6 +82,7 @@
9364d6
 
  • SessionHeader
  • 9364d6
     
  • SessionInclude
  • 9364d6
     
  • SessionMaxAge
  • 9364d6
    +
  • SessionExpiryUpdateInterval
  • 9364d6
     
    9364d6
     

    Bugfix checklist

    See also

    9364d6
     
      9364d6
      @@ -482,6 +483,37 @@ AuthName realm
      9364d6
       
      9364d6
           

      Setting the maxage to zero disables session expiry.

      9364d6
       
      9364d6
      +
      9364d6
      +
      top
      9364d6
      +
      9364d6
      +
      9364d6
      +Description:Define the number of seconds a session's expiry may change without the session being updated
      9364d6
      +Syntax:SessionExpiryUpdateInterval interval
      9364d6
      +Default:SessionExpiryUpdateInterval 0 (always update)
      9364d6
      +Context:server config, virtual host, directory, .htaccess
      9364d6
      +Module:mod_session
      9364d6
      +
      9364d6
      +    

      The SessionExpiryUpdateInterval directive allows

      9364d6
      +    sessions to avoid the cost associated with writing the session each request
      9364d6
      +    when only the expiry time has changed. This can be used to make a website
      9364d6
      +    more efficient or reduce load on a database when using
      9364d6
      +    <module>mod_session_dbd</module>. The session is always written if the data
      9364d6
      +    stored in the session has changed or the expiry has changed by more than the
      9364d6
      +    configured interval.

      9364d6
      +
      9364d6
      +    

      Setting the interval to zero disables this directive, and the session

      9364d6
      +    expiry is refreshed for each request.

      9364d6
      +
      9364d6
      +    

      This directive only has an effect when combined with SessionMaxAge to enable session

      9364d6
      +    expiry. Sessions without an expiry are only written when the data stored in
      9364d6
      +    the session has changed.

      9364d6
      +
      9364d6
      +    

      Warning

      9364d6
      +    

      Because the session expiry may not be refreshed with each request, it's

      9364d6
      +    possible for sessions to expire up to interval seconds early.
      9364d6
      +    Using a small interval usually provides sufficient savings while having a
      9364d6
      +    minimal effect on expiry resolution.

      9364d6
      +
      9364d6
       
      9364d6
       
      9364d6
       
      9364d6
      diff --git a/modules/session/mod_session.c b/modules/session/mod_session.c
      9364d6
      index 64e6e4a..7ee477c 100644
      9364d6
      --- a/modules/session/mod_session.c
      9364d6
      +++ b/modules/session/mod_session.c
      9364d6
      @@ -180,6 +180,7 @@ static apr_status_t ap_session_save(request_rec * r, session_rec * z)
      9364d6
       {
      9364d6
           if (z) {
      9364d6
               apr_time_t now = apr_time_now();
      9364d6
      +        apr_time_t initialExpiry = z->expiry;
      9364d6
               int rv = 0;
      9364d6
       
      9364d6
               session_dir_conf *dconf = ap_get_module_config(r->per_dir_config,
      9364d6
      @@ -210,6 +211,17 @@ static apr_status_t ap_session_save(request_rec * r, session_rec * z)
      9364d6
                   z->expiry = now + z->maxage * APR_USEC_PER_SEC;
      9364d6
               } 
      9364d6
       
      9364d6
      +        /* don't save if the only change is the expiry by a small amount */
      9364d6
      +        if (!z->dirty && dconf->expiry_update_time
      9364d6
      +                && (z->expiry - initialExpiry < dconf->expiry_update_time)) {
      9364d6
      +            return APR_SUCCESS;
      9364d6
      +        }
      9364d6
      +
      9364d6
      +        /* also don't save sessions that didn't change at all */
      9364d6
      +        if (!z->dirty && !z->maxage) {
      9364d6
      +            return APR_SUCCESS;
      9364d6
      +        }
      9364d6
      +
      9364d6
               /* encode the session */
      9364d6
               rv = ap_run_session_encode(r, z);
      9364d6
               if (OK != rv) {
      9364d6
      @@ -556,6 +568,10 @@ static void *merge_session_dir_config(apr_pool_t * p, void *basev, void *addv)
      9364d6
           new->env_set = add->env_set || base->env_set;
      9364d6
           new->includes = apr_array_append(p, base->includes, add->includes);
      9364d6
           new->excludes = apr_array_append(p, base->excludes, add->excludes);
      9364d6
      +    new->expiry_update_time = (add->expiry_update_set == 0)
      9364d6
      +                                ? base->expiry_update_time
      9364d6
      +                                : add->expiry_update_time;
      9364d6
      +    new->expiry_update_set = add->expiry_update_set || base->expiry_update_set;
      9364d6
       
      9364d6
           return new;
      9364d6
       }
      9364d6
      @@ -625,6 +641,21 @@ static const char *add_session_exclude(cmd_parms * cmd, void *dconf, const char
      9364d6
           return NULL;
      9364d6
       }
      9364d6
       
      9364d6
      +static const char *
      9364d6
      +     set_session_expiry_update(cmd_parms * parms, void *dconf, const char *arg)
      9364d6
      +{
      9364d6
      +    session_dir_conf *conf = dconf;
      9364d6
      +
      9364d6
      +    conf->expiry_update_time = atoi(arg);
      9364d6
      +    if (conf->expiry_update_time < 0) {
      9364d6
      +        return "SessionExpiryUpdateInterval must be positive or nul";
      9364d6
      +    }
      9364d6
      +    conf->expiry_update_time = apr_time_from_sec(conf->expiry_update_time);
      9364d6
      +    conf->expiry_update_set = 1;
      9364d6
      +
      9364d6
      +    return NULL;
      9364d6
      +}
      9364d6
      +
      9364d6
       
      9364d6
       static const command_rec session_cmds[] =
      9364d6
       {
      9364d6
      @@ -640,6 +671,9 @@ static const command_rec session_cmds[] =
      9364d6
                         "URL prefixes to include in the session. Defaults to all URLs"),
      9364d6
           AP_INIT_TAKE1("SessionExclude", add_session_exclude, NULL, RSRC_CONF|OR_AUTHCFG,
      9364d6
                         "URL prefixes to exclude from the session. Defaults to no URLs"),
      9364d6
      +    AP_INIT_TAKE1("SessionExpiryUpdateInterval", set_session_expiry_update, NULL, RSRC_CONF|OR_AUTHCFG,
      9364d6
      +                  "time interval for which a session's expiry time may change "
      9364d6
      +                  "without having to be rewritten. Zero to disable"),
      9364d6
           {NULL}
      9364d6
       };
      9364d6
       
      9364d6
      diff --git a/modules/session/mod_session.h b/modules/session/mod_session.h
      9364d6
      index a6dd5e9..bdeb532 100644
      9364d6
      --- a/modules/session/mod_session.h
      9364d6
      +++ b/modules/session/mod_session.h
      9364d6
      @@ -115,6 +115,9 @@ typedef struct {
      9364d6
                                          * URLs included if empty */
      9364d6
           apr_array_header_t *excludes; /* URL prefixes to be excluded. No
      9364d6
                                          * URLs excluded if empty */
      9364d6
      +    apr_time_t expiry_update_time; /* seconds the session expiry may change and
      9364d6
      +                                    * not have to be rewritten */
      9364d6
      +    int expiry_update_set;
      9364d6
       } session_dir_conf;
      9364d6
       
      9364d6
       /**
      9364d6
      diff --git a/modules/session/mod_session_cookie.c b/modules/session/mod_session_cookie.c
      9364d6
      index fee7c36..25ca16e 100644
      9364d6
      --- a/modules/session/mod_session_cookie.c
      9364d6
      +++ b/modules/session/mod_session_cookie.c
      9364d6
      @@ -60,9 +60,6 @@ static apr_status_t session_cookie_save(request_rec * r, session_rec * z)
      9364d6
           session_cookie_dir_conf *conf = ap_get_module_config(r->per_dir_config,
      9364d6
                                                           &session_cookie_module);
      9364d6
       
      9364d6
      -    /* don't cache auth protected pages */
      9364d6
      -    apr_table_addn(r->headers_out, "Cache-Control", "no-cache");
      9364d6
      -
      9364d6
           /* create RFC2109 compliant cookie */
      9364d6
           if (conf->name_set) {
      9364d6
               if (z->encoded && z->encoded[0]) {
      9364d6
      @@ -162,6 +159,9 @@ static apr_status_t session_cookie_load(request_rec * r, session_rec ** z)
      9364d6
           /* put the session in the notes so we don't have to parse it again */
      9364d6
           apr_table_setn(m->notes, note, (char *)zz);
      9364d6
       
      9364d6
      +    /* don't cache auth protected pages */
      9364d6
      +    apr_table_addn(r->headers_out, "Cache-Control", "no-cache, private");
      9364d6
      +
      9364d6
           return OK;
      9364d6
       
      9364d6
       }
      9364d6
      diff --git a/modules/session/mod_session_dbd.c b/modules/session/mod_session_dbd.c
      9364d6
      index 0be7306..f683da2 100644
      9364d6
      --- a/modules/session/mod_session_dbd.c
      9364d6
      +++ b/modules/session/mod_session_dbd.c
      9364d6
      @@ -245,6 +245,9 @@ static apr_status_t session_dbd_load(request_rec * r, session_rec ** z)
      9364d6
           /* put the session in the notes so we don't have to parse it again */
      9364d6
           apr_table_setn(m->notes, note, (char *)zz);
      9364d6
       
      9364d6
      +    /* don't cache pages with a session */
      9364d6
      +    apr_table_addn(r->headers_out, "Cache-Control", "no-cache, private");
      9364d6
      +
      9364d6
           return OK;
      9364d6
       
      9364d6
       }
      9364d6
      @@ -409,9 +412,6 @@ static apr_status_t session_dbd_save(request_rec * r, session_rec * z)
      9364d6
           if (conf->name_set || conf->name2_set) {
      9364d6
               char *oldkey = NULL, *newkey = NULL;
      9364d6
       
      9364d6
      -        /* don't cache pages with a session */
      9364d6
      -        apr_table_addn(r->headers_out, "Cache-Control", "no-cache");
      9364d6
      -
      9364d6
               /* if the session is new or changed, make a new session ID */
      9364d6
               if (z->uuid) {
      9364d6
                   oldkey = apr_pcalloc(r->pool, APR_UUID_FORMATTED_LENGTH + 1);
      9364d6
      @@ -458,7 +458,7 @@ static apr_status_t session_dbd_save(request_rec * r, session_rec * z)
      9364d6
           else if (conf->peruser) {
      9364d6
       
      9364d6
               /* don't cache pages with a session */
      9364d6
      -        apr_table_addn(r->headers_out, "Cache-Control", "no-cache");
      9364d6
      +        apr_table_addn(r->headers_out, "Cache-Control", "no-cache, private");
      9364d6
       
      9364d6
               if (r->user) {
      9364d6
                   ret = dbd_save(r, r->user, r->user, z->encoded, z->expiry);