simplify raw tcp protocol

This commit is contained in:
Maximilian Hils 2015-08-29 23:08:16 +02:00
parent a7058e2a3c
commit 100ea27c30
1 changed files with 54 additions and 8 deletions

View File

@ -1,21 +1,67 @@
from __future__ import (absolute_import, print_function, division)
import socket
import select
from OpenSSL import SSL
import OpenSSL
from ..exceptions import ProtocolException
from netlib.tcp import NetLibError
from netlib.utils import cleanBin
from ..protocol.tcp import TCPHandler
from .layer import Layer
class RawTcpLayer(Layer):
chunk_size = 4096
def __init__(self, ctx, logging=True):
self.logging = logging
super(RawTcpLayer, self).__init__(ctx)
def __call__(self):
self.connect()
tcp_handler = TCPHandler(self)
buf = memoryview(bytearray(self.chunk_size))
client = self.client_conn.connection
server = self.server_conn.connection
conns = [client, server]
try:
tcp_handler.handle_messages()
except OpenSSL.SSL.Error as e:
raise ProtocolException("SSL error: %s" % repr(e), e)
while True:
r, _, _ = select.select(conns, [], [], 10)
for conn in r:
size = conn.recv_into(buf, self.chunk_size)
if not size:
conns.remove(conn)
# Shutdown connection to the other peer
if isinstance(conn, SSL.Connection):
# We can't half-close a connection, so we just close everything here.
# Sockets will be cleaned up on a higher level.
return
else:
conn.shutdown(socket.SHUT_WR)
def establish_server_connection(self):
pass
# FIXME: Remove method, currently just here to mock TCPHandler's call to it.
if len(conns) == 0:
return
continue
dst = server if conn == client else client
dst.sendall(buf[:size])
if self.logging:
# log messages are prepended with the client address,
# hence the "weird" direction string.
if dst == server:
direction = "-> tcp -> {!r}".format(self.server_conn.address)
else:
direction = "<- tcp <- {!r}".format(self.server_conn.address)
data = cleanBin(buf[:size].tobytes())
self.log(
"{}\r\n{}".format(direction, data),
"info"
)
except (socket.error, NetLibError, SSL.Error) as e:
raise ProtocolException("TCP connection closed unexpectedly: {}".format(repr(e)), e)