HTTP 403 during svn transport probe causes bzr to give up entirely

Bug #399942 reported by Samuel Bronson
10
This bug affects 2 people
Affects Status Importance Assigned to Milestone
Bazaar Subversion Plugin
Fix Released
Undecided
Jelmer Vernooij

Bug Description

Using a highly experimental patch (i.e. I just put it together a few minutes ago for this very bug) to use cgitb for tracebacks, I get this:

naesten@hydrogen:~/.emacs/dvc% ~/hacking/bzr.dev/bzr -Derror pull
Unable to load plugin 'gtk'. It requested API version (1, 15, 0) of module <module 'bzrlib' from '/home/naesten/hacking/bzr.dev/bzrlib/__init__.pyc'> but the minimum exported version is (1, 17, 0), and the maximum is (1, 18, 0)
Using saved parent location: http://bzr.xsteve.at/dvc/
bzr: ERROR: bzrlib.errors.TransportError: Transport error: Server refuses to fulfill the request (403 Forbidden) for http://bzr.xsteve.at/dvc/

<class 'bzrlib.errors.TransportError'>
Python 2.5.4: /usr/bin/python
Wed Jul 15 16:23:06 2009

A problem occurred in a Python script. Here is the sequence of
function calls leading up to the error, in the order they occurred.

 /home/naesten/hacking/bzr.dev/bzrlib/commands.py in exception_to_return_code(the_callable=<function run_bzr at 0xb79df41c>, *args=([u'-Derror', u'pull'],), **kwargs={})
  833 """
  834 try:
  835 return the_callable(*args, **kwargs)
  836 except (KeyboardInterrupt, Exception), e:
  837 # used to handle AssertionError and KeyboardInterrupt
the_callable = <function run_bzr at 0xb79df41c>
args = ([u'-Derror', u'pull'],)
kwargs = {}

 /home/naesten/hacking/bzr.dev/bzrlib/commands.py in run_bzr(argv=[])
 1028 ret = apply_coveraged(opt_coverage_dir, run, *run_argv)
 1029 else:
 1030 ret = run(*run_argv)
 1031 if 'memory' in debug.debug_flags:
 1032 trace.debug_memory('Process status after command:', short=False)
ret undefined
run = <bound method cmd_pull.run_argv_aliases of <bzrlib.builtins.cmd_pull object at 0xb78c3bec>>
run_argv = [[], None]

 /home/naesten/hacking/bzr.dev/bzrlib/commands.py in run_argv_aliases(self=<bzrlib.builtins.cmd_pull object at 0xb78c3bec>, argv=[], alias_argv=None)
  645 self._setup_outf()
  646
  647 return self.run(**all_cmd_args)
  648
  649 def run(self):
self = <bzrlib.builtins.cmd_pull object at 0xb78c3bec>
self.run = <bound method cmd_pull.run of <bzrlib.builtins.cmd_pull object at 0xb78c3bec>>
all_cmd_args = {'verbose': False}

 /home/naesten/hacking/bzr.dev/bzrlib/builtins.py in run(self=<bzrlib.builtins.cmd_pull object at 0xb78c3bec>, location=u'http://bzr.xsteve.at/dvc/', remember=False, overwrite=False, revision=None, verbose=False, directory=u'.', local=False)
  991 else:
  992 branch_from = Branch.open(location,
  993 possible_transports=possible_transports)
  994
  995 if branch_to.get_parent() is None or remember:
possible_transports = [<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>]

 /home/naesten/hacking/bzr.dev/bzrlib/branch.py in open(base=u'http://bzr.xsteve.at/dvc/', _unsupported=False, possible_transports=[<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>])
  157 """
  158 control = bzrdir.BzrDir.open(base, _unsupported,
  159 possible_transports=possible_transports)
  160 return control.open_branch(_unsupported)
  161
possible_transports = [<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>]

 /home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py in open(base=u'http://bzr.xsteve.at/dvc/', _unsupported=False, possible_transports=[<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>])
  834 """
  835 t = get_transport(base, possible_transports=possible_transports)
  836 return BzrDir.open_from_transport(t, _unsupported=_unsupported)
  837
  838 @staticmethod
global BzrDir = <class 'bzrlib.bzrdir.BzrDir'>
BzrDir.open_from_transport = <function open_from_transport at 0xb78345dc>
t = <bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>
_unsupported = False

 /home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py in open_from_transport(transport=<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>, _unsupported=False, _server_formats=True)
  864 transport, format = do_catching_redirections(find_format,
  865 transport,
  866 redirected)
  867 except errors.TooManyRedirections:
  868 raise errors.NotBranchError(base)
redirected = <function redirected at 0x945625c>

 /home/naesten/hacking/bzr.dev/bzrlib/transport/__init__.py in do_catching_redirections(action=<function find_format at 0x9456294>, transport=<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>, redirected=<function redirected at 0x945625c>)
 1640 for redirections in range(MAX_REDIRECTIONS):
 1641 try:
 1642 return action(transport)
 1643 except errors.RedirectRequested, e:
 1644 redirection_notice = '%s is%s redirected to %s' % (
action = <function find_format at 0x9456294>
transport = <bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>

 /home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py in find_format(transport=<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>)
  851 def find_format(transport):
  852 return transport, BzrDirFormat.find_format(
  853 transport, _server_formats=_server_formats)
  854
  855 def redirected(transport, e, redirection_notice):
transport = <bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>
_server_formats = True

 /home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py in find_format(klass=<class 'bzrlib.bzrdir.BzrDirFormat'>, transport=<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>, _server_formats=True)
 1782 for format in formats:
 1783 try:
 1784 return format.probe_transport(transport)
 1785 except errors.NotBranchError:
 1786 # this format does not find a control dir here.
format = <class 'bzrlib.plugins.svn.format.SvnRemoteFormat'>
format.probe_transport = <bound method type.probe_transport of <class 'bzrlib.plugins.svn.format.SvnRemoteFormat'>>
transport = <bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>

 /home/naesten/.bazaar/plugins/svn/format.py in probe_transport(klass=<class 'bzrlib.plugins.svn.format.SvnRemoteFormat'>, transport=<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>)
  107 import subvertpy
  108 try:
  109 transport = get_svn_ra_transport(transport)
  110 except subvertpy.SubversionException, (msg, num):
  111 if num == subvertpy.ERR_RA_DAV_NOT_VCC:
transport = <bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>
get_svn_ra_transport = <function get_svn_ra_transport at 0x961a5dc>

 /home/naesten/.bazaar/plugins/svn/transport.py in get_svn_ra_transport(bzr_transport=<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>)
  101 req = Request('OPTIONS', url, accepted_errors=[200])
  102 req.follow_redirections = True
  103 resp = bzr_transport._perform(req)
  104 dav_entries = list(itertools.chain(*[entry.split(",") for entry in resp.headers.getheaders('DAV')]))
  105 if not "version-control" in dav_entries:
resp undefined
bzr_transport = <bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>
bzr_transport._perform = <bound method HttpTransport_urllib._perform of <...pTransport_urllib url=http://bzr.xsteve.at/dvc/>>
req = <bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>

 /home/naesten/hacking/bzr.dev/bzrlib/transport/http/_urllib.py in _perform(self=<bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>, request=<bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>)
   77 print 'perform: %s base: %s, url: %s' % (request.method, self.base,
   78 request.get_full_url())
   79 response = self._opener.open(request)
   80 if self._get_connection() is not request.connection:
   81 # First connection or reconnection
response undefined
self = <bzrlib.transport.http._urllib.HttpTransport_urllib url=http://bzr.xsteve.at/dvc/>
self._opener = <bzrlib.transport.http._urllib2_wrappers.Opener object at 0x94ddf8c>
self._opener.open = <bound method OpenerDirector.open of <urllib2.OpenerDirector instance at 0x94e7b6c>>
request = <bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>

 /usr/lib/python2.5/urllib2.py in open(self=<urllib2.OpenerDirector instance at 0x94e7b6c>, fullurl=<bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>, data=None)
  385 for processor in self.process_response.get(protocol, []):
  386 meth = getattr(processor, meth_name)
  387 response = meth(req, response)
  388
  389 return response
response = <addinfourl at 157424076 whose fp = <socket._fileobject object at 0x961fc6c>>
meth = <bound method HTTPErrorProcessor.http_response o...appers.HTTPErrorProcessor instance at 0x94e7dcc>>
req = <bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>

 /home/naesten/hacking/bzr.dev/bzrlib/transport/http/_urllib2_wrappers.py in http_response(self=<bzrlib.transport.http._urllib2_wrappers.HTTPErrorProcessor instance at 0x94e7dcc>, request=<bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>, response=<addinfourl at 157424076 whose fp = <socket._fileobject object at 0x961fc6c>>)
 1529 if code not in accepted_errors:
 1530 response = self.parent.error('http', request, response,
 1531 code, msg, hdrs)
 1532 return response
 1533
code = 403
msg = 'Forbidden'
hdrs = <httplib.HTTPMessage instance at 0x962190c>

 /usr/lib/python2.5/urllib2.py in error(self=<urllib2.OpenerDirector instance at 0x94e7b6c>, proto=403, *args=({301: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 302: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 303: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 307: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 401: [<bzrlib.transport.http._urllib2_wrappers.HTTPNegotiateAuthHandler instance at 0x94e7aec>, <bzrlib.transport.http._urllib2_wrappers.HTTPDigestAuthHandler instance at 0x94e7aac>, <bzrlib.transport.http._urllib2_wrappers.HTTPBasicAuthHandler instance at 0x94e7acc>], 407: [<bzrlib.transport.http._urllib2_wrappers.ProxyNegotiateAuthHandler instance at 0x94e7b4c>, <bzrlib.transport.http._urllib2_wrappers.ProxyDigestAuthHandler instance at 0x94e7b2c>, <bzrlib.transport.http._urllib2_wrappers.ProxyBasicAuthHandler instance at 0x94e7b0c>], 'default': [<bzrlib.transport.http._urllib2_wrappers.HTTPDefaultErrorHandler instance at 0x94e7e8c>]}, 'default', 'http_error_default', <bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>, <addinfourl at 157424076 whose fp = <socket._fileobject object at 0x961fc6c>>, 403, 'Forbidden', <httplib.HTTPMessage instance at 0x962190c>))
  423 if http_err:
  424 args = (dict, 'default', 'http_error_default') + orig_args
  425 return self._call_chain(*args)
  426
  427 # XXX probably also want an abstract factory that knows when it makes
self = <urllib2.OpenerDirector instance at 0x94e7b6c>
self._call_chain = <bound method OpenerDirector._call_chain of <urllib2.OpenerDirector instance at 0x94e7b6c>>
args = ({301: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 302: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 303: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 307: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 401: [<bzrlib.transport.http._urllib2_wrappers.HTTPNegotiateAuthHandler instance at 0x94e7aec>, <bzrlib.transport.http._urllib2_wrappers.HTTPDigestAuthHandler instance at 0x94e7aac>, <bzrlib.transport.http._urllib2_wrappers.HTTPBasicAuthHandler instance at 0x94e7acc>], 407: [<bzrlib.transport.http._urllib2_wrappers.ProxyNegotiateAuthHandler instance at 0x94e7b4c>, <bzrlib.transport.http._urllib2_wrappers.ProxyDigestAuthHandler instance at 0x94e7b2c>, <bzrlib.transport.http._urllib2_wrappers.ProxyBasicAuthHandler instance at 0x94e7b0c>], 'default': [<bzrlib.transport.http._urllib2_wrappers.HTTPDefaultErrorHandler instance at 0x94e7e8c>]}, 'default', 'http_error_default', <bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>, <addinfourl at 157424076 whose fp = <socket._fileobject object at 0x961fc6c>>, 403, 'Forbidden', <httplib.HTTPMessage instance at 0x962190c>)

 /usr/lib/python2.5/urllib2.py in _call_chain(self=<urllib2.OpenerDirector instance at 0x94e7b6c>, chain={301: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 302: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 303: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 307: [<bzrlib.transport.http._urllib2_wrappers.HTTPRedirectHandler instance at 0x94e7d8c>], 401: [<bzrlib.transport.http._urllib2_wrappers.HTTPNegotiateAuthHandler instance at 0x94e7aec>, <bzrlib.transport.http._urllib2_wrappers.HTTPDigestAuthHandler instance at 0x94e7aac>, <bzrlib.transport.http._urllib2_wrappers.HTTPBasicAuthHandler instance at 0x94e7acc>], 407: [<bzrlib.transport.http._urllib2_wrappers.ProxyNegotiateAuthHandler instance at 0x94e7b4c>, <bzrlib.transport.http._urllib2_wrappers.ProxyDigestAuthHandler instance at 0x94e7b2c>, <bzrlib.transport.http._urllib2_wrappers.ProxyBasicAuthHandler instance at 0x94e7b0c>], 'default': [<bzrlib.transport.http._urllib2_wrappers.HTTPDefaultErrorHandler instance at 0x94e7e8c>]}, kind='default', meth_name='http_error_default', *args=(<bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>, <addinfourl at 157424076 whose fp = <socket._fileobject object at 0x961fc6c>>, 403, 'Forbidden', <httplib.HTTPMessage instance at 0x962190c>))
  358 func = getattr(handler, meth_name)
  359
  360 result = func(*args)
  361 if result is not None:
  362 return result
result undefined
func = <bound method HTTPDefaultErrorHandler.http_error...s.HTTPDefaultErrorHandler instance at 0x94e7e8c>>
args = (<bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>, <addinfourl at 157424076 whose fp = <socket._fileobject object at 0x961fc6c>>, 403, 'Forbidden', <httplib.HTTPMessage instance at 0x962190c>)

 /home/naesten/hacking/bzr.dev/bzrlib/transport/http/_urllib2_wrappers.py in http_error_default(self=<bzrlib.transport.http._urllib2_wrappers.HTTPDefaultErrorHandler instance at 0x94e7e8c>, req=<bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>, fp=<addinfourl at 157424076 whose fp = <socket._fileobject object at 0x961fc6c>>, code=403, msg='Forbidden', hdrs=<httplib.HTTPMessage instance at 0x962190c>)
 1542 raise errors.TransportError(
 1543 'Server refuses to fulfill the request (403 Forbidden)'
 1544 ' for %s' % req.get_full_url())
 1545 else:
 1546 raise errors.InvalidHttpResponse(req.get_full_url(),
req = <bzrlib.transport.http._urllib2_wrappers.Request instance at 0x961424c>
req.get_full_url = <bound method Request.get_full_url of <bzrlib.tr..._urllib2_wrappers.Request instance at 0x961424c>>
<class 'bzrlib.errors.TransportError'>: Transport error: Server refuses to fulfill the request (403 Forbidden) for http://bzr.xsteve.at/dvc/
    __class__ = <class 'bzrlib.errors.TransportError'>
    __delattr__ = <method-wrapper '__delattr__' of TransportError object at 0x961bd9c>
    __dict__ = {'_preformatted_string': None, 'msg': 'Server refuses to fulfill the request (403 Forbidden) for http://bzr.xsteve.at/dvc/', 'orig_error': ''}
    __doc__ = None
    __eq__ = <bound method TransportError.__eq__ of Transport... (403 Forbidden) for http://bzr.xsteve.at/dvc/ )>
    __getattribute__ = <method-wrapper '__getattribute__' of TransportError object at 0x961bd9c>
    __getitem__ = <method-wrapper '__getitem__' of TransportError object at 0x961bd9c>
    __getslice__ = <method-wrapper '__getslice__' of TransportError object at 0x961bd9c>
    __hash__ = <method-wrapper '__hash__' of TransportError object at 0x961bd9c>
    __init__ = <bound method TransportError.__init__ of Transpo... (403 Forbidden) for http://bzr.xsteve.at/dvc/ )>
    __module__ = 'bzrlib.errors'
    __new__ = <built-in method __new__ of type object at 0x8144400>
    __reduce__ = <built-in method __reduce__ of TransportError object at 0x961bd9c>
    __reduce_ex__ = <built-in method __reduce_ex__ of TransportError object at 0x961bd9c>
    __repr__ = <bound method TransportError.__repr__ of Transpo... (403 Forbidden) for http://bzr.xsteve.at/dvc/ )>
    __setattr__ = <method-wrapper '__setattr__' of TransportError object at 0x961bd9c>
    __setstate__ = <built-in method __setstate__ of TransportError object at 0x961bd9c>
    __str__ = <bound method TransportError.__str__ of Transpor... (403 Forbidden) for http://bzr.xsteve.at/dvc/ )>
    __unicode__ = <bound method TransportError.__unicode__ of Tran... (403 Forbidden) for http://bzr.xsteve.at/dvc/ )>
    __weakref__ = None
    _fmt = 'Transport error: %(msg)s %(orig_error)s'
    _format = <bound method TransportError._format of Transpor... (403 Forbidden) for http://bzr.xsteve.at/dvc/ )>
    _get_format_string = <bound method TransportError._get_format_string ... (403 Forbidden) for http://bzr.xsteve.at/dvc/ )>
    _preformatted_string = None
    args = ()
    internal_error = False
    message = ''
    msg = 'Server refuses to fulfill the request (403 Forbidden) for http://bzr.xsteve.at/dvc/'
    orig_error = ''

The above is a description of an error in a Python program. Here is
the original traceback:

Traceback (most recent call last):
  File "/home/naesten/hacking/bzr.dev/bzrlib/commands.py", line 835, in exception_to_return_code
    return the_callable(*args, **kwargs)
  File "/home/naesten/hacking/bzr.dev/bzrlib/commands.py", line 1030, in run_bzr
    ret = run(*run_argv)
  File "/home/naesten/hacking/bzr.dev/bzrlib/commands.py", line 647, in run_argv_aliases
    return self.run(**all_cmd_args)
  File "/home/naesten/hacking/bzr.dev/bzrlib/builtins.py", line 993, in run
    possible_transports=possible_transports)
  File "/home/naesten/hacking/bzr.dev/bzrlib/branch.py", line 159, in open
    possible_transports=possible_transports)
  File "/home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py", line 836, in open
    return BzrDir.open_from_transport(t, _unsupported=_unsupported)
  File "/home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py", line 866, in open_from_transport
    redirected)
  File "/home/naesten/hacking/bzr.dev/bzrlib/transport/__init__.py", line 1642, in do_catching_redirections
    return action(transport)
  File "/home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py", line 853, in find_format
    transport, _server_formats=_server_formats)
  File "/home/naesten/hacking/bzr.dev/bzrlib/bzrdir.py", line 1784, in find_format
    return format.probe_transport(transport)
  File "/home/naesten/.bazaar/plugins/svn/format.py", line 109, in probe_transport
    transport = get_svn_ra_transport(transport)
  File "/home/naesten/.bazaar/plugins/svn/transport.py", line 103, in get_svn_ra_transport
    resp = bzr_transport._perform(req)
  File "/home/naesten/hacking/bzr.dev/bzrlib/transport/http/_urllib.py", line 79, in _perform
    response = self._opener.open(request)
  File "/usr/lib/python2.5/urllib2.py", line 387, in open
    response = meth(req, response)
  File "/home/naesten/hacking/bzr.dev/bzrlib/transport/http/_urllib2_wrappers.py", line 1531, in http_response
    code, msg, hdrs)
  File "/usr/lib/python2.5/urllib2.py", line 425, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
    result = func(*args)
  File "/home/naesten/hacking/bzr.dev/bzrlib/transport/http/_urllib2_wrappers.py", line 1544, in http_error_default
    ' for %s' % req.get_full_url())
TransportError: Transport error: Server refuses to fulfill the request (403 Forbidden) for http://bzr.xsteve.at/dvc/

and yes, this works fine with --no-plugins:

naesten@hydrogen:~/.emacs/dvc% ~/hacking/bzr.dev/bzr -Derror --no-plugins pull
Using saved parent location: http://bzr.xsteve.at/dvc/
No revisions to pull.

Related branches

Jelmer Vernooij (jelmer)
Changed in bzr-svn:
status: New → Fix Released
Jelmer Vernooij (jelmer)
Changed in bzr-svn:
assignee: nobody → Jelmer Vernooij (jelmer)
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.