import sys import io import json from lnwsgi.reqvar import RequestParameters class WSGIRequest: def __init__(self,application,environ): self.__application = application self.__environ = environ self.__scheme = self.__environ[ "wsgi.url_scheme" ].lower() self.method = self.__environ["REQUEST_METHOD"].upper() if "HTTP_HOST" in self.__environ: self.__hostname = self.__environ[ "HTTP_HOST" ] else: self.__hostname = self.__environ[ "SERVER_NAME" ] self.__port = int(self.__environ[ "SERVER_PORT" ]) self.__script = self.__environ[ "SCRIPT_NAME" ] self.path = self.__environ[ "PATH_INFO" ] if "QUERY_STRING" in self.__environ: self.__query = self.__environ[ "QUERY_STRING" ] else: self.__query = "" if "CONTENT_TYPE" in self.__environ: self.content_type = self.__environ["CONTENT_TYPE"] if "wsgi.input" in self.__environ: self.__content = self.__environ["wsgi.input"].read() else: self.__content = bytes() self.parameters = RequestParameters( self ) self.__status = 200 self.__response_headers = {} self.setResponseHeader("content-type","text/html") self.__walked = [] self.__interpretAccepts() self.__identity = application.authenticate( self ) def identity(self): return self.__identity def __interpretAccepts(self): self.__accepts = [] if "HTTP_ACCEPTS" in self.__environ: al = self.__environ["HTTP_ACCEPTS"].split(",") for a in al: t = a.split(";") mtype = t[0].strip() self.__accepts.append( mtype.lower() ) def __contains__(self, name): return name in self.__environ def __getitem__(self, name): return self.__environ[name] def __iter__(self): return self.__environ.__iter__() def getOrNone(self, name): if name in self: return self[name] return None def accepts(self): return list( self.__accepts ) def status(self, sc = None): if not sc is None: self.__status = sc return self.__status def content(self): return self.__content def json(self): return json.loads(self.__content.decode()) def query(self): return self.__query def pushWalkedObject(self, wo): self.__walked.append( wo ) def walkedObjects(self): return list( self.__walked ) def self(self, path = None): if self.__application.url is None: url = "{0}://{1}".format(self.__scheme,self.__hostname) else: url = self.__application.url # if not ((self.__scheme == "http" and self.__port == 80) or (self.__scheme == "https" and self.__port == 443)): # url = "{0}:{1}".format(url, self.__port) if path is None: path = self.path url = "{0}{1}{2}".format(url,self.__script,path) return url; def getResponseHeaders(self): return dict( self.__response_headers ) def listResponseHeaders(self): rh = [] for n in self.__response_headers: rh.append( (n, self.__response_headers[n] ) ) return rh def setResponseHeader(self, name, value): if value is None: del self.__response_headers[ name.lower() ] else: self.__response_headers[ name.lower() ] = value def __str__(self): s = io.StringIO() s.write("{method:8} {path}".format(**self.__dict__)) return s.getvalue()