That had me confused a bit there, as I couldn't work out why I was encoding ASCII...then suddenly I remembered. :grin: 

The buffer is all in bytes as it is byte stream which has been "pickled" by the client socket. The `loads` function is turning this back into whatever python objects were sent (list of strings in _fail2ban_'s case, which can include unicode).
The reason for the `bytes("", encoding="ascii")` is to create an empty bytes object, as using the more obvious `b""` raises a `SyntaxError` for python2.4 and python2.5 when the module is imported. This is a bit of a hack, but I couldn't work out a way to do this without breaking it for python2.{4,5}

To make it cleaner, I'll create an EMPTY_BYTES global at the head of the module, with a comment explaining this. This way I wont forgot what I was thinking when I created it :wink: