'Parse protocol trace captured by fake connection, making some
assertions along the way, and return results  as a dict of form:
results = {\'tx_missing\': <list of messages>,
\'rx_missing\': <list of messages>,
\'tx_updates\': <list of subreqs>,
\'rx_updates\': <list of messages>}
Each subreq is a dict with keys: \'method\', \'path\', \'headers\', \'body\''

def _analyze_trace(self, trace):

    def tx_missing(results, line):
        self.assertEqual('tx', line[0])
        results['tx_missing'].append(line[1])
    def rx_missing(results, line):
        self.assertEqual('rx', line[0])
        parts = line[1].split('\r\n')
        for part in parts:
            results['rx_missing'].append(part)
    def tx_updates(results, line):
        self.assertEqual('tx', line[0])
        subrequests = results['tx_updates']
        if line[1].startswith(('PUT', 'DELETE', 'POST')):
            parts = line[1].split('\r\n')
            (method, path) = parts[0].split()
            subreq = {'method': method, 'path': path, 'req': line[1], 'headers': parts[1:]}
            subrequests.append(subreq)
        else:
            self.assertTrue(subrequests)
            body = subrequests[(-1)].setdefault('body', '')
            body += line[1]
            subrequests[(-1)]['body'] = body
    def rx_updates(results, line):
        self.assertEqual('rx', line[0])
        results.setdefault['rx_updates'].append(line[1])
    def unexpected(results, line):
        results.setdefault('unexpected', []).append(line)
    handshakes = iter([(('tx', ':MISSING_CHECK:    START'), tx_missing), (('tx', ':MISSING_CHECK:    END'), unexpected), (('rx', ':MISSING_CHECK:    START'), rx_missing), (('rx', ':MISSING_CHECK:    END'), unexpected), (('tx', ':UPDATES:    START'), tx_updates), (('tx', ':UPDATES:    END'), unexpected), (('rx', ':UPDATES:    START'), rx_updates), (('rx', ':UPDATES:    END'), unexpected)])
    expect_handshake = next(handshakes)
    phases = ('tx_missing', 'rx_missing', 'tx_updates', 'rx_updates')
    results = dict(((k, []) for k in phases))
    handler = unexpected
    lines = list(trace.get('messages', []))
    lines.reverse()
    while lines:
        line = lines.pop()
        if (line == expect_handshake[0]):
            handler = expect_handshake[1]
            try:
                expect_handshake = next(handshakes)
            except StopIteration:
                self.assertFalse(lines, ('Unexpected    trailing    lines    %s' % lines))
            continue
        handler(results, line)
    try:
        missed = next(handshakes)
        self.fail(('Handshake    %s    not    found' % str(missed[0])))
    except StopIteration:
        pass
    self.assertFalse(results.get('unexpected'), ('Message    outside    of    a    phase:    %s' % results.get(None)))
    return results
