예제 #1
0
 def __init__(self, docroot, index, errorpage, phpstate, phpexec):
     self.docroot = docroot
     self.errorpage = errorpage
     self.index = index
     self.sender = PageSender(self.docroot, self.errorpage)
     self.php = handlePhp(self.docroot, phpexec, self.errorpage)
     self.phpstate = phpstate
예제 #2
0
 def __init__(self, docroot, index, errorpage, phpstate, phpexec):
     self.docroot = docroot
     self.errorpage = errorpage
     self.index = index
     self.sender = PageSender(self.docroot, self.errorpage)
     self.php = handlePhp(self.docroot, phpexec, self.errorpage)
     self.phpstate = phpstate
예제 #3
0
class handlePhp:
    def __init__(self, docroot, phpexec, errorpage):
        self.docroot = docroot
        self.phpexec = phpexec
        self.response = createResponse()
        self.error = PageSender(self.docroot, errorpage)

    def checkPage(self, page):
        path = self.docroot + page
        if os.path.isfile(path):
            return True
        else:
            return False

    def setEnvVars(self, querystring, reqtype, scriptpath, remoteaddr, ctype,
                   clength, requri):
        os.putenv('SERVER_SOFTWARE', 'kHTTPd Mini')
        os.putenv('GATEWAY_INTERFACE', 'CGI/1.1')
        os.putenv('SERVER_PROTOCOL', 'HTTP/1.1')
        os.putenv('REDIRECT_STATUS', 'true')
        os.putenv('REMOTE_ADDR', remoteaddr)
        os.putenv('SCRIPT_FILENAME', scriptpath)
        os.putenv('REQUEST_METHOD', reqtype)
        os.putenv('REQUEST_URI', requri)
        if reqtype == 'GET':
            os.putenv('QUERY_STRING', querystring)
        if reqtype == 'POST':
            os.putenv('CONTENT_TYPE', ctype)
            os.putenv('CONTENT_LENGTH', clength)

    def setCookie(self, cookie):
        os.putenv('HTTP_COOKIE', cookie)

    def clearVars(self):
        os.putenv('SERVER_SOFTWARE', '')
        os.putenv('GATEWAY_INTERFACE', '')
        os.putenv('SERVER_PROTOCOL', '')
        os.putenv('REDIRECT_STATUS', '')
        os.putenv('REMOTE_ADDR', '')
        os.putenv('SCRIPT_FILENAME', '')
        os.putenv('REQUEST_METHOD', '')
        os.putenv('QUERY_STRING', '')
        os.putenv('CONTENT_TYPE', '')
        os.putenv('CONTENT_LENGTH', '')
        os.putenv('HTTP_COOKIE', '')

    def parse(self, page, request):
        path = self.docroot + page
        if self.checkPage(page) is True:
            phpProc = Popen([self.phpexec, path], stdout=PIPE, stdin=PIPE)
            out, err = phpProc.communicate(input=request)
            page = out.split(
                '\r\n\r\n',
                1)[1]  ### Actual page content returned from php-cgi ###
            headers = out.split('\r\n\r\n', 1)[0]
            return self.response.phpCreate(complete, headers, page)
        else:
            return self.error.sendNotFound()
예제 #4
0
class handlePhp:
    
    def __init__(self, docroot, phpexec, errorpage):
        self.docroot = docroot
        self.phpexec = phpexec
        self.response = createResponse()
        self.error = PageSender(self.docroot, errorpage)
    
    def checkPage(self, page):
        path = self.docroot + page
        if os.path.isfile(path):
            return True
        else:
            return False
    
    def setEnvVars(self, querystring, reqtype, scriptpath, remoteaddr, ctype, clength, requri):
        os.putenv('SERVER_SOFTWARE', 'kHTTPd Mini')
        os.putenv('GATEWAY_INTERFACE', 'CGI/1.1')
        os.putenv('SERVER_PROTOCOL', 'HTTP/1.1')
        os.putenv('REDIRECT_STATUS', 'true')
        os.putenv('REMOTE_ADDR', remoteaddr)
        os.putenv('SCRIPT_FILENAME', scriptpath)
        os.putenv('REQUEST_METHOD', reqtype)
        os.putenv('REQUEST_URI', requri)
        if reqtype == 'GET':
            os.putenv('QUERY_STRING', querystring)
        if reqtype == 'POST':
            os.putenv('CONTENT_TYPE', ctype)
            os.putenv('CONTENT_LENGTH', clength)
    
    def setCookie(self, cookie):
        os.putenv('HTTP_COOKIE', cookie)
    
    def clearVars(self):
        os.putenv('SERVER_SOFTWARE', '')
        os.putenv('GATEWAY_INTERFACE', '')
        os.putenv('SERVER_PROTOCOL', '')
        os.putenv('REDIRECT_STATUS', '')
        os.putenv('REMOTE_ADDR', '')
        os.putenv('SCRIPT_FILENAME', '')
        os.putenv('REQUEST_METHOD', '')
        os.putenv('QUERY_STRING', '')
        os.putenv('CONTENT_TYPE', '')
        os.putenv('CONTENT_LENGTH', '')
        os.putenv('HTTP_COOKIE', '')
        
    def parse(self, page, request):
        path = self.docroot + page
        if self.checkPage(page) is True:
            phpProc = Popen([self.phpexec, path], stdout=PIPE, stdin=PIPE)
            out, err = phpProc.communicate(input=request)
            page = out.split('\r\n\r\n', 1)[1] ### Actual page content returned from php-cgi ###
            headers = out.split('\r\n\r\n', 1)[0]
            return self.response.phpCreate(complete, headers, page)
        else:
            return self.error.sendNotFound()
예제 #5
0
 def __init__(self, docroot, phpexec, errorpage):
     self.docroot = docroot
     self.phpexec = phpexec
     self.response = createResponse()
     self.error = PageSender(self.docroot, errorpage)
예제 #6
0
 def __init__(self, docroot, phpexec, errorpage):
     self.docroot = docroot
     self.phpexec = phpexec
     self.response = createResponse()
     self.error = PageSender(self.docroot, errorpage)
예제 #7
0
class handleRequest:
    def __init__(self, docroot, index, errorpage, phpstate, phpexec):
        self.docroot = docroot
        self.errorpage = errorpage
        self.index = index
        self.sender = PageSender(self.docroot, self.errorpage)
        self.php = handlePhp(self.docroot, phpexec, self.errorpage)
        self.phpstate = phpstate

    def handle(self, request, remoteaddr):
        if request.startswith('GET /'):
            try:
                ### Begin to parse the GET request ###
                self.get = parseGet(self.docroot, self.index, request)
                self.page = self.get.getReqPage()
                ### If the HTTP version is 1.1, begin page processing phase ###
                if self.get.getProto() == '1.1':
                    ### Fixing directory paths ###
                    if os.path.isdir(self.docroot + self.page) is True:
                        if not self.page.endswith('/'):
                            self.newLocation = 'http://' + self.get.getHost(
                            ) + self.page + '/' + self.index
                            return self.sender.sendNewLocation(
                                self.newLocation)
                        else:
                            self.page = self.page + self.index

                    ### Handles PHP page sending ###
                    if self.page.endswith('.php'):
                        if self.phpstate is True:
                            self.php.setEnvVars(
                                self.get.getVars(), 'GET',
                                os.path.abspath(self.docroot + self.page),
                                remoteaddr, '', '', self.get.getUri())
                            if self.get.getCookie() != '':
                                self.php.setCookie(self.get.getCookie())
                            page = self.php.parse(self.page,
                                                  self.get.getVars())
                            self.php.clearVars()
                            return page
                        else:
                            return self.sender.sendNotFound()

                    ### Send page normally ###
                    else:
                        return self.sender.openPage(self.page)

                ### If HTTP protocol is not 1.1, send 505 error ###
                else:
                    return self.sender.sendNotSupported()

            ### If the request type is correct but can't be parsed, send 400 error ###
            except:
                return self.sender.sendBadRequest()

        elif request.startswith('POST /'):
            try:
                ### Begin to parse the POST request ###
                self.post = parsePost(self.docroot, self.index, request)
                self.page = self.post.getReqPage()
                ### If the HTTP version is 1.1, begin page processing phase ###
                if self.post.getProto() == '1.1':
                    ### Fixing directory paths ###
                    if os.path.isdir(self.docroot + self.page) is True:
                        if not self.page.endswith('/'):
                            self.newLocation = 'http://' + self.post.getHost(
                            ) + self.page + '/' + self.index
                            return self.sender.sendNewLocation(
                                self.newLocation)
                        else:
                            self.page = self.page + self.index

                    ### Handles PHP page sending ###
                    if self.page.endswith('.php'):
                        if self.phpstate is True:
                            self.php.setEnvVars(
                                self.post.getVars(), 'POST',
                                os.path.abspath(self.docroot + self.page),
                                remoteaddr, self.post.getContentType(),
                                self.post.getContentLength(), self.page)
                            if self.post.getCookie() != '':
                                self.php.setCookie(self.get.getCookie())
                            page = self.php.parse(self.page,
                                                  self.post.getVars())
                            self.php.clearVars()
                            return page
                        else:
                            return self.sender.sendNotFound()

                    ### Send page normally ###
                    else:
                        return self.sender.openPage(self.page)

                ### If HTTP protocol is not 1.1, send 505 error ###
                else:
                    return self.sender.sendNotSupported()

            except:
                return self.sender.sendInternalError()
        ### If request type is not handled by the server, send 501 error ###
        else:
            return self.sender.sendNotImplemented()
예제 #8
0
class handleRequest:
    
    def __init__(self, docroot, index, errorpage, phpstate, phpexec):
        self.docroot = docroot
        self.errorpage = errorpage
        self.index = index
        self.sender = PageSender(self.docroot, self.errorpage)
        self.php = handlePhp(self.docroot, phpexec, self.errorpage)
        self.phpstate = phpstate
        
    def handle(self, request, remoteaddr):
        if request.startswith('GET /'):
            try:
                ### Begin to parse the GET request ###
                self.get = parseGet(self.docroot, self.index, request)
                self.page = self.get.getReqPage()
                ### If the HTTP version is 1.1, begin page processing phase ###
                if self.get.getProto() == '1.1':
                    ### Fixing directory paths ###
                    if os.path.isdir(self.docroot + self.page) is True:
                        if not self.page.endswith('/'):
                            self.newLocation = 'http://' + self.get.getHost() + self.page + '/' + self.index
                            return self.sender.sendNewLocation(self.newLocation)
                        else:
                            self.page = self.page + self.index
                    
                    ### Handles PHP page sending ###
                    if self.page.endswith('.php'):
                        if self.phpstate is True:
                            self.php.setEnvVars(self.get.getVars(), 'GET', os.path.abspath(self.docroot + self.page), 
                                                remoteaddr, '', '', self.get.getUri())    
                            if self.get.getCookie() != '':
                                self.php.setCookie(self.get.getCookie())                  
                            page =  self.php.parse(self.page, self.get.getVars())
                            self.php.clearVars()
                            return page
                        else:
                            return self.sender.sendNotFound()
                        
                    ### Send page normally ###
                    else:
                        return self.sender.openPage(self.page)
                    
                ### If HTTP protocol is not 1.1, send 505 error ###
                else:
                    return self.sender.sendNotSupported()
            
            ### If the request type is correct but can't be parsed, send 400 error ###
            except:
                return self.sender.sendBadRequest()
        
        elif request.startswith('POST /'):
            try:
                ### Begin to parse the POST request ###
                self.post = parsePost(self.docroot, self.index, request)
                self.page = self.post.getReqPage()         
                ### If the HTTP version is 1.1, begin page processing phase ###
                if self.post.getProto() == '1.1':
                    ### Fixing directory paths ###
                    if os.path.isdir(self.docroot + self.page) is True:
                        if not self.page.endswith('/'):
                            self.newLocation = 'http://' + self.post.getHost() + self.page + '/' + self.index
                            return self.sender.sendNewLocation(self.newLocation)
                        else:
                            self.page = self.page + self.index
                
                    ### Handles PHP page sending ###
                    if self.page.endswith('.php'):
                        if self.phpstate is True:
                            self.php.setEnvVars(self.post.getVars(), 'POST', os.path.abspath(self.docroot + self.page), 
                                                remoteaddr, self.post.getContentType(), self.post.getContentLength(), self.page)
                            if self.post.getCookie() != '':
                                self.php.setCookie(self.get.getCookie())
                            page = self.php.parse(self.page, self.post.getVars())
                            self.php.clearVars()
                            return page
                        else:
                            return self.sender.sendNotFound()
                        
                    ### Send page normally ###
                    else:
                        return self.sender.openPage(self.page) 
                               
                ### If HTTP protocol is not 1.1, send 505 error ###
                else:
                    return self.sender.sendNotSupported()
                     
            except:
                return self.sender.sendInternalError()
        ### If request type is not handled by the server, send 501 error ###
        else:
            return self.sender.sendNotImplemented()