'Handles the receiver-side of the MISSING_CHECK step of a
SSYNC request.
Receives a list of hashes and timestamps of object
information the sender can provide and responds with a list
of hashes desired, either because they\'re missing or have an
older timestamp locally.
The process is generally:
1. Sender sends `:MISSING_CHECK: START` and begins
sending `hash timestamp` lines.
2. Receiver gets `:MISSING_CHECK: START` and begins
reading the `hash timestamp` lines, collecting the
hashes of those it desires.
3. Sender sends `:MISSING_CHECK: END`.
4. Receiver gets `:MISSING_CHECK: END`, responds with
`:MISSING_CHECK: START`, followed by the list of
<wanted_hash> specifiers it collected as being wanted
(one per line), `:MISSING_CHECK: END`, and flushes any
buffers.
Each <wanted_hash> specifier has the form <hash>[ <parts>] where
<parts> is a string containing characters \'d\' and/or \'m\'
indicating that only data or meta part of object respectively is
required to be sync\'d.
5. Sender gets `:MISSING_CHECK: START` and reads the list
of hashes desired by the receiver until reading
`:MISSING_CHECK: END`.
The collection and then response is so the sender doesn\'t
have to read while it writes to ensure network buffers don\'t
fill up and block everything.'

def missing_check(self):

    with exceptions.MessageTimeout(self.app.client_timeout, 'missing_check    start'):
        line = self.fp.readline(self.app.network_chunk_size)
    if (line.strip() != ':MISSING_CHECK:    START'):
        raise Exception(('Looking    for    :MISSING_CHECK:    START    got    %r' % line[:1024]))
    object_hashes = []
    while True:
        with exceptions.MessageTimeout(self.app.client_timeout, 'missing_check    line'):
            line = self.fp.readline(self.app.network_chunk_size)
        if ((not line) or (line.strip() == ':MISSING_CHECK:    END')):
            break
        want = self._check_missing(line)
        if want:
            object_hashes.append(want)
    (yield ':MISSING_CHECK:    START\r\n')
    if object_hashes:
        (yield '\r\n'.join(object_hashes))
    (yield '\r\n')
    (yield ':MISSING_CHECK:    END\r\n')
