hello all,
with my particular application of subversion, i find it advantageous
to have the mime types of the resources divined by apache, should
they not be explicitly set by svn:mime-type. however, mod_mime
returns DECLINED unless there is an r->filename present. the technique
i used was to first modify mod_dav_svn's repos.c, then create a
mod_perl header parser handler to supplant the bogus filename. the
filename can be anything, as long as it ends with the name of the
resource, as mod_mime does on actual operations on any files, but
simply parses the extensions out of the name. now, there are security
implications of passing in a path that stands the chance of actually
existing elsewhere on the filesystem, so i took the original value
(at this stage, the value of the <Location> block from which the
dav module was invoked) and concatenated it to r->uri with a !, as
i've seen occur elsewhere in svn code.
the only caveat i can see would revolve around other handlers relying
on the contents of r->filename between the header parser and content
phases (e.g. mod_negotiation and MultiViews, as i found when i first
set this up). unless it is a cardinal no-no to either a) have
subversion implicitly supply correct mime-type information for
non-collection resources or b) set a bogus r->filename in a handler,
i'd be inclined to redo the header parser in c and submit a patch
upstream.
cheers,
dorian
###
the minor patch to repos.c:
--- subversion/mod_dav_svn/repos.c.orig Wed Aug 11 14:25:30 2004
+++ subversion/mod_dav_svn/repos.c Wed Aug 11 14:56:54 2004
@@ -1866,7 +1866,11 @@
"could not fetch the resource's MIME type",
resource->pool);
- mimetype = value ? value->data : "text/plain";
+ /* if we do not have an svn:mime-type, only set text/plain
+ if there isn't already something in the header */
+
+ mimetype = value ? value->data :
+ (r->content_type ? r->content_type : "text/plain");
serr = svn_mime_type_validate (mimetype, resource->pool);
if (serr)
###
the q&d mod_perl module:
###
package MyApache::SVN::HeaderParser;
use 5.008;
use strict;
use warnings;
use Apache::RequestRec ();
use Apache::RequestUtil ();
use Apache::Log ();
use Apache::Const -compile => qw(OK DECLINED);
use APR::Table ();
our @ISA = qw();
our $VERSION = '0.01';
sub handler {
my $r = shift;
return Apache::DECLINED if ($r->notes->get(__PACKAGE__ . '::seen'));
$r->log->debug(sprintf('before: %s', $r->filename));
$r->filename(sprintf('%s/!%s', $r->filename , $r->uri));
$r->log->debug(sprintf('after: %s', $r->filename));
$r->notes->set(__PACKAGE__ . '::seen', 1);
return Apache::OK;
}
1;
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Thu Aug 12 19:30:33 2004