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 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)
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)
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)