Module lib.server.httpservercore

Http server core, it instanciated only if a connection is done to the asynchronous class HttpServer then if the server not used, it not consum memory

Expand source code
# Distributed under Pycameresp License
# Copyright (c) 2023 Remi BERTHOLET
# historically based on :
# https://github.com/jczic/MicroWebSrv/blob/master/microWebSocket.py
# but I have modified a lot, there must still be some original functions.
"""
Http server core, it instanciated only if a connection is done to the asynchronous class HttpServer then if the server not used, it not consum memory
"""
import server.httpserver
import server.httprequest
import server.stream
import tools.logger

class HttpServerCore:
        """ Http server core, it instanciated only if a connection is done to the asynchronous class HttpServer then
        if the server not used, it not consum memory """
        def __init__(self, **kwargs):
                """ Constructor """
                self.port = kwargs.get("port",80)
                self.name = kwargs.get("name","HttpServer")

        async def on_connection(self, reader, writer):
                """ Asynchronous connection call back """
                remoteaddr = writer.get_extra_info('peername')[0]
                stream    = server.stream.Stream(reader, writer)
                request   = server.httprequest.HttpRequest (stream, remoteaddr=remoteaddr, port=self.port, name=self.name)
                response  = server.httprequest.HttpResponse(stream, remoteaddr=remoteaddr, port=self.port, name=self.name)
                try:
                        await request.receive()
                        function, args = server.httpserver.HttpServer.search_route(request)
                        if function is None:
                                await response.send_not_found()
                        else:
                                if await server.httpserver.HttpServer.is_logged(request, response):
                                        await function(request, response, args)
                except OSError as err:
                        # If ECONNRESET or ENOTCONN
                        if err.args[0] == 104 or err.args[0] == 128:
                                # Ignore error
                                pass
                        else:
                                await response.send_not_found(err)
                except Exception as err:
                        tools.logger.syslog(err)
                        await response.send_not_found(err)
                finally:
                        await stream.close()

Classes

class HttpServerCore (**kwargs)

Http server core, it instanciated only if a connection is done to the asynchronous class HttpServer then if the server not used, it not consum memory

Constructor

Expand source code
class HttpServerCore:
        """ Http server core, it instanciated only if a connection is done to the asynchronous class HttpServer then
        if the server not used, it not consum memory """
        def __init__(self, **kwargs):
                """ Constructor """
                self.port = kwargs.get("port",80)
                self.name = kwargs.get("name","HttpServer")

        async def on_connection(self, reader, writer):
                """ Asynchronous connection call back """
                remoteaddr = writer.get_extra_info('peername')[0]
                stream    = server.stream.Stream(reader, writer)
                request   = server.httprequest.HttpRequest (stream, remoteaddr=remoteaddr, port=self.port, name=self.name)
                response  = server.httprequest.HttpResponse(stream, remoteaddr=remoteaddr, port=self.port, name=self.name)
                try:
                        await request.receive()
                        function, args = server.httpserver.HttpServer.search_route(request)
                        if function is None:
                                await response.send_not_found()
                        else:
                                if await server.httpserver.HttpServer.is_logged(request, response):
                                        await function(request, response, args)
                except OSError as err:
                        # If ECONNRESET or ENOTCONN
                        if err.args[0] == 104 or err.args[0] == 128:
                                # Ignore error
                                pass
                        else:
                                await response.send_not_found(err)
                except Exception as err:
                        tools.logger.syslog(err)
                        await response.send_not_found(err)
                finally:
                        await stream.close()

Methods

async def on_connection(self, reader, writer)

Asynchronous connection call back

Expand source code
async def on_connection(self, reader, writer):
        """ Asynchronous connection call back """
        remoteaddr = writer.get_extra_info('peername')[0]
        stream    = server.stream.Stream(reader, writer)
        request   = server.httprequest.HttpRequest (stream, remoteaddr=remoteaddr, port=self.port, name=self.name)
        response  = server.httprequest.HttpResponse(stream, remoteaddr=remoteaddr, port=self.port, name=self.name)
        try:
                await request.receive()
                function, args = server.httpserver.HttpServer.search_route(request)
                if function is None:
                        await response.send_not_found()
                else:
                        if await server.httpserver.HttpServer.is_logged(request, response):
                                await function(request, response, args)
        except OSError as err:
                # If ECONNRESET or ENOTCONN
                if err.args[0] == 104 or err.args[0] == 128:
                        # Ignore error
                        pass
                else:
                        await response.send_not_found(err)
        except Exception as err:
                tools.logger.syslog(err)
                await response.send_not_found(err)
        finally:
                await stream.close()