On 12.03.2015 14:19, Bert Huijben wrote:
>
>> -----Original Message-----
>> From: Branko Čibej [mailto:br...@wandisco.com]
>> Sent: donderdag 12 maart 2015 12:06
>> To: dev@subversion.apache.org
>> Subject: Re: svn commit: r1665195 -
>> /subversion/trunk/subversion/libsvn_ra_serf/util.c
>>
>> On 12.03.2015 05:36, Branko Čibej wrote:
>>> On 09.03.2015 12:39, rhuij...@apache.org wrote:
>>>> Author: rhuijben
>>>> Date: Mon Mar  9 11:39:39 2015
>>>> New Revision: 1665195
>>>>
>>>> URL: http://svn.apache.org/r1665195
>>>> Log:
>>>> In ra-serf: stop handling HTTP status 405 'Method forbidden' as a generic
>>>> out of date error. When locking this is the error we get when the resource
>>>> does not exist in HEAD, but in general it tells us that there is an
>>>> authorization problem.
>>>>
>>>> As the lock code has its own http status handling now, we can change
>>>> the error reported from the generic error handling code path.
>>>>
>>>> This should give users that accidentally use anonymous 'http' on a
>>>> server that uses 'https' for authorized operations a much better response,
>>>> than a simple out of date error (with the recommendation to update added
>>>> by their client).
>>>>
>>>> Note that in most cases the detailed error response from the server
>>>> is used instead of this generic error code for just the HTTP status.
>>>>
>>>> * subversion/libsvn_ra_serf/util.c
>>>>   (svn_ra_serf__error_on_status): Tweak generic error for http status 405.
>>>>
>>>> Modified:
>>>>     subversion/trunk/subversion/libsvn_ra_serf/util.c
>>>>
>>>> Modified: subversion/trunk/subversion/libsvn_ra_serf/util.c
>>>> URL:
>> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/util.c
>> ?rev=1665195&r1=1665194&r2=1665195&view=diff
>> ================================================================
>> ==============
>>>> --- subversion/trunk/subversion/libsvn_ra_serf/util.c (original)
>>>> +++ subversion/trunk/subversion/libsvn_ra_serf/util.c Mon Mar  9 11:39:39
>> 2015
>>>> @@ -1762,8 +1762,8 @@ svn_ra_serf__error_on_status(serf_status
>>>>          return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
>>>>                                   _("'%s' path not found"), path);
>>>>        case 405:
>>>> -        return svn_error_createf(SVN_ERR_FS_OUT_OF_DATE, NULL,
>>>> -                                 _("'%s' is out of date"), path);
>>>> +        return svn_error_createf(SVN_ERR_RA_DAV_FORBIDDEN, NULL,
>>>> +                                 _("HTTP method is not allowed on '%s'"), 
>>>> path);
>>>>        case 409:
>>>>          return svn_error_createf(SVN_ERR_FS_CONFLICT, NULL,
>>>>                                   _("'%s' conflicts"), path);
>>> -1, please revert this.
>>>
>>>   * SVN_ERR_RA_DAV_FORBIDDEN is the wrong error code to use here.
>>>     "Forbidden" is 403, not 405; the difference is significant.
>>>   * Far from being a "better response," the new error message is
>>>     arguably more confusing to users than the old one. Most Subversion
>>>     users understand "out of date," but I bet most don't know what an
>>>     HTTP method is.
>>>   * Even if we decided that it's OK to confuse users with the details of
>>>     the HTTP protocol, you'd have to tell them *which* method is not
>>>     allowed.
>> I'm trying to understand how r1666096 makes things better. We're now
>> using SVN_ERR_RA_NOT_IMPLEMENTED to flag a 405 error from the server,
>> which, IMO, is even worse than before: this error code is used by the RA
>> loader when an URL scheme doesn't map to an RA implementation, and in
>> libsvn_client when a particular RA implementation doesn't support an RA
>> API (which should never happen anyway); neither of these have anything
>> whatsoever to do with the 405 HTTP status.
>>
>> Effectively, that commit only addresses my third point.
>>
>> Can we please start by understanding when, exactly, we can receive a 405
>> from the server? I can imagine several scenarios:
>>
>>   * LOCK something not at HEAD (IIUC, this is handled separately);
>>   * Write (PUT, MKCOL, etc.) to a repository on a read-only connection;
>>   * Invalid server configuration (e.g., a missing method in a <Limit>
>>     block);
>>   * Non-conformant proxy between client and server.
> Yes...
>
> And when we receive a 405 from mod_dav, we actually receive a detailed server 
> error, which contains the actual apr code of the backend.
>
> The original error handling was added in the initial development of ra_serf, 
> when the developers were mostly interested in getting the tests running. 
> Instead of fixing that they actually ignored the server generated error (as 
> was very common then), they just handled error 405.
>
> Since then the problem of not detecting the real errors has been fixed, so 
> the only case where we see it now is on servers and proxies that really don't 
> implement this (or other) features... Returning 'out of date' (which is 
> generally only found in detailed server reports), makes libsvn_client's 
> commit processing trigger specific behavior that we never test for, because 
> our server never returns this error.
>
>
> We should at least return something else than out of date... Preferably 
> something that a user reading the error would understand (and doesn't make 
> 'svn' recommend to simply update when you commit to a URL that isn't 
> configured to allow commits, such as currently happens on 
> http://serf.googlecode.com/svn/trunk when you try to commit without rebasing 
> to https)

Is there any reason not to define a new error code for this condition?
Neither ...DAV_FORBIDDEN nor ...RA_NOT_IMPLEMENTED are appropriate.

-- Brane

Reply via email to