# Source code for M2Crypto.SSL.ssl_dispatcher

    from __future__ import absolute_import

    """SSL dispatcher

    Copyright (c) 1999-2002 Ng Pheng Siong. All rights reserved."""

    # Python
    import asyncore
    import socket

    # M2Crypto
    from M2Crypto import util  # noqa
    from M2Crypto.SSL.Connection import Connection
    from M2Crypto.SSL.Context import Context  # noqa

    __all__ = ['ssl_dispatcher']

    class ssl_dispatcher(asyncore.dispatcher):

        def create_socket(self, ssl_context):
            # type: (Context) -> None
            self.family_and_type = socket.AF_INET, socket.SOCK_STREAM
            self.ssl_ctx = ssl_context
            self.socket = Connection(self.ssl_ctx)
            # self.socket.setblocking(0)
            self.add_channel()

        def connect(self, addr):
            # type: (util.AddrType) -> None
            self.socket.setblocking(1)
            self.socket.connect(addr)
            self.socket.setblocking(0)

        def recv(self, buffer_size=4096):
            # type: (int) -> bytes
            """Receive data over SSL."""
            return self.socket.recv(buffer_size)

        def send(self, buffer):
            # type: (bytes) -> int
            """Send data over SSL."""
            return self.socket.send(buffer)