def __init__(self, config, logger, ndo_cache, redis_conn, http_server):
        """
        @brief Constructor for NetInf HTTP<->DTN gateway component of niserver.
        @param config object ConfigParser instance pointing to config file
        @param logger object logger instance to output messages
        @param ndo_cache object instance of NetInfCache with local (HTTP) NDOs
        @param nrs_redis object StrictRedis instance used for communication
                                between the gateway and the Redis database.
        @param http_server object instance of NIHTTPServer that instantiated
                                  this gateway.
        """

        self.config = config
        self.logger = logger
        self.ndo_cache = ndo_cache
        self.redis_conn = redis_conn
        self.http_server = http_server
        self.mprocs = None
        self.per_req_limit = None

        # Get mprocs and per_req_limit from config if specified
        conf_section = "gateway"
        if ((config is not None) and (config.has_section(conf_section))):
            if (self.mprocs is None):
                conf_option = "mprocs"
                if config.has_option(conf_section, conf_option):
                    try:
                        self.mprocs = config.getint(conf_section,
                                                    conf_option)
                    except ValueError:
                        self.logerror("Value supplied for %s is not an "
                                      "acceptable integer representation - "
                                      "using default %d" %
                                      (conf_option, self.DEFAULT_MPROCS))
                        self.mprocs = None
            if (self.per_req_limit is None):
                conf_option = "per-req-limit"
                if config.has_option(conf_section, conf_option):
                    try:
                        self.per_req_limit = config.getint(conf_section,
                                                           conf_option)
                    except ValueError:
                        self.logerror("Value supplied for %s is not an "
                                      "acceptable integer representation - "
                                      "using default %d" %
                                      (conf_option, self.DEFAULT_PER_REQ_LIMIT))
                        self.per_req_limit = None

        # Use defaults if not in configuration
        if self.mprocs is None:
            self.mprocs = self.DEFAULT_MPROCS
        if self.per_req_limit is None:
            self.per_req_limit = self.DEFAULT_PER_REQ_LIMIT

        # Create Queue for requests to be sent into DTN network
        self.response_q = Queue()

        # Create HTTP action thread
        self.http_action = HTTPAction(self.response_q,
                                      ndo_cache.get_temp_path(), logger,
                                      redis_conn, ndo_cache,
                                      mprocs=self.mprocs,
                                      per_req_limit=self.per_req_limit)
        self.http_action.setDaemon(True)

        # Create DTN send and receive threads
        self.dtn_send = DtnSend(self.response_q, logger)
        self.dtn_send.setDaemon(True)
        self.dtn_receive = DtnReceive(self.http_action, logger)
        self.dtn_receive.setDaemon(True)
        
        return
class DtnHttpGateway():
    """
    @brief Controller for HTTP<->DTN gateway.

    Records parameters passed on startup.
    Starts up various threads as described above.
    Provides shutdown routine to close down the threads on request. 
    
    """
    #--------------------------------------------------------------------------#
    # CLASS CONSTANTS

    # === Defaults for single/multi-processing setup ===

    ##@var DEFAULT_MPROCS
    # integer number of processes to provide gateway forwarding operations
    #         If 1 (or 0) will run synchronously within the gateway HTTP thread
    DEFAULT_MPROCS = 1

    ##@var DEFAULT_PER_REQ_LIMIT
    # integer number of outstanding forwarded HTTP requests allowed per item
    DEFAULT_PER_REQ_LIMIT = 1
    
    #--------------------------------------------------------------------------#
    # INSTANCE VARIABLES

    ##@var redis_conn
    # object StrictRedis instance used for communication between the NRS server
    # and the Redis database.

    ##@var logger
    # object logger instance to output messages

    ##@var ndo_cache
    # object instance of NDO cache handler

    ##@var http_server
    # object instance of NIHTTPServer that created this gateway
    
    #--------------------------------------------------------------------------#
    def __init__(self, config, logger, ndo_cache, redis_conn, http_server):
        """
        @brief Constructor for NetInf HTTP<->DTN gateway component of niserver.
        @param config object ConfigParser instance pointing to config file
        @param logger object logger instance to output messages
        @param ndo_cache object instance of NetInfCache with local (HTTP) NDOs
        @param nrs_redis object StrictRedis instance used for communication
                                between the gateway and the Redis database.
        @param http_server object instance of NIHTTPServer that instantiated
                                  this gateway.
        """

        self.config = config
        self.logger = logger
        self.ndo_cache = ndo_cache
        self.redis_conn = redis_conn
        self.http_server = http_server
        self.mprocs = None
        self.per_req_limit = None

        # Get mprocs and per_req_limit from config if specified
        conf_section = "gateway"
        if ((config is not None) and (config.has_section(conf_section))):
            if (self.mprocs is None):
                conf_option = "mprocs"
                if config.has_option(conf_section, conf_option):
                    try:
                        self.mprocs = config.getint(conf_section,
                                                    conf_option)
                    except ValueError:
                        self.logerror("Value supplied for %s is not an "
                                      "acceptable integer representation - "
                                      "using default %d" %
                                      (conf_option, self.DEFAULT_MPROCS))
                        self.mprocs = None
            if (self.per_req_limit is None):
                conf_option = "per-req-limit"
                if config.has_option(conf_section, conf_option):
                    try:
                        self.per_req_limit = config.getint(conf_section,
                                                           conf_option)
                    except ValueError:
                        self.logerror("Value supplied for %s is not an "
                                      "acceptable integer representation - "
                                      "using default %d" %
                                      (conf_option, self.DEFAULT_PER_REQ_LIMIT))
                        self.per_req_limit = None

        # Use defaults if not in configuration
        if self.mprocs is None:
            self.mprocs = self.DEFAULT_MPROCS
        if self.per_req_limit is None:
            self.per_req_limit = self.DEFAULT_PER_REQ_LIMIT

        # Create Queue for requests to be sent into DTN network
        self.response_q = Queue()

        # Create HTTP action thread
        self.http_action = HTTPAction(self.response_q,
                                      ndo_cache.get_temp_path(), logger,
                                      redis_conn, ndo_cache,
                                      mprocs=self.mprocs,
                                      per_req_limit=self.per_req_limit)
        self.http_action.setDaemon(True)

        # Create DTN send and receive threads
        self.dtn_send = DtnSend(self.response_q, logger)
        self.dtn_send.setDaemon(True)
        self.dtn_receive = DtnReceive(self.http_action, logger)
        self.dtn_receive.setDaemon(True)
        
        return
    
    #--------------------------------------------------------------------------#
    def start_gateway(self):
        """
        @brief start the threads running HTTP actions plus DTN send and receive
        """
        self.http_action.start()
        self.dtn_send.start()
        self.dtn_receive.start()
        return
    
    #--------------------------------------------------------------------------#
    def shutdown_gateway(self):
        """
        @brief terminate the threads running DTN receive and the HTTP
               action routine

        @detail Terminating the HTTP action thread will automatically terminate
        the DTN recive thread by sending it an 'end' message.
        """
        self.dtn_receive.end_run()
        self.http_action.end_run()
        return