Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
86 lines (57 sloc) 2.4 KB

Extending Vaurien

You can extend Vaurien by writing new protocols or new behaviors.

Writing Protocols

Writing a new protocol is done by creating a class that inherits from the :class:`vaurien.protocols.base.BaseProtocol` class.

The class needs to provide three elements:

  • a name class attribute, the protocol will ne known under that name.
  • an optional options class attribute - a mapping containing options for the protocol. Each option value is composed of a description, a type and a default value. The mapping is wired in the command-line when you run vaurien - and is also used to generate the protocol documentation.
  • a _handle method, that will be called everytime some data is ready to be read on the proxy socket or on the backend socket.

The :class:`vaurien.protocols.base.BaseProtocol` class also provides a few helpers to work with the sockets:

  • _get_data: a method to read data in a socket. Catches EWOULDBLOCK and EAGAIN errors and loops until they happen.
  • option: a method to get the value of an option

Example:

class TCP(BaseProtocol):
    name = 'tcp'
    options = {'reuse_socket': ("If True, the socket is reused.",
                                bool, False),
               'buffer': ("Buffer size", int, 8124),
               'keep_alive': ("Keep the connection alive", bool, False)}

    def _handle(self, source, dest, to_backend):
        # default TCP behavior
        data = self._get_data(source)
        if data:
            dest.sendall(data)
            if not self.option('keep_alive'):
                data = ''
                while True:
                    data = self._get_data(dest)
                    if data == '':
                        break
                    source.sendall(data)

                if not self.option('reuse_socket'):
                    dest.close()
                    dest._closed = True
                return False
        return data != ''

Once the protocol class is ready, it can be registered via the :class:`Protocol` class:

from vaurien.protocols import Protocol
Protocol.register(TPC)

Writing Behaviors

Creating new behaviors is very similar to creating protocols.

XXX

Using your protocols and behaviors

XXX

Jump to Line
Something went wrong with that request. Please try again.