Source code for httpserver

# -*- coding: utf-8 -*-

##############################################################################
#                        2011 E2OpenPlugins                                  #
#                                                                            #
#  This file is open source software; you can redistribute it and/or modify  #
#     it under the terms of the GNU General Public License version 2 as      #
#               published by the Free Software Foundation.                   #
#                                                                            #
##############################################################################
import os
import logging
from socket import has_ipv6

from Components.config import config as comp_config
from controllers.root import RootController

from twisted.internet import reactor
from twisted.web import server, version
from twisted.internet.error import CannotListenError

HLOG = logging.getLogger('httpserver')

global listener, server_to_stop, site
listener = []


[docs]def HttpdStart(session): """ Helper class to start web server Args: session: (?) session object """ if comp_config.OpenWebif.enabled.value: global listener, site port = comp_config.OpenWebif.port.value root = RootController(session) site = server.Site(root) ipv6_interface = os.path.isfile('/proc/net/if_inet6') # start http webserver on configured port try: if has_ipv6 and ipv6_interface and version.major >= 12: # use ipv6 listener.append(reactor.listenTCP(port, site, interface='::')) else: # ipv4 only listener.append(reactor.listenTCP(port, site)) HLOG.debug("started listening on {:d}".format(port)) except CannotListenError as cle: HLOG.warning("failed to listen on Port {:d}: {!r}".format( port, cle)) # Streaming requires listening on 127.0.0.1:80 if port != 80: try: if has_ipv6 and ipv6_interface and version.major >= 12: # use ipv6 listener.append( reactor.listenTCP(80, site, interface='::1')) listener.append( reactor.listenTCP( 80, site, interface='::ffff:127.0.0.1')) else: # ipv4 only listener.append( reactor.listenTCP( 80, site, interface='127.0.0.1')) HLOG.debug("started stream listening on port 80") except CannotListenError as cle2: HLOG.warning("port 80 busy: {!r}".format(cle2))
def HttpdStop(session): StopServer(session).doStop() def HttpdRestart(session): StopServer(session, HttpdStart).doStop()
[docs]class StopServer: """ Helper class to stop running web servers; we use a class here to reduce use of global variables. Resembles code prior found in HttpdStop et. al. """ server_to_stop = 0 def __init__(self, session, callback=None): self.session = session self.callback = callback def doStop(self): global listener self.server_to_stop = 0 for interface in listener: HLOG.debug("Stopping server on port {!r}".format(interface.port)) deferred = interface.stopListening() try: self.server_to_stop += 1 deferred.addCallback(self.callbackStopped) except AttributeError: pass listener = [] if self.server_to_stop < 1: self.doCallback() def callbackStopped(self, reason): self.server_to_stop -= 1 if self.server_to_stop < 1: self.doCallback() def doCallback(self): if self.callback is not None: self.callback(self.session)