~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/protocol.py

  • Committer: John Arbash Meinel
  • Date: 2010-02-10 17:52:08 UTC
  • mfrom: (5021 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5023.
  • Revision ID: john@arbash-meinel.com-20100210175208-bubuwav4uqigu291
Merge bzr.dev 5021 to resolve NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006, 2007, 2008, 2009 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
62
62
 
63
63
def _encode_tuple(args):
64
64
    """Encode the tuple args to a bytestream."""
65
 
    joined = '\x01'.join(args) + '\n'
66
 
    if type(joined) is unicode:
67
 
        # XXX: We should fix things so this never happens!  -AJB, 20100304
68
 
        mutter('response args contain unicode, should be only bytes: %r',
69
 
               joined)
70
 
        joined = joined.encode('ascii')
71
 
    return joined
 
65
    return '\x01'.join(args) + '\n'
72
66
 
73
67
 
74
68
class Requester(object):
654
648
        """Make a remote call with a readv array.
655
649
 
656
650
        The body is encoded with one line per readv offset pair. The numbers in
657
 
        each pair are separated by a comma, and no trailing \\n is emitted.
 
651
        each pair are separated by a comma, and no trailing \n is emitted.
658
652
        """
659
653
        if 'hpss' in debug.debug_flags:
660
654
            mutter('hpss call w/readv: %s', repr(args)[1:-1])
1081
1075
        self._real_write_func = write_func
1082
1076
 
1083
1077
    def _write_func(self, bytes):
 
1078
        # TODO: It is probably more appropriate to use sum(map(len, _buf))
 
1079
        #       for total number of bytes to write, rather than buffer based on
 
1080
        #       the number of write() calls
1084
1081
        # TODO: Another possibility would be to turn this into an async model.
1085
1082
        #       Where we let another thread know that we have some bytes if
1086
1083
        #       they want it, but we don't actually block for it
1228
1225
                    if first_chunk is None:
1229
1226
                        first_chunk = chunk
1230
1227
                    self._write_prefixed_body(chunk)
1231
 
                    self.flush()
1232
1228
                    if 'hpssdetail' in debug.debug_flags:
1233
1229
                        # Not worth timing separately, as _write_func is
1234
1230
                        # actually buffered
1289
1285
        _ProtocolThreeEncoder.__init__(self, medium_request.accept_bytes)
1290
1286
        self._medium_request = medium_request
1291
1287
        self._headers = {}
1292
 
        self.body_stream_started = None
1293
1288
 
1294
1289
    def set_headers(self, headers):
1295
1290
        self._headers = headers.copy()
1330
1325
        """Make a remote call with a readv array.
1331
1326
 
1332
1327
        The body is encoded with one line per readv offset pair. The numbers in
1333
 
        each pair are separated by a comma, and no trailing \\n is emitted.
 
1328
        each pair are separated by a comma, and no trailing \n is emitted.
1334
1329
        """
1335
1330
        if 'hpss' in debug.debug_flags:
1336
1331
            mutter('hpss call w/readv: %s', repr(args)[1:-1])
1355
1350
            if path is not None:
1356
1351
                mutter('                  (to %s)', path)
1357
1352
            self._request_start_time = osutils.timer_func()
1358
 
        self.body_stream_started = False
1359
1353
        self._write_protocol_version()
1360
1354
        self._write_headers(self._headers)
1361
1355
        self._write_structure(args)
1363
1357
        #       have finished sending the stream.  We would notice at the end
1364
1358
        #       anyway, but if the medium can deliver it early then it's good
1365
1359
        #       to short-circuit the whole request...
1366
 
        # Provoke any ConnectionReset failures before we start the body stream.
1367
 
        self.flush()
1368
 
        self.body_stream_started = True
1369
1360
        for exc_info, part in _iter_with_errors(stream):
1370
1361
            if exc_info is not None:
1371
1362
                # Iterating the stream failed.  Cleanly abort the request.