On Aug 12, 2010, at 11:12 AM, Hyrum K. Wright wrote:
> On Thu, Aug 12, 2010 at 11:07 AM, C. Michael Pilato <[email protected]>
> wrote:
>> On 08/12/2010 12:04 PM, Loren Cahlander wrote:
>>> Hello there,
>>>
>>> I am trying to make a change to mod_dav_svn on my server and need to get
>>> a value out of the HTTP headers. I have not developed in C in quite a
>>> while and would appreciate any help by pointing me in the right
>>> direction. I can take it from there, but I do need some help.
>>
>> Apache passes around the request structure (often just called 'r'), and
>> inside that is a table called 'headers_in'. Grep for 'r->headers_in' in,
>> say, subversion/mod_dav_svn/repos.c.
>
> I know next-to-nothing about mod_dav_svn, but why would an Apache
> request appear in libsvn_repos? I thought all that stuff was handled
> higher up, and libsvn_repos was ra-agnostic.
>
> -Hyrum
I am trying to make a hack in mod_dav_svn to get some additional headers from a
HTTP put.
I have the following XQuery code:
declare function http:put-basic-auth($url, $content, $username, $password,
$header) as node(){
let $credentials := concat($username, ':', $password)
let $encode := util:base64-encode($credentials)
let $value := concat('Basic ', $encode)
let $headers :=
<headers>
{$header//header}
<header name="Authorization" value="{$value}"/>
</headers>
let $response := httpclient:put($url, $content, false(), $headers)
return $response
};
Where $header will contain:
<headers>
<header name="X-SVN-Log" value="This is the commit log message"/>
<header name="X-SVN-User" value="fred"/>
</headers>
I want to change the following function in subversion/mod_dav_svn/version.c to
get those two headers values and set the values for SVN_PROP_REVISION_LOG and
SVN_PROP_REVISION_AUTHOR. Is there a simple way to get the request_rec
structure from the svn_fs_txn_t or apr_pool_t structures? Another thing that
might help is where is the entry into mod_dav_svn for a HTTP PUT request?
svn_error_t *
dav_svn__attach_auto_revprops(svn_fs_txn_t *txn,
const char *fs_path,
apr_pool_t *pool)
{
const char *logmsg;
svn_string_t *logval;
svn_error_t *serr;
logmsg = apr_psprintf(pool,
"Autoversioning commit: a non-deltaV client made "
"a change to\n%s", fs_path);
logval = svn_string_create(logmsg, pool);
if ((serr = svn_repos_fs_change_txn_prop(txn, SVN_PROP_REVISION_LOG, logval,
pool)))
return serr;
/* Notate that this revision was created by autoversioning. (Tools
like post-commit email scripts might not care to send an email
for every autoversioning change.) */
if ((serr = svn_repos_fs_change_txn_prop(txn,
SVN_PROP_REVISION_AUTOVERSIONED,
svn_string_create("*", pool),
pool)))
return serr;
return SVN_NO_ERROR;
}
I thank you for replying to me. I will keep code diving until I find the
solution.