~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/client.py

  • Committer: John Arbash Meinel
  • Date: 2007-05-04 18:59:36 UTC
  • mto: This revision was merged to the branch mainline in revision 2643.
  • Revision ID: john@arbash-meinel.com-20070504185936-1mjdoqmtz74xe5mg
A C implementation of _fields_to_entry_0_parents drops the time from 400ms to 330ms for a 21k-entry tree

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
import urllib
18
17
from urlparse import urlparse
19
18
 
20
19
from bzrlib.smart import protocol
21
 
from bzrlib import urlutils
 
20
from bzrlib.urlutils import unescape
22
21
 
23
22
 
24
23
class _SmartClient(object):
25
24
 
26
 
    def __init__(self, medium, base):
27
 
        """Constructor.
28
 
 
29
 
        :param medium: a SmartClientMedium
30
 
        :param base: a URL
31
 
        """
 
25
    def __init__(self, medium):
32
26
        self._medium = medium
33
 
        self._base = base
34
27
 
35
28
    def call(self, method, *args):
36
29
        """Call a method on the remote server."""
47
40
            body = smart_protocol.read_body_bytes()
48
41
        """
49
42
        request = self._medium.get_request()
50
 
        smart_protocol = protocol.SmartClientRequestProtocolTwo(request)
 
43
        smart_protocol = protocol.SmartClientRequestProtocolOne(request)
51
44
        smart_protocol.call(method, *args)
52
45
        return smart_protocol.read_response_tuple(expect_body=True), smart_protocol
53
46
 
65
58
        smart_protocol.call_with_body_bytes((method, ) + args, body)
66
59
        return smart_protocol.read_response_tuple()
67
60
 
68
 
    def call_with_body_bytes_expecting_body(self, method, args, body):
69
 
        """Call a method on the remote server with body bytes."""
70
 
        if type(method) is not str:
71
 
            raise TypeError('method must be a byte string, not %r' % (method,))
72
 
        for arg in args:
73
 
            if type(arg) is not str:
74
 
                raise TypeError('args must be byte strings, not %r' % (args,))
75
 
        if type(body) is not str:
76
 
            raise TypeError('body must be byte string, not %r' % (body,))
77
 
        request = self._medium.get_request()
78
 
        smart_protocol = protocol.SmartClientRequestProtocolTwo(request)
79
 
        smart_protocol.call_with_body_bytes((method, ) + args, body)
80
 
        return smart_protocol.read_response_tuple(expect_body=True), smart_protocol
81
 
 
82
61
    def remote_path_from_transport(self, transport):
83
62
        """Convert transport into a path suitable for using in a request.
84
63
        
86
65
        anything but path, so it is only safe to use it in requests sent over
87
66
        the medium from the matching transport.
88
67
        """
89
 
        base = self._base
90
 
        if (base.startswith('bzr+http://') or base.startswith('bzr+https://')
91
 
            or base.startswith('http://') or base.startswith('https://')):
92
 
            medium_base = self._base
93
 
        else:
94
 
            medium_base = urlutils.join(self._base, '/')
95
 
            
96
 
        rel_url = urlutils.relative_url(medium_base, transport.base)
97
 
        return urllib.unquote(rel_url)
 
68
        return unescape(urlparse(transport.base)[2]).encode('utf8')