Example #1
0
 def init(self):
     if (self.address[1] == 0):
         self.address = self.find_port()
     if not self.args:
         self.args = ['-b', '%s:%s' % self.address]
         if self.ini:
             self.args.extend(['-c', self.ini])
         for pair in self.options.items():
             self.args.extend(['-d', '%s=%s' % pair])
     
     super(Service, self).init()
     
     self._static = Static(index=self.index, root=self.path, allow=None)
     self._static.set_handler('php', self._handle)
Example #2
0
class Service(fastcgi.Service, base.ProcessService):
    type = 'php:service'
    executable = 'php-cgi'
    ini = None
    options = {}
    num_processes = 1
    index = ('index.php', 'index.html')
    
    def init(self):
        if (self.address[1] == 0):
            self.address = self.find_port()
        if not self.args:
            self.args = ['-b', '%s:%s' % self.address]
            if self.ini:
                self.args.extend(['-c', self.ini])
            for pair in self.options.items():
                self.args.extend(['-d', '%s=%s' % pair])
        
        super(Service, self).init()
        
        self._static = Static(index=self.index, root=self.path, allow=None)
        self._static.set_handler('php', self._handle)
    
    def start(self):
        # Avoid the fastcgi part.
        base.ProcessService.start(self)
    
    def _proxy(self, environ, start_response):
        if 'REQUEST_URI' not in environ:
            # PHP likes to have this variable
            request_uri = [
                environ.get('SCRIPT_NAME', ''),
                environ.get('PATH_INFO', ''),
            ]
            if environ.get('QUERY_STRING'):
                request_uri.extend(['?', environ['QUERY_STRING']])
            environ['REQUEST_URI'] = "".join(request_uri)
            
        path = environ['PATH_INFO']
        if '.php/' in path:
            path, info = path.split('.php/', 1)
            environ['PATH_INFO'] = path + '.php'
            environ['minister.php_info'] = '/' + info
        
        response = self._static(environ, start_response)
        return response
        
    def _handle(self, environ, start_response, path):
        _SERVER = environ
        
        _SERVER['SCRIPT_NAME'] = environ['SCRIPT_NAME'] + environ['PATH_INFO'] 
        _SERVER['SCRIPT_FILENAME'] = path    
        _SERVER["DOCUMENT_ROOT"] = self.path
        _SERVER["SERVER_NAME"] = environ["HTTP_HOST"]
        
        if 'minister.php_info' in environ:
            _SERVER['PATH_INFO'] = environ['minister.php_info']
            del _SERVER['minister.php_info']
        else:
            _SERVER['PATH_INFO'] = ''
        
        if (environ['REQUEST_METHOD'] == 'POST' and not environ.get('CONTENT_TYPE')):
            _SERVER['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
        
        response = self._fastcgi(_SERVER, start_response)
        return response
    
    def find_index(self, path):
        """Find an index file in the directory specified at path."""
        for i in self.index:
            candidate = os.path.join(path, i)
            if os.path.isfile(candidate):
                return candidate
        return None