Correct Content-Type header values for archive downloads.
The content type for both .tar.gz and .tar.bz2 downloads was
application/x-tar, which is correct for .tar files when no
Content-Encoding is present, but is not correct for .tar.gz and .tar.bz2
files unless Content-Encoding is set to gzip or x-bzip2, respectively.
However, setting Content-Encoding causes browsers to undo that encoding
during download, when a .gz or .bz2 file is usually the desired
artifact. Omitting the Content-Encoding header is preferred to avoid
having browsers uncompress non-render-able files.
Additionally, the Content-Disposition line indicates a final desired
filename with .tar.gz or .tar.bz2 extension which makes providing a
Content-Encoding header inappropriate.
With the current configuration browsers (Chrome and Firefox thus far)
are registering the application/x-tar Content-Type and not .tar
extension and appending that extension, yielding filename.tar.gz.tar as
a final on-disk artifact. This was originally reported here:
http://stackoverflow.com/questions/3753659
I've changed the .tar.gz and .tar.bz2 Content-Type values to
application/x-gzip and application/x-bzip2, respectively. Which yields
correctly named download artifacts on Firefox, Chrome, and IE.
adding a
adding b
adding d
adding c
% should give a 404 - file does not exist
404 Not Found
error: bork@8580ff50825a: not found in manifest
% should succeed
200 Script output follows
/a/
/b/
200 Script output follows
a
200 Script output follows
b
% should give a 404 - repo is not published
404 Not Found
error: repository c not found
% atom-log without basedir
<link rel="self" href="http://example.com:8080/a/atom-log"/>
<link rel="alternate" href="http://example.com:8080/a/"/>
<link href="http://example.com:8080/a/rev/8580ff50825a"/>
% rss-log without basedir
<guid isPermaLink="true">http://example.com:8080/a/rev/8580ff50825a</guid>
% should succeed, slashy names
200 Script output follows
/t/a/
/b/
/coll/a/
/coll/a/.hg/patches/
/coll/b/
/coll/c/
/rcoll/a/
/rcoll/a/.hg/patches/
/rcoll/b/
/rcoll/b/d/
/rcoll/c/
/star/webdir/a/
/star/webdir/a/.hg/patches/
/star/webdir/b/
/star/webdir/c/
/starstar/webdir/a/
/starstar/webdir/a/.hg/patches/
/starstar/webdir/b/
/starstar/webdir/b/d/
/starstar/webdir/c/
200 Script output follows
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<link rel="icon" href="/static/hgicon.png" type="image/png" />
<meta name="robots" content="index, nofollow" />
<link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
<title>Mercurial repositories index</title>
</head>
<body>
<div class="container">
<div class="menu">
<a href="http://mercurial.selenic.com/">
<img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
</div>
<div class="main">
<h2>Mercurial Repositories</h2>
<table class="bigtable">
<tr>
<th><a href="?sort=name">Name</a></th>
<th><a href="?sort=description">Description</a></th>
<th><a href="?sort=contact">Contact</a></th>
<th><a href="?sort=lastchange">Last modified</a></th>
<th> </th>
</tr>
<tr class="parity0">
<td><a href="/t/a/?style=paper">t/a</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/b/?style=paper">b</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/coll/a/?style=paper">coll/a</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/coll/b/?style=paper">coll/b</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/coll/c/?style=paper">coll/c</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/star/webdir/a/?style=paper">star/webdir/a</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/star/webdir/a/.hg/patches/?style=paper">star/webdir/a/.hg/patches</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/star/webdir/b/?style=paper">star/webdir/b</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/star/webdir/c/?style=paper">star/webdir/c</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/starstar/webdir/a/?style=paper">starstar/webdir/a</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/starstar/webdir/a/.hg/patches/?style=paper">starstar/webdir/a/.hg/patches</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/starstar/webdir/b/?style=paper">starstar/webdir/b</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/starstar/webdir/b/d/?style=paper">starstar/webdir/b/d</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/starstar/webdir/c/?style=paper">starstar/webdir/c</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
</table>
</div>
</div>
</body>
</html>
200 Script output follows
/t/a/
200 Script output follows
/t/a/
200 Script output follows
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<link rel="icon" href="/static/hgicon.png" type="image/png" />
<meta name="robots" content="index, nofollow" />
<link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
<title>Mercurial repositories index</title>
</head>
<body>
<div class="container">
<div class="menu">
<a href="http://mercurial.selenic.com/">
<img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
</div>
<div class="main">
<h2>Mercurial Repositories</h2>
<table class="bigtable">
<tr>
<th><a href="?sort=name">Name</a></th>
<th><a href="?sort=description">Description</a></th>
<th><a href="?sort=contact">Contact</a></th>
<th><a href="?sort=lastchange">Last modified</a></th>
<th> </th>
</tr>
<tr class="parity0">
<td><a href="/t/a/?style=paper">a</a></td>
<td>unknown</td>
<td>Foo Bar <foo.bar@example.com></td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
</table>
</div>
</div>
</body>
</html>
200 Script output follows
<?xml version="1.0" encoding="ascii"?>
<feed xmlns="http://127.0.0.1/2005/Atom">
<!-- Changelog -->
<id>http://127.0.0.1/t/a/</id>
<link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
<link rel="alternate" href="http://127.0.0.1/t/a/"/>
<title>t/a Changelog</title>
<updated>1970-01-01T00:00:01+00:00</updated>
<entry>
<title>a</title>
<id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
<link href="http://127.0.0.1/t/a/rev/8580ff50825a"/>
<author>
<name>test</name>
<email>test</email>
</author>
<updated>1970-01-01T00:00:01+00:00</updated>
<published>1970-01-01T00:00:01+00:00</published>
<content type="xhtml">
<div xmlns="http://127.0.0.1/1999/xhtml">
<pre xml:space="preserve">a</pre>
</div>
</content>
</entry>
</feed>
200 Script output follows
<?xml version="1.0" encoding="ascii"?>
<feed xmlns="http://127.0.0.1/2005/Atom">
<!-- Changelog -->
<id>http://127.0.0.1/t/a/</id>
<link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
<link rel="alternate" href="http://127.0.0.1/t/a/"/>
<title>t/a Changelog</title>
<updated>1970-01-01T00:00:01+00:00</updated>
<entry>
<title>a</title>
<id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
<link href="http://127.0.0.1/t/a/rev/8580ff50825a"/>
<author>
<name>test</name>
<email>test</email>
</author>
<updated>1970-01-01T00:00:01+00:00</updated>
<published>1970-01-01T00:00:01+00:00</published>
<content type="xhtml">
<div xmlns="http://127.0.0.1/1999/xhtml">
<pre xml:space="preserve">a</pre>
</div>
</content>
</entry>
</feed>
200 Script output follows
a
200 Script output follows
/coll/a/
/coll/a/.hg/patches/
/coll/b/
/coll/c/
200 Script output follows
a
200 Script output follows
/rcoll/a/
/rcoll/a/.hg/patches/
/rcoll/b/
/rcoll/b/d/
/rcoll/c/
200 Script output follows
d
% test descend = False
200 Script output follows
/c/
200 Script output follows
/t/a/
/t/b/
% test inexistent and inaccessible repo should be ignored silently
200 Script output follows
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<link rel="icon" href="/static/hgicon.png" type="image/png" />
<meta name="robots" content="index, nofollow" />
<link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
<title>Mercurial repositories index</title>
</head>
<body>
<div class="container">
<div class="menu">
<a href="http://mercurial.selenic.com/">
<img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
</div>
<div class="main">
<h2>Mercurial Repositories</h2>
<table class="bigtable">
<tr>
<th><a href="?sort=name">Name</a></th>
<th><a href="?sort=description">Description</a></th>
<th><a href="?sort=contact">Contact</a></th>
<th><a href="?sort=lastchange">Last modified</a></th>
<th> </th>
</tr>
</table>
</div>
</div>
</body>
</html>
% collections: should succeed
200 Script output follows
/a/
/a/.hg/patches/
/b/
/c/
200 Script output follows
a
200 Script output follows
b
200 Script output follows
c
% atom-log with basedir /
<link rel="self" href="http://example.com:8080/a/atom-log"/>
<link rel="alternate" href="http://example.com:8080/a/"/>
<link href="http://example.com:8080/a/rev/8580ff50825a"/>
% rss-log with basedir /
<guid isPermaLink="true">http://example.com:8080/a/rev/8580ff50825a</guid>
% atom-log with basedir /foo/
<link rel="self" href="http://example.com:8080/foo/a/atom-log"/>
<link rel="alternate" href="http://example.com:8080/foo/a/"/>
<link href="http://example.com:8080/foo/a/rev/8580ff50825a"/>
% rss-log with basedir /foo/
<guid isPermaLink="true">http://example.com:8080/foo/a/rev/8580ff50825a</guid>
% paths errors 1
% paths errors 2
% paths errors 3
% collections errors
% collections errors 2