Author: cmpilato
Date: Thu Aug 5 20:52:33 2010
New Revision: 982780
URL: http://svn.apache.org/viewvc?rev=982780&view=rev
Log:
On the issue-2779-dev branch: Per dev@ list discussion Now only
recognize HTTP status 301 as a redirect worthy of automatic handling.
But also treat an HTTP 307 status code in the same way that 302 is
treated (with a message back to the user that the repository has been
temporarily relocated).
* subversion/libsvn_ra_neon/ra_neon.h,
* subversion/libsvn_ra_neon/util.c
(svn_ra_neon__request_dispatch): Lose now-unused 'okay_3'
parameter. Callers updated.
(generate_error): Also treat HTTP status 307 as a temporary
redirect.
* subversion/libsvn_ra_neon/commit.c,
* subversion/libsvn_ra_neon/fetch.c,
* subversion/libsvn_ra_neon/lock.c
Update callers of svn_ra_neon__request_dispatch().
* subversion/libsvn_ra_neon/options.c
(svn_ra_neon__exchange_capabilities): Update call to
svn_ra_neon__request_dispatch(), and now only specially handle 301
status codes.
* subversion/libsvn_ra_serf/options.c
(svn_ra_serf__exchange_capabilities): Don't check for the 302 error
code any more -- only 301.
* subversion/libsvn_ra_serf/util.c
(svn_ra_serf__handle_xml_parser, svn_ra_serf__error_on_status): Also
treat HTTP status 307 as a temporary redirect.
* subversion/tests/cmdline/README
Update required httpd.conf configuration.
* subversion/tests/cmdline/svntest/sandbox.py
(Sandbox.redirected_root_url): Add 'temporary' parameter and
handling. Update return URL format.
Modified:
subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/commit.c
subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/fetch.c
subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/lock.c
subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/options.c
subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/ra_neon.h
subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/util.c
subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/options.c
subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/util.c
subversion/branches/issue-2779-dev/subversion/tests/cmdline/README
subversion/branches/issue-2779-dev/subversion/tests/cmdline/svntest/sandbox.py
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/commit.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/commit.c?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/commit.c
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/commit.c Thu
Aug 5 20:52:33 2010
@@ -440,7 +440,6 @@ static svn_error_t * do_checkout(commit_
err = svn_ra_neon__request_dispatch(code, request, extra_headers, body,
201 /* Created */,
allow_404 ? 404 /* Not Found */ : 0,
- 0,
pool);
if (err)
goto cleanup;
@@ -824,7 +823,6 @@ static svn_error_t * commit_delete_entry
err = svn_ra_neon__request_dispatch(&code, request, NULL, body,
204 /* Created */,
404 /* Not Found */,
- 0,
pool);
cleanup:
svn_ra_neon__request_destroy(request);
@@ -1318,7 +1316,6 @@ static svn_error_t * commit_close_file(v
err = svn_ra_neon__request_dispatch(NULL, request, extra_headers, NULL,
201 /* Created */,
204 /* No Content */,
- 0,
pool);
cleanup:
svn_ra_neon__request_destroy(request);
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/fetch.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/fetch.c?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/fetch.c
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/fetch.c Thu
Aug 5 20:52:33 2010
@@ -420,7 +420,6 @@ static svn_error_t *custom_get_request(s
err = svn_ra_neon__request_dispatch(NULL, request, NULL, NULL,
200 /* OK */,
226 /* IM Used */,
- 0,
pool);
svn_ra_neon__request_destroy(request);
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/lock.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/lock.c?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/lock.c
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/lock.c Thu Aug
5 20:52:33 2010
@@ -296,7 +296,7 @@ do_lock(svn_lock_t **lock,
apr_psprintf(req->pool, "%ld", current_rev));
err = svn_ra_neon__request_dispatch(&code, req, extra_headers, body->data,
- 200, 0, 0, pool);
+ 200, 0, pool);
if (err)
goto cleanup;
@@ -545,7 +545,7 @@ svn_ra_neon__get_lock_internal(svn_ra_ne
"text/xml; charset=\"utf-8\"");
err = svn_ra_neon__request_dispatch(NULL, req, extra_headers, body,
- 200, 207, 0, pool);
+ 200, 207, pool);
if (err)
{
err = svn_error_quick_wrap(err, _("Failed to fetch lock information"));
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/options.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/options.c?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/options.c
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/options.c Thu
Aug 5 20:52:33 2010
@@ -285,11 +285,10 @@ svn_ra_neon__exchange_capabilities(svn_r
"</D:options>",
200,
relocation_location ? 301 : 0,
- relocation_location ? 302 : 0,
pool)))
goto cleanup;
- if ((req->code == 301) || (req->code == 302))
+ if (req->code == 301)
{
*relocation_location = svn_ra_neon__request_get_location(req, pool);
goto cleanup;
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/ra_neon.h
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/ra_neon.h?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/ra_neon.h
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/ra_neon.h Thu
Aug 5 20:52:33 2010
@@ -942,10 +942,10 @@ svn_ra_neon__maybe_store_auth_info_after
NULL, as this will cause Neon to generate a "Content-Length: 0"
header (which is important to some proxies).
- OKAY_1, OKAY_2, and OKAY_3 are the "acceptable" result codes.
- Anything other than one of these will generate an error. OKAY_1
- should always be specified (e.g. as 200); use 0 for OKAY_2 and/or
- OKAY_3 if additional result codes aren't allowed. */
+ OKAY_1 and OKAY_2 are the "acceptable" result codes. Anything
+ other than one of these will generate an error. OKAY_1 should
+ always be specified (e.g. as 200); use 0 for OKAY_2 if additional
+ result codes aren't allowed. */
svn_error_t *
svn_ra_neon__request_dispatch(int *code_p,
svn_ra_neon__request_t *request,
@@ -953,7 +953,6 @@ svn_ra_neon__request_dispatch(int *code_
const char *body,
int okay_1,
int okay_2,
- int okay_3,
apr_pool_t *pool);
/* A layer over SVN_RA_NEON__REQUEST_DISPATCH() adding a
@@ -969,8 +968,9 @@ svn_ra_neon__simple_request(int *code,
const char *url,
apr_hash_t *extra_headers,
const char *body,
- int okay_1, int okay_2, apr_pool_t *pool);
-
+ int okay_1,
+ int okay_2,
+ apr_pool_t *pool);
/* Convenience statement macro for setting headers in a hash */
#define svn_ra_neon__set_header(hash, hdr, val) \
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/util.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/util.c?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/util.c
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_neon/util.c Thu Aug
5 20:52:33 2010
@@ -558,6 +558,7 @@ generate_error(svn_ra_neon__request_t *r
case 301:
case 302:
+ case 307:
return svn_error_create
(SVN_ERR_RA_DAV_RELOCATED, NULL,
apr_psprintf(pool,
@@ -1259,13 +1260,10 @@ parsed_request(svn_ra_neon__request_t *r
success_parser, pool));
/* run the request and get the resulting status code. */
- SVN_ERR(svn_ra_neon__request_dispatch(status_code,
- req, extra_headers, body,
- (strcmp(method, "PROPFIND") == 0)
- ? 207 : 200,
- 0, /* not used */
- 0, /* not used */
- pool));
+ SVN_ERR(svn_ra_neon__request_dispatch(
+ status_code, req, extra_headers, body,
+ (strcmp(method, "PROPFIND") == 0) ? 207 : 200,
+ 0, pool));
if (spool_response)
{
@@ -1344,7 +1342,7 @@ svn_ra_neon__simple_request(int *code,
reader. Neon will take care of the Content-Length calculation */
err = svn_ra_neon__request_dispatch(code, req, extra_headers,
body ? body : "",
- okay_1, okay_2, 0, pool);
+ okay_1, okay_2, pool);
svn_ra_neon__request_destroy(req);
return err;
@@ -1430,7 +1428,6 @@ svn_ra_neon__request_dispatch(int *code_
const char *body,
int okay_1,
int okay_2,
- int okay_3,
apr_pool_t *pool)
{
ne_xml_parser *error_parser;
@@ -1493,9 +1490,7 @@ svn_ra_neon__request_dispatch(int *code_
/* If the status code was one of the two that we expected, then go
ahead and return now. IGNORE any marshalled error. */
- if (req->rv == NE_OK && (req->code == okay_1
- || req->code == okay_2
- || req->code == okay_3))
+ if (req->rv == NE_OK && (req->code == okay_1 || req->code == okay_2))
return SVN_NO_ERROR;
/* Any other errors? Report them */
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/options.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/options.c?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/options.c
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/options.c Thu
Aug 5 20:52:33 2010
@@ -493,8 +493,7 @@ svn_ra_serf__exchange_capabilities(svn_r
carries such a thing, report as much. We'll disregard ERR --
it's most likely just a complaint about the response body not
successfully parsing as XML or somesuch. */
- if (corrected_url && ((opt_ctx->status_code == 301) ||
- (opt_ctx->status_code == 302)))
+ if (corrected_url && (opt_ctx->status_code == 301))
{
svn_error_clear(err);
*corrected_url = opt_ctx->parser_ctx->location;
Modified: subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/util.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/util.c?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/util.c
(original)
+++ subversion/branches/issue-2779-dev/subversion/libsvn_ra_serf/util.c Thu Aug
5 20:52:33 2010
@@ -1169,7 +1169,7 @@ svn_ra_serf__handle_xml_parser(serf_requ
*ctx->status_code = sl.code;
}
- if (sl.code == 301 || sl.code == 302)
+ if (sl.code == 301 || sl.code == 302 || sl.code == 307)
{
ctx->location = svn_ra_serf__response_get_location(response, pool);
}
@@ -1418,13 +1418,22 @@ handle_response(serf_request_t *request,
/* Cases where a lack of a response body (via EOF) is okay:
* - A HEAD request
- * - 204/304 response
+ * - responses with the following status codes:
+ * 204, 301, 302, 304, 307, 401, 407
*
* Otherwise, if we get an EOF here, something went really wrong: either
* the server closed on us early or we're reading too much. Either way,
* scream loudly.
*/
- if (strcmp(ctx->method, "HEAD") != 0 && sl.code != 204 && sl.code != 304)
+ if (strcmp(ctx->method, "HEAD") != 0
+ && sl.code != 204
+ && sl.code != 301
+ && sl.code != 302
+ && sl.code != 304
+ && sl.code != 307
+ && sl.code != 401
+ && sl.code != 407
+ )
{
svn_error_t *err =
svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA,
@@ -1855,6 +1864,7 @@ svn_ra_serf__error_on_status(int status_
{
case 301:
case 302:
+ case 307:
return svn_error_createf(SVN_ERR_RA_DAV_RELOCATED, NULL,
(status_code == 301)
? _("Repository moved permanently to '%s';"
Modified: subversion/branches/issue-2779-dev/subversion/tests/cmdline/README
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/tests/cmdline/README?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
--- subversion/branches/issue-2779-dev/subversion/tests/cmdline/README
(original)
+++ subversion/branches/issue-2779-dev/subversion/tests/cmdline/README Thu Aug
5 20:52:33 2010
@@ -72,7 +72,7 @@ paths adjusted appropriately:
AuthUserFile /usr/local/apache2/conf/users
Require valid-user
</Location>
-
+
<Location /svn-test-work/local_tmp/repos>
DAV svn
SVNPath
/home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp/repos
@@ -83,7 +83,8 @@ paths adjusted appropriately:
Require valid-user
</Location>
- RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-(.*)$
/svn-test-work/repositories/$1
+ RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)$
/svn-test-work/repositories/$1
+ RedirectMatch ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)$
/svn-test-work/repositories/$1
Httpd should be running on port 80. You may also need to ensure that
it's running as you, so it has read/write access to the repositories
Modified:
subversion/branches/issue-2779-dev/subversion/tests/cmdline/svntest/sandbox.py
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-2779-dev/subversion/tests/cmdline/svntest/sandbox.py?rev=982780&r1=982779&r2=982780&view=diff
==============================================================================
---
subversion/branches/issue-2779-dev/subversion/tests/cmdline/svntest/sandbox.py
(original)
+++
subversion/branches/issue-2779-dev/subversion/tests/cmdline/svntest/sandbox.py
Thu Aug 5 20:52:33 2010
@@ -167,13 +167,18 @@ class Sandbox:
wc_dir = self.wc_dir
return os.path.join(wc_dir, svntest.wc.to_ospath(relpath))
- def redirected_root_url(self):
- """Return the URL which should be configured to redirect to the root
- of this repository."""
+ def redirected_root_url(self, temporary=False):
+ """If TEMPORARY is set, return the URL which should be configured
+ to temporarily redirect to the root of this repository;
+ otherwise, return the URL which should be configured to
+ permanent redirect there. (Assumes that the sandbox is not
+ read-only.)"""
assert not self.read_only
assert self.repo_url.startswith("http")
parts = self.repo_url.rsplit('/', 1)
- return parts[0] + '/REDIRECT-' + parts[1]
+ return '%s/REDIRECT-%s-%s' % (parts[0],
+ temporary and 'TEMP' or 'PERM',
+ parts[1])
def simple_commit(self, target=None):
assert not self.read_only