Mercurial > p > roundup > code
view share/roundup/templates/devel/html/style.css @ 8185:e84d4585b16d
fix(web): issue2551356. Add etag header for not-modified (304) request.
When a 304 is returned to a conditional request for a static file,
print an ETag for the response.
ETag was always sent with a 200 response.
This also adds initial support for if-none-match conditional requests
for static files.
Changes:
Refactors the if-modified-since code out to a method.
It moves a file stat call from serve_static_file to _serve_file
so that an etag can be generated by both serve_static_file and
serve_file which call _serve_file.
Tests added. This does not test the codepath where serve_file pulls
content from the database rather than from a local file on disk.
Test mocking _serve_file changed to account for 5th argument to serve_file
BREAKING CHANGE:
function signature for client.py-Client::_serve_file() now has 5 not 4
parameters (added etag param). Since this is a "hidden" method I am
not too worried about it.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Tue, 10 Dec 2024 16:06:13 -0500 |
| parents | 7ed1893ea3ac |
| children |
line wrap: on
line source
/* layout*/ body { font-family: sans-serif, Arial, Helvetica; background-color: white; color: #333; margin:0; padding: 0 3em 0 13em; } body > .header { margin: 0 0 0 -13em;} body > .footer { margin: 0 0 0 -13em; clear:both;} body > .navigation { margin-left: -13em; width: 13em; float: left; } body > .content { width: 100%; margin: 0; } body > .header > #searchbox { position: absolute; right: 1em; top: 1em;} /* style */ .footer { padding: 1em;} :link { color: #bb0000; text-decoration: none;} :visited { color: #770000; text-decoration: none;} .header h1 { margin-left: 1em; } body { font-family: sans-serif, Arial, Helvetica; background-color: #f5f5f5; color: #333; } .menu { padding: 0; margin-right: 1em;} .menu ul { padding: 0; margin: 0; } .menu li { margin: 5pt 0; } .menu > ul > li > * { display: block; padding: 2pt 2pt 2pt 10pt; border: solid thin #dadada; background-color:#ffffff; } .menu > ul > li.current > * { background-color:#dddddd; } .menu ul li:first-child { margin-top:0;} .menu ul { list-style-type:none;} /* sub-menus are indented */ .menu > ul > li > ul, .menu > ul > li.current > ul { border: none; background-color: inherit; margin: 0; } .menu ul ul { margin-left: 2em; font-size: smaller; margin: 0 0 0 5pt; } /* sub-menu items draw a separator */ .menu ul ul > li { margin: 0; padding: 0; border: none; border-top: solid thin #dadada; background-color: inherit; } .menu ul ul > li:first-child { border-top: none; } .footer { font-size: small; text-align: center; color: lightgrey; } .content { padding: 1em; border: solid thin #dadada; background-color: #ffffff; } pre { white-space: pre-wrap; } #search { text-align: right; } p.ok-message { background-color: #eeffee; border: 1px solid #009900; padding: 5px; color: #009900; font-weight: bold; } p.error-message { background-color: #ffeeee; border: 1px solid #990000; padding: 5px; color: #990000; font-weight: bold; } table { border-collapse: collapse; border-spacing: 1px; width: 100%; background-color: #fafafa; } tr.odd { background-color:#f5f5f5; } input, textarea { border-width: 1px; }
