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()
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()
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()
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()