Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Enhance the Cache-control: header for tarballs and archives so that if the object is uniquely identified by a hash the download has a 10-year timeout and an "immutable" tag. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
44339d537869206a9a935a55dc327d75 |
| User & Date: | drh 2021-07-11 19:30:04.473 |
Context
|
2021-07-11
| ||
| 23:43 | Add the ticket-default-report setting, which if set to the title of a ticket report causes that ticket report to be displayed below the search box in the /ticket page. ... (check-in: c51ace6bc8 user: drh tags: trunk) | |
| 19:30 | Enhance the Cache-control: header for tarballs and archives so that if the object is uniquely identified by a hash the download has a 10-year timeout and an "immutable" tag. ... (check-in: 44339d5378 user: drh tags: trunk) | |
| 19:16 | Checked into the wrong branch... ... (Closed-Leaf check-in: 005bba0650 user: drh tags: wrong-branch) | |
|
2021-07-09
| ||
| 16:15 | Auto-sync prior to running "fossil open". Add the --nosync flags to "fossil open" and "fossil up" to disable the auto-sync. ... (check-in: dc97155ec7 user: drh tags: trunk) | |
Changes
Changes to src/cgi.c.
| ︙ | ︙ | |||
311 312 313 314 315 316 317 |
if( etag_mtime()>0 ){
fprintf(g.httpOut, "Last-Modified: %s\r\n",
cgi_rfc822_datestamp(etag_mtime()));
}
}else if( g.isConst ){
/* isConst means that the reply is guaranteed to be invariant, even
** after configuration changes and/or Fossil binary recompiles. */
| | | 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 |
if( etag_mtime()>0 ){
fprintf(g.httpOut, "Last-Modified: %s\r\n",
cgi_rfc822_datestamp(etag_mtime()));
}
}else if( g.isConst ){
/* isConst means that the reply is guaranteed to be invariant, even
** after configuration changes and/or Fossil binary recompiles. */
fprintf(g.httpOut, "Cache-Control: max-age=315360000, immutable\r\n");
}else{
fprintf(g.httpOut, "Cache-control: no-cache\r\n");
}
if( blob_size(&extraHeader)>0 ){
fprintf(g.httpOut, "%s", blob_buffer(&extraHeader));
}
|
| ︙ | ︙ |
Changes to src/etag.c.
| ︙ | ︙ | |||
171 172 173 174 175 176 177 178 179 180 181 182 183 184 | ** not changed and we can do a 304 reply */ cgi_reset_content(); cgi_set_status(304, "Not Modified"); cgi_reply(); db_close(0); fossil_exit(0); } /* ** Accept a new Last-Modified time. This routine should be called by ** page generators that know a valid last-modified time. This routine ** might generate a 304 Not Modified reply and exit(), never returning. ** Or, if not, it will cause a Last-Modified: header to be included in the ** reply. | > > > > > > > > > > > > > > > > | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
** not changed and we can do a 304 reply */
cgi_reset_content();
cgi_set_status(304, "Not Modified");
cgi_reply();
db_close(0);
fossil_exit(0);
}
/*
** If the output is determined purely by hash parameter and the hash
** is long enough to be invariant, then set the g.isConst flag, indicating
** that the output will never change.
*/
void etag_check_for_invariant_name(const char *zHash){
size_t nHash = strlen(zHash);
if( nHash<HNAME_MIN ){
return; /* Name is too short */
}
if( !validate16(zHash, (int)nHash) ){
return; /* Name is not pure hex */
}
g.isConst = 1; /* A long hex identifier must be a unique hash */
}
/*
** Accept a new Last-Modified time. This routine should be called by
** page generators that know a valid last-modified time. This routine
** might generate a 304 Not Modified reply and exit(), never returning.
** Or, if not, it will cause a Last-Modified: header to be included in the
** reply.
|
| ︙ | ︙ | |||
210 211 212 213 214 215 216 |
db_close(0);
fossil_exit(0);
}
/* Return the ETag, if there is one.
*/
const char *etag_tag(void){
| | | 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
db_close(0);
fossil_exit(0);
}
/* Return the ETag, if there is one.
*/
const char *etag_tag(void){
return g.isConst ? "" : zETag;
}
/* Return the recommended max-age
*/
int etag_maxage(void){
return iMaxAge;
}
|
| ︙ | ︙ |
Changes to src/tar.c.
| ︙ | ︙ | |||
772 773 774 775 776 777 778 779 780 781 782 783 784 785 |
if( z==0 ) z = "trunk";
g.zOpenRevision = zRid = fossil_strdup(z);
nRid = strlen(zRid);
zInclude = P("in");
if( zInclude ) pInclude = glob_create(zInclude);
zExclude = P("ex");
if( zExclude ) pExclude = glob_create(zExclude);
nName = strlen(zName);
if( nName>7 && fossil_strcmp(&zName[nName-7], ".tar.gz")==0 ){
/* Special case: Remove the ".tar.gz" suffix. */
nName -= 7;
zName[nName] = 0;
}else{
/* If the file suffix is not ".tar.gz" then just remove the
| > > > | 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 |
if( z==0 ) z = "trunk";
g.zOpenRevision = zRid = fossil_strdup(z);
nRid = strlen(zRid);
zInclude = P("in");
if( zInclude ) pInclude = glob_create(zInclude);
zExclude = P("ex");
if( zExclude ) pExclude = glob_create(zExclude);
if( zInclude==0 && zExclude==0 ){
etag_check_for_invariant_name(z);
}
nName = strlen(zName);
if( nName>7 && fossil_strcmp(&zName[nName-7], ".tar.gz")==0 ){
/* Special case: Remove the ".tar.gz" suffix. */
nName -= 7;
zName[nName] = 0;
}else{
/* If the file suffix is not ".tar.gz" then just remove the
|
| ︙ | ︙ |
Changes to src/zip.c.
| ︙ | ︙ | |||
938 939 940 941 942 943 944 945 946 947 948 949 950 951 |
nName = strlen(zName);
g.zOpenRevision = zRid = fossil_strdup(z);
nRid = strlen(zRid);
zInclude = P("in");
if( zInclude ) pInclude = glob_create(zInclude);
zExclude = P("ex");
if( zExclude ) pExclude = glob_create(zExclude);
if( eType==ARCHIVE_ZIP
&& nName>4
&& fossil_strcmp(&zName[nName-4], ".zip")==0
){
/* Special case: Remove the ".zip" suffix. */
nName -= 4;
zName[nName] = 0;
| > > > | 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 |
nName = strlen(zName);
g.zOpenRevision = zRid = fossil_strdup(z);
nRid = strlen(zRid);
zInclude = P("in");
if( zInclude ) pInclude = glob_create(zInclude);
zExclude = P("ex");
if( zExclude ) pExclude = glob_create(zExclude);
if( zInclude==0 && zExclude==0 ){
etag_check_for_invariant_name(z);
}
if( eType==ARCHIVE_ZIP
&& nName>4
&& fossil_strcmp(&zName[nName-4], ".zip")==0
){
/* Special case: Remove the ".zip" suffix. */
nName -= 4;
zName[nName] = 0;
|
| ︙ | ︙ |