144 lines
3.1 KiB
Python
Executable File
144 lines
3.1 KiB
Python
Executable File
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()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|