Hi,

Here is a patch for some cache control in httpd. I've embedded this into
the 'types' section so one can have the following in httpd.conf:

types {
        text/html       htm html
        text/css        css < 604800
        image/jpeg      jpeg jpg < 86400
}

Questions:
        - Is there any interest?
        - Is the right place (maybe this shoud be in 'location')?

Index: http.h
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/http.h,v
retrieving revision 1.12
diff -u -p -r1.12 http.h
--- http.h      11 Feb 2015 12:52:01 -0000      1.12
+++ http.h      15 Sep 2015 12:18:20 -0000
@@ -208,21 +208,22 @@ struct http_mediatype {
        char            *media_name;
        char            *media_type;
        char            *media_subtype;
+       int             media_maxage;
 };
 /*
  * Some default media types based on (2014-08-04 version):
  * https://www.iana.org/assignments/media-types/media-types.xhtml
  */
 #define MEDIA_TYPES            {                       \
-       { "css",        "text",         "css" },        \
-       { "html",       "text",         "html" },       \
-       { "txt",        "text",         "plain" },      \
-       { "gif",        "image",        "gif" },        \
-       { "jpeg",       "image",        "jpeg" },       \
-       { "jpg",        "image",        "jpeg" },       \
-       { "png",        "image",        "png" },        \
-       { "svg",        "image",        "svg+xml" },    \
-       { "js",         "application",  "javascript" }, \
+       { "css",        "text",         "css",          0 },    \
+       { "html",       "text",         "html",         0 },    \
+       { "txt",        "text",         "plain",        0 },    \
+       { "gif",        "image",        "gif",          0 },    \
+       { "jpeg",       "image",        "jpeg",         0 },    \
+       { "jpg",        "image",        "jpeg",         0 },    \
+       { "png",        "image",        "png",          0 },    \
+       { "svg",        "image",        "svg+xml",      0 },    \
+       { "js",         "application",  "javascript",   0 },    \
        { NULL }                                        \
 }
 
Index: httpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/httpd.h,v
retrieving revision 1.81
diff -u -p -r1.81 httpd.h
--- httpd.h     23 Feb 2015 18:43:18 -0000      1.81
+++ httpd.h     15 Sep 2015 12:18:20 -0000
@@ -457,6 +457,7 @@ struct media_type {
        char                     media_type[MEDIATYPE_TYPEMAX];
        char                     media_subtype[MEDIATYPE_TYPEMAX];
        char                    *media_encoding;
+       int                      media_maxage;
        RB_ENTRY(media_type)     media_entry;
 };
 RB_HEAD(mediatypes, media_type);
Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/parse.y,v
retrieving revision 1.65
diff -u -p -r1.65 parse.y
--- parse.y     12 Feb 2015 04:40:23 -0000      1.65
+++ parse.y     15 Sep 2015 12:18:20 -0000
@@ -960,7 +960,15 @@ mediaoptsl : STRING '/' STRING     {
                        }
                        free($1);
                        free($3);
-               } medianames_l optsemicolon
+               } medianames_l optmaxage optsemicolon {
+                       if (!loadcfg)
+                               break;
+
+                       if (media_add(conf->sc_mediatypes, &media) == NULL) {
+                               yyerror("failed to add media type");
+                               YYERROR;
+                       }
+               }
                | include
                ;
 
@@ -977,15 +985,18 @@ medianamesl       : numberstring                          
{
                                YYERROR;
                        }
                        free($1);
+               }
+               ;
 
-                       if (!loadcfg)
-                               break;
-
-                       if (media_add(conf->sc_mediatypes, &media) == NULL) {
-                               yyerror("failed to add media type");
+optmaxage      : '<' NUMBER {
+                       if ($2 < 0) {
+                               yyerror("invalid maxage: %lld", $2);
                                YYERROR;
                        }
+
+                       media.media_maxage = $2;
                }
+               |
                ;
 
 port           : PORT NUMBER {
@@ -1553,6 +1564,7 @@ load_config(const char *filename, struct
                        (void)strlcpy(m.media_subtype,
                            mediatypes[i].media_subtype,
                            sizeof(m.media_subtype));
+                       m.media_maxage = mediatypes[i].media_maxage;
                        m.media_encoding = NULL;
 
                        if (media_add(conf->sc_mediatypes, &m) == NULL) {
Index: server_http.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/server_http.c,v
retrieving revision 1.75
diff -u -p -r1.75 server_http.c
--- server_http.c       23 Feb 2015 18:43:18 -0000      1.75
+++ server_http.c       15 Sep 2015 12:18:20 -0000
@@ -1130,7 +1130,7 @@ server_response_http(struct client *clt,
        struct http_descriptor  *desc = clt->clt_descreq;
        struct http_descriptor  *resp = clt->clt_descresp;
        const char              *error;
-       struct kv               *ct, *cl;
+       struct kv               *ct, *cl, *cc;
        char                     tmbuf[32];
 
        if (desc == NULL || (error = server_httperror_byid(code)) == NULL)
@@ -1169,6 +1169,10 @@ server_response_http(struct client *clt,
            kv_set(cl, "%ld", size) == -1)
                return (-1);
 
+       if ((cc = kv_add(&resp->http_headers, "Cache-Control", NULL)) == NULL ||
+           kv_set(cc, "max-age=%lld", media->media_maxage) == -1)
+               return (-1);
+       
        /* Set last modification time */
        if (server_http_time(mtime, tmbuf, sizeof(tmbuf)) <= 0 ||
            kv_add(&resp->http_headers, "Last-Modified", tmbuf) == NULL)


-- 
Manuel Giraud

Reply via email to