Esempio n. 1
0
 def setup(self, addr, bind_and_activate=True):
     addr, family = addrinfo(addr)
     if isinstance(addr, int):
         self.socket = fromfd(addr, family, SOCK_STREAM)
         self.require_bind_and_activate = False
         self.family = family
         try:
             self.server_address = self.socket.getsockname()
             host, self.server_port = self.server_address
             self.server_name = getfqdn(host)
         except:
             pass
     elif 2 == len(addr):
         self.socket = realsocket(family, SOCK_STREAM)
         if AF_INET6 == family and addr[0] == '::':
             if hasattr(_socket, 'IPV6_V6ONLY'):
                 self.socket.setsockopt \
                     (IPPROTO_IPV6, _socket.IPV6_V6ONLY, 0)
         self.require_bind_and_activate = True
         self.server_address = addr
         self.server_name = getfqdn(addr[0])
         self.server_port = addr[1]
         self.family = family
         self.server_bind()
         self.server_activate()
     else:
         self.socket = realsocket(family, SOCK_STREAM)
         self.require_bind_and_activate = True
         self.server_address = addr
         self.family = family
         self.server_bind()
         self.server_activate()
     self.r_event = Io(self.socket.fileno(), EV_READ, loop,
                       self._handle_request, self)
Esempio n. 2
0
 def setup(self, addr, bind_and_activate=True):
     addr, family = addrinfo(addr)
     if isinstance(addr, int):
         self.socket = fromfd(addr, family, SOCK_STREAM)
         self.require_bind_and_activate = False
         self.family = family
         try:
             self.server_address = self.socket.getsockname()
             host, self.server_port = self.server_address
             self.server_name = getfqdn(host)
         except:
             pass
     elif 2 == len(addr):
         self.socket = realsocket(family, SOCK_STREAM)
         if AF_INET6 == family and addr[0] == '::':
             if hasattr(_socket, 'IPV6_V6ONLY'):
                 self.socket.setsockopt \
                     (IPPROTO_IPV6, _socket.IPV6_V6ONLY, 0)
         self.require_bind_and_activate = True
         self.server_address = addr
         self.server_name = getfqdn(addr[0])
         self.server_port = addr[1]
         self.family = family
         self.server_bind()
         self.server_activate()
     else:
         self.socket = realsocket(family, SOCK_STREAM)
         self.require_bind_and_activate = True
         self.server_address = addr
         self.family = family
         self.server_bind()
         self.server_activate()
     self.r_event = Io(self.socket.fileno() , EV_READ , loop,
         self._handle_request, self)
Esempio n. 3
0
class tcpserver:
    '''Classic server.'''

    allow_reuse_address = True
    request_queue_size = 4194304
    address_family, socket_type = AF_INET, SOCK_STREAM

    def __init__(self, addr, handler, bind_and_activate=True):
        '''Constructor.  May be extended, do not override.'''
        self.setup(addr, bind_and_activate)
        self.RequestHandlerClass = handler

    def setup(self, addr, bind_and_activate=True):
        addr, family = addrinfo(addr)
        if isinstance(addr, int):
            self.socket = fromfd(addr, family, SOCK_STREAM)
            self.require_bind_and_activate = False
            self.family = family
            try:
                self.server_address = self.socket.getsockname()
                host, self.server_port = self.server_address
                self.server_name = getfqdn(host)
            except:
                pass
        elif 2 == len(addr):
            self.socket = realsocket(family, SOCK_STREAM)
            if AF_INET6 == family and addr[0] == '::':
                if hasattr(_socket, 'IPV6_V6ONLY'):
                    self.socket.setsockopt \
                        (IPPROTO_IPV6, _socket.IPV6_V6ONLY, 0)
            self.require_bind_and_activate = True
            self.server_address = addr
            self.server_name = getfqdn(addr[0])
            self.server_port = addr[1]
            self.family = family
            self.server_bind()
            self.server_activate()
        else:
            self.socket = realsocket(family, SOCK_STREAM)
            self.require_bind_and_activate = True
            self.server_address = addr
            self.family = family
            self.server_bind()
            self.server_activate()
        self.r_event = Io(self.socket.fileno(), EV_READ, loop,
                          self._handle_request, self)

    def _handle_request(self, w, revents):
        req, addr = self.get_request()
        if self.verify_request(req, addr):
            greenlet(self.process_request).switch(req, addr)

    def server_bind(self):
        '''Called by constructor to bind the socket.'''
        if self.require_bind_and_activate:
            if self.allow_reuse_address:
                self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
            self.socket.bind(self.server_address)

    def server_activate(self):
        '''Called by constructor to activate the server.'''
        if self.require_bind_and_activate:
            self.socket.listen(self.request_queue_size)

    def fileno(self):
        '''Return socket file number.'''
        return self.socket.fileno()

    def serve_forever(self):
        '''Handle one request at a time until shutdown.'''
        self.r_event.start()
        mainloop()

    def start(self):
        '''Handle one request at a time until shutdown.'''
        self.r_event.start()

    def run(self):
        '''Handle one request at a time until shutdown.'''
        self.r_event.start()

    def shutdown(self):
        '''Stops the serve_forever loop.'''
        self.r_event.stop()

    stop = shutdown

    def process_request(self, req, addr):
        '''Call finish_request.'''
        try:
            self.finish_request(req, addr)
            self.close_request(req)
        except:
            self.handle_error(req, addr)
            self.close_request(req)

    def verify_request(self, req, addr):
        '''Verify the request.  May be overridden.

        Return True if we should proceed with this request.

        '''
        return True

    def server_close(self):
        '''Called to clean-up the server.

        May be overridden.

        '''
        self.socket.close()

    def close_request(self, req):
        '''Called to clean up an individual request.'''
        req.close()

    def handle_error(self, req, addr):
        '''Handle an error gracefully.

        May be overridden.

        '''
        pass

    def get_request(self):
        '''Get the request and client address from the socket.'''
        sock, addr = self.socket.accept()
        return fakesocket(_sock=sock), addr

    def finish_request(self, req, addr):
        '''Finish one request by instantiating RequestHandlerClass.'''
        self.RequestHandlerClass(req, addr, self)
Esempio n. 4
0
class tcpserver:

    '''Classic server.'''

    allow_reuse_address = True
    request_queue_size  = 4194304
    address_family, socket_type = AF_INET, SOCK_STREAM

    def __init__(self, addr, handler, bind_and_activate=True):
        '''Constructor.  May be extended, do not override.'''
        self.setup(addr, bind_and_activate)
        self.RequestHandlerClass = handler

    def setup(self, addr, bind_and_activate=True):
        addr, family = addrinfo(addr)
        if isinstance(addr, int):
            self.socket = fromfd(addr, family, SOCK_STREAM)
            self.require_bind_and_activate = False
            self.family = family
            try:
                self.server_address = self.socket.getsockname()
                host, self.server_port = self.server_address
                self.server_name = getfqdn(host)
            except:
                pass
        elif 2 == len(addr):
            self.socket = realsocket(family, SOCK_STREAM)
            if AF_INET6 == family and addr[0] == '::':
                if hasattr(_socket, 'IPV6_V6ONLY'):
                    self.socket.setsockopt \
                        (IPPROTO_IPV6, _socket.IPV6_V6ONLY, 0)
            self.require_bind_and_activate = True
            self.server_address = addr
            self.server_name = getfqdn(addr[0])
            self.server_port = addr[1]
            self.family = family
            self.server_bind()
            self.server_activate()
        else:
            self.socket = realsocket(family, SOCK_STREAM)
            self.require_bind_and_activate = True
            self.server_address = addr
            self.family = family
            self.server_bind()
            self.server_activate()
        self.r_event = Io(self.socket.fileno() , EV_READ , loop,
            self._handle_request, self)

    def _handle_request(self, w, revents):
        req, addr = self.get_request()
        if self.verify_request(req, addr):
            greenlet(self.process_request).switch(req, addr)

    def server_bind(self):
        '''Called by constructor to bind the socket.'''
        if self.require_bind_and_activate:
            if self.allow_reuse_address:
                self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
            self.socket.bind(self.server_address)

    def server_activate(self):
        '''Called by constructor to activate the server.'''
        if self.require_bind_and_activate:
            self.socket.listen(self.request_queue_size)

    def fileno(self):
        '''Return socket file number.'''
        return self.socket.fileno()

    def serve_forever(self):
        '''Handle one request at a time until shutdown.'''
        self.r_event.start()
        mainloop()

    def start(self):
        '''Handle one request at a time until shutdown.'''
        self.r_event.start()

    def run(self):
        '''Handle one request at a time until shutdown.'''
        self.r_event.start()

    def shutdown(self):
        '''Stops the serve_forever loop.'''
        self.r_event.stop()
    stop = shutdown

    def process_request(self, req, addr):
        '''Call finish_request.'''
        try:
            self.finish_request(req, addr)
            self.close_request (req)
        except:
            self.handle_error  (req, addr)
            self.close_request (req)

    def verify_request(self, req, addr):
        '''Verify the request.  May be overridden.

        Return True if we should proceed with this request.

        '''
        return True

    def server_close(self):
        '''Called to clean-up the server.

        May be overridden.

        '''
        self.socket.close()

    def close_request(self, req):
        '''Called to clean up an individual request.'''
        req.close()

    def handle_error(self, req, addr):
        '''Handle an error gracefully.

        May be overridden.

        '''
        pass

    def get_request(self):
        '''Get the request and client address from the socket.'''
        sock, addr = self.socket.accept()
        return fakesocket(_sock=sock), addr

    def finish_request(self, req, addr):
        '''Finish one request by instantiating RequestHandlerClass.'''
        self.RequestHandlerClass(req, addr, self)