X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=hippotat%2F__init__.py;h=8694e978a436efc06effbbb5b4e3b81c5868d06f;hb=62b51bcf91b1b61b6417fb794272528f2673f3ff;hp=3f62113b90f439f64aa4708002908c2d1bedca52;hpb=4f991c0c66acc498efcf0b9d67abd909cf4180fb;p=hippotat.git diff --git a/hippotat/__init__.py b/hippotat/__init__.py index 3f62113..8694e97 100644 --- a/hippotat/__init__.py +++ b/hippotat/__init__.py @@ -68,7 +68,7 @@ target_requests_outstanding = 10 # used by server cfg = ConfigParser() optparser = OptionParser() -_mimetrans = str.maketrans(b'-'+slip.esc, slip.esc+'-') +_mimetrans = bytes.maketrans(b'-'+slip.esc, slip.esc+b'-') def mime_translate(s): # SLIP-encoded packets cannot contain ESC ESC. # Swap `-' and ESC. The result cannot contain `--' @@ -123,29 +123,36 @@ def ipnetwork(input): #---------- ipif (SLIP) subprocess ---------- -class SlipProtocol(twisted.internet.protocol.ProcessProtocol): - # caller must define method receivedPacket(packet) - def __init__(self): +class SlipStreamDecoder(): + def __init__(self, on_packet): + # we will call packet() self._buffer = b'' - def connectionMade(self): pass - def outReceived(self, data): + self._on_packet = on_packet + + def inputdata(self, data): #print('SLIP-GOT ', repr(data)) self._buffer += data packets = slip.decode(self._buffer) self._buffer = packets.pop() for packet in packets: - if not len(packet): continue - self.receivedPacket(packet) + self._maybe_packet(packet) + + def _maybe_packet(self, packet): + if len(packet): + self._on_packet(packet) + def flush(self): - if len(self._buffer): - self.receivedPacket(self._buffer) - self._buffer = '' + self._maybe_packet(self._buffer) + self._buffer = b'' -class _IpifProcessProtocol(SlipProtocol): +class _IpifProcessProtocol(twisted.internet.protocol.ProcessProtocol): def __init__(self, router): self._router = router - super.__init__() - def receivedPacket(self, packet): + self._decoder = SlipStreamDecoder(self.slip_on_packet) + def connectionMade(self): pass + def outReceived(self, data): + self._decoder.inputdata(data) + def slip_on_packet(self, packet): (saddr, daddr) = packet_addrs(packet) if saddr.is_link_local or daddr.is_link_local: log_discard(packet, saddr, daddr, 'link-local') @@ -217,7 +224,7 @@ def crash(err): def crash_on_defer(defer): defer.addErrback(lambda err: crash(err)) -vdef crash_on_critical(event): +def crash_on_critical(event): if event.get('log_level') >= LogLevel.critical: crash(twisted.logger.formatEvent(event))