Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add a Content-Disposition: header to the HTTP reply for the "Download" button. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
34cb4766f1cabaad44c1b91c500539df |
User & Date: | drh 2020-05-21 23:56:10.691 |
Context
2020-05-21
| ||
23:59 | Change a case of isalnum() to fossil_isalnum(). ... (check-in: 02e7c86b user: drh tags: trunk) | |
23:56 | Add a Content-Disposition: header to the HTTP reply for the "Download" button. ... (check-in: 34cb4766 user: drh tags: trunk) | |
13:00 | Fix the URL on some Download submenu links. ... (check-in: 9d18585d user: drh tags: trunk) | |
Changes
Changes to src/cgi.c.
︙ | ︙ | |||
431 432 433 434 435 436 437 438 439 440 441 442 443 444 | } NORETURN void cgi_redirectf(const char *zFormat, ...){ va_list ap; va_start(ap, zFormat); cgi_redirect(vmprintf(zFormat, ap)); va_end(ap); } /* ** Return the URL for the caller. This is obtained from either the ** referer CGI parameter, if it exists, or the HTTP_REFERER HTTP parameter. ** If neither exist, return zDefault. */ const char *cgi_referer(const char *zDefault){ | > > > > > > > > > > > > > > > > > > > | 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 | } NORETURN void cgi_redirectf(const char *zFormat, ...){ va_list ap; va_start(ap, zFormat); cgi_redirect(vmprintf(zFormat, ap)); va_end(ap); } /* ** Add a "Content-disposition: attachment; filename=%s" header to the reply. */ void cgi_content_disposition_filename(const char *zFilename){ /* 0123456789 123456789 123456789 123456789 123456*/ char *z = mprintf("Content-Disposition: attachment; filename=\"%s\";\r\n", zFilename); int i; int n = (int)strlen(z); for(i=43; i<n-4; i++){ char c = z[i]; if( isalnum(c) ) continue; if( c=='.' || c=='-' || c=='/' ) continue; z[i] = '_'; } cgi_append_header(z); fossil_free(z); } /* ** Return the URL for the caller. This is obtained from either the ** referer CGI parameter, if it exists, or the HTTP_REFERER HTTP parameter. ** If neither exist, return zDefault. */ const char *cgi_referer(const char *zDefault){ |
︙ | ︙ |
Changes to src/info.c.
︙ | ︙ | |||
1752 1753 1754 1755 1756 1757 1758 | append_diff(zV1, zV2, diffFlags, pRe); append_diff_javascript(diffType); style_footer(); } /* ** WEBPAGE: raw | | > > > > > | 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 | append_diff(zV1, zV2, diffFlags, pRe); append_diff_javascript(diffType); style_footer(); } /* ** WEBPAGE: raw ** URL: /raw/ARTIFACTID ** URL: /raw?ci=BRANCH&filename=NAME ** ** Additional query parameters: ** ** m=MIMETYPE The mimetype is MIMETYPE ** at=FILENAME Content-disposition; attachment; filename=FILENAME; ** ** Return the uninterpreted content of an artifact. Used primarily ** to view artifacts that are images. */ void rawartifact_page(void){ int rid = 0; char *zUuid; |
︙ | ︙ | |||
1814 1815 1816 1817 1818 1819 1820 1821 | ** Generate a verbatim artifact as the result of an HTTP request. ** If zMime is not NULL, use it as the MIME-type. If zMime is ** NULL, guess at the MIME-type based on the filename ** associated with the artifact. */ void deliver_artifact(int rid, const char *zMime){ Blob content; if( zMime==0 ){ | > > > | | | > | | | | > | > > | > > > > | 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 | ** Generate a verbatim artifact as the result of an HTTP request. ** If zMime is not NULL, use it as the MIME-type. If zMime is ** NULL, guess at the MIME-type based on the filename ** associated with the artifact. */ void deliver_artifact(int rid, const char *zMime){ Blob content; const char *zAttachName = P("at"); if( zMime==0 ){ char *zFN = (char*)zAttachName; if( zFN==0 ){ zFN = db_text(0, "SELECT filename.name FROM mlink, filename" " WHERE mlink.fid=%d" " AND filename.fnid=mlink.fnid", rid); } if( zFN==0 ){ /* Look also at the attachment table */ zFN = db_text(0, "SELECT attachment.filename FROM attachment, blob" " WHERE blob.rid=%d" " AND attachment.src=blob.uuid", rid); } if( zFN ){ zMime = mimetype_from_name(zFN); } if( zMime==0 ){ zMime = "application/x-fossil-artifact"; } } content_get(rid, &content); fossil_free(style_csp(1)); cgi_set_content_type(zMime); if( zAttachName ){ cgi_content_disposition_filename(zAttachName); } cgi_set_content(&content); } /* ** Render a hex dump of a file. */ static void hexdump(Blob *pBlob){ |
︙ | ︙ | |||
1927 1928 1929 1930 1931 1932 1933 | @ (%d(rid)):</h2> }else{ @ :</h2> } blob_zero(&downloadName); if( P("verbose")!=0 ) objdescFlags |= OBJDESC_DETAIL; object_description(rid, objdescFlags, 0, &downloadName); | | > | 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 | @ (%d(rid)):</h2> }else{ @ :</h2> } blob_zero(&downloadName); if( P("verbose")!=0 ) objdescFlags |= OBJDESC_DETAIL; object_description(rid, objdescFlags, 0, &downloadName); style_submenu_element("Download", "%R/raw/%s?at=%T", zUuid, blob_str(&downloadName)); @ <hr /> content_get(rid, &content); @ <blockquote><pre> hexdump(&content); @ </pre></blockquote> style_footer(); } |
︙ | ︙ | |||
2256 2257 2258 2259 2260 2261 2262 | } blob_zero(&downloadName); if( asText ) objdescFlags &= ~OBJDESC_BASE; objType = object_description(rid, objdescFlags, (isFile?zName:0), &downloadName); } if( !descOnly && P("download")!=0 ){ | | | > | 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 | } blob_zero(&downloadName); if( asText ) objdescFlags &= ~OBJDESC_BASE; objType = object_description(rid, objdescFlags, (isFile?zName:0), &downloadName); } if( !descOnly && P("download")!=0 ){ cgi_redirectf("%R/raw/%s?at=%T", db_text("x", "SELECT uuid FROM blob WHERE rid=%d", rid), blob_str(&downloadName)); /*NOTREACHED*/ } if( g.perm.Admin ){ const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); if( db_exists("SELECT 1 FROM shun WHERE uuid=%Q", zUuid) ){ style_submenu_element("Unshun", "%s/shun?accept=%s&sub=1#accshun", g.zTop, zUuid); |
︙ | ︙ | |||
2302 2303 2304 2305 2306 2307 2308 | const char *zUser = db_column_text(&q,0); const char *zDate = db_column_text(&q,1); const char *zIp = db_column_text(&q,2); @ <p>Received on %s(zDate) from %h(zUser) at %h(zIp).</p> } db_finalize(&q); } | | | 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 | const char *zUser = db_column_text(&q,0); const char *zDate = db_column_text(&q,1); const char *zIp = db_column_text(&q,2); @ <p>Received on %s(zDate) from %h(zUser) at %h(zIp).</p> } db_finalize(&q); } style_submenu_element("Download", "%R/raw/%s?at=%T", zUuid, zName); if( db_exists("SELECT 1 FROM mlink WHERE fid=%d", rid) ){ style_submenu_element("Check-ins Using", "%R/timeline?n=200&uf=%s", zUuid); } zMime = mimetype_from_name(blob_str(&downloadName)); if( zMime ){ if( fossil_strcmp(zMime, "text/html")==0 ){ if( asText ){ |
︙ | ︙ |