[rfc] Handling redirects properly.

Martin Pool mbp at canonical.com
Thu Jul 20 23:56:14 BST 2006

On 20 Jul 2006, John Arbash Meinel <john at arbash-meinel.com> wrote:
> > If we get a redirection at some later point the error will be uncaught
> > and terminate bzr.  We don't really expect to get redirections, but
> > still it would seem nice if the default behaviour is to just follow
> > them.
> I think we could enable direct redirect handling for everything but the
> when we know that we will catch the exception.


> I think the easiest way to retain the most functionality, while still
> being nice for http redirects is to update 'Transport.get()' so that it
> can take a 'follow_redirects' parameter, which would default to True.
> The api can be defined so that it is a hint, rather than a required command.
> And then for HTTP if that flag is set, it follows just like it does now.
> And the only caller who sets it to false is
> BzrDir.open/open_containing_from_transport

That sounds good.

> Now for handling the full url issue for redirects I was thinking to do:
> try:
>   find_format(a_transport)
> except RedirectRequested, e:
>   relpath = a_transport.relpath(e.old_url)
>   assert e.new_url.endswith(relpath)
>   new_base_url = e.new_url[:-len(relpath)]
> I'll have to see if all my indexes are right. But that is the basic idea.

That sounds fine too.

What I was suggesting is that this idea of "fetch this file, and if it
redirects adjust the url" can usefully be separated from opening the

> Now, instead of doing the assert, we *could* just retry the request with
> 'follow_redirects=True', and just keep trying. However, if someone is
> redirecting '.bzr/branch-format' to 'index.html', we have a serious
> error. I would rather raise some sort of InvalidRedirectRequested.

OK, so not actually an assert but rather if/raise.  I agree.

> People seem generally positive about my idea, so I'll probably look into
> doing it.

I am for one.


More information about the bazaar mailing list