def process_request(self, session):
		""" Process single request from the given session

		:param session: session for reading requests and writing responses
		:return: None
		"""

		debugger = self.debugger()
		debugger_session_id = debugger.session_id() if debugger is not None else None

		try:
			request = session.read_request()
			if debugger_session_id is not None:
				debugger.request(
					debugger_session_id, request, session.protocol_version(), session.protocol()
				)

			try:
				target_route = self.route_map().route(request, self)
				if debugger_session_id is not None:
					debugger.target_route(debugger_session_id, target_route)

				if target_route is not None:
					response = self.execute(request, target_route)
				else:
					presenter_cls = self.route_map().error_presenter()
					presenter = presenter_cls(request)
					response = presenter.error_code(code=404)

				if debugger_session_id is not None:
					debugger.response(debugger_session_id, response)

			except Exception as e:
				if debugger_session_id is not None:
					debugger.exception(debugger_session_id, e)

				presenter_cls = self.route_map().error_presenter()
				presenter = presenter_cls(request)
				response = presenter.exception_error(e)

			session.write_response(request, response, *response.__pushed_responses__())
		except Exception as e:
			if debugger_session_id is not None:
				debugger.exception(debugger_session_id, e)

			session.session_close()

		if debugger_session_id is not None:
			debugger.finalize(debugger_session_id)
Process single request from the given session

		:param session: session for reading requests and writing responses
		:return: None