~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/http.py

[merge] Robey Pointer - some sftp fixes, and an http patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
                           NonRelativePath, TransportError, ConnectionError)
22
22
import os, errno
23
23
from cStringIO import StringIO
24
 
import urllib2
 
24
import urllib, urllib2
25
25
import urlparse
26
26
 
27
27
from bzrlib.errors import BzrError, BzrCheckError
29
29
from bzrlib.trace import mutter
30
30
 
31
31
 
 
32
def extract_auth(url, password_manager):
 
33
    """
 
34
    Extract auth parameters from am HTTP/HTTPS url and add them to the given
 
35
    password manager.  Return the url, minus those auth parameters (which
 
36
    confuse urllib2).
 
37
    """
 
38
    assert url.startswith('http://') or url.startswith('https://')
 
39
    scheme, host = url.split('//', 1)
 
40
    if '/' in host:
 
41
        host, path = host.split('/', 1)
 
42
        path = '/' + path
 
43
    else:
 
44
        path = ''
 
45
    port = ''
 
46
    if '@' in host:
 
47
        auth, host = host.split('@', 1)
 
48
        if ':' in auth:
 
49
            username, password = auth.split(':', 1)
 
50
        else:
 
51
            username, password = auth, None
 
52
        if ':' in host:
 
53
            host, port = host.split(':', 1)
 
54
            port = ':' + port
 
55
        # FIXME: if password isn't given, should we ask for it?
 
56
        if password is not None:
 
57
            username = urllib.unquote(username)
 
58
            password = urllib.unquote(password)
 
59
            password_manager.add_password(None, host, username, password)
 
60
    url = scheme + '//' + host + port + path
 
61
    return url
 
62
    
32
63
def get_url(url):
33
64
    import urllib2
34
 
    mutter("get_url %s", url)
35
 
    url_f = urllib2.urlopen(url)
 
65
    mutter("get_url %s" % url)
 
66
    manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
 
67
    url = extract_auth(url, manager)
 
68
    auth_handler = urllib2.HTTPBasicAuthHandler(manager)
 
69
    opener = urllib2.build_opener(auth_handler)
 
70
    url_f = opener.open(url)
36
71
    return url_f
37
72
 
38
73
class HttpTransportError(TransportError):