lnwsgi/lnwsgi/request.py

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