http_server_async: a bunch of bugfixes
This commit is contained in:
parent
b2b67b2ed8
commit
5b455035b2
|
@ -47,6 +47,9 @@ class Headers(DotDict):
|
||||||
logging.warning('Do not set the "Cookie" or "Set-Cookie" headers')
|
logging.warning('Do not set the "Cookie" or "Set-Cookie" headers')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
elif key == 'Date':
|
||||||
|
value = DateItem(value)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self[key].append(value)
|
self[key].append(value)
|
||||||
|
|
||||||
|
@ -54,6 +57,15 @@ class Headers(DotDict):
|
||||||
super().__setitem__(key, HeaderItem(key, value))
|
super().__setitem__(key, HeaderItem(key, value))
|
||||||
|
|
||||||
|
|
||||||
|
def as_dict(self):
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
for k,v in self.items():
|
||||||
|
data[k] = str(v)
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def getone(self, key, default=None):
|
def getone(self, key, default=None):
|
||||||
try:
|
try:
|
||||||
return self[key].one()
|
return self[key].one()
|
||||||
|
@ -298,3 +310,23 @@ class HeaderItem(list):
|
||||||
def update(self, *items):
|
def update(self, *items):
|
||||||
for item in items:
|
for item in items:
|
||||||
self.append(item)
|
self.append(item)
|
||||||
|
|
||||||
|
|
||||||
|
class DateItem(str):
|
||||||
|
_datetime = None
|
||||||
|
|
||||||
|
def __new__(cls, date):
|
||||||
|
new_date = str.__new__(cls, date)
|
||||||
|
new_date._datetime = datetime.strptime(date, '%a, %d %b %Y %H:%M:%S GMT').replace(tzinfo=UtcTime)
|
||||||
|
return new_date
|
||||||
|
|
||||||
|
|
||||||
|
@property
|
||||||
|
def utc(self):
|
||||||
|
return self._datetime.astimezone(UtcTime)
|
||||||
|
|
||||||
|
|
||||||
|
@property
|
||||||
|
def local(self):
|
||||||
|
return self._datetime.astimezone(LocalTime)
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ LocalTime = datetime.now(UtcTime).astimezone().tzinfo
|
||||||
|
|
||||||
class Request:
|
class Request:
|
||||||
__slots__ = [
|
__slots__ = [
|
||||||
'_body', '_form', '_reader', 'app', 'address',
|
'_body', '_form', '_reader', '_method', 'app', 'address',
|
||||||
'method', 'path', 'version', 'headers', 'cookies',
|
'path', 'version', 'headers', 'cookies',
|
||||||
'query', 'raw_query'
|
'query', 'raw_query'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ class Request:
|
||||||
self._reader = reader
|
self._reader = reader
|
||||||
self._body = b''
|
self._body = b''
|
||||||
self._form = DotDict()
|
self._form = DotDict()
|
||||||
|
self._method = None
|
||||||
|
|
||||||
self.headers = Headers()
|
self.headers = Headers()
|
||||||
self.cookies = Cookies()
|
self.cookies = Cookies()
|
||||||
|
@ -34,7 +35,6 @@ class Request:
|
||||||
|
|
||||||
self.app = app
|
self.app = app
|
||||||
self.address = address
|
self.address = address
|
||||||
self.method = None
|
|
||||||
self.path = None
|
self.path = None
|
||||||
self.version = None
|
self.version = None
|
||||||
self.raw_query = None
|
self.raw_query = None
|
||||||
|
@ -50,16 +50,19 @@ class Request:
|
||||||
|
|
||||||
def __getattr__(self, key):
|
def __getattr__(self, key):
|
||||||
if key in self.__slots__:
|
if key in self.__slots__:
|
||||||
return super().__getattr__(self, key)
|
return super().__getattribute__(self, key)
|
||||||
|
|
||||||
|
try:
|
||||||
return self.ctx[key]
|
return self.ctx[key]
|
||||||
|
except:
|
||||||
|
raise AttributeError(key)
|
||||||
|
|
||||||
|
|
||||||
def __setattr__(self, key, value):
|
def __setattr__(self, key, value):
|
||||||
if key in self.__slots__:
|
try:
|
||||||
super().__setattr__(key, value)
|
super().__setattr__(key, value)
|
||||||
|
|
||||||
else:
|
except:
|
||||||
self.ctx[key] = value
|
self.ctx[key] = value
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,6 +104,16 @@ class Request:
|
||||||
return self.headers.getone('X-Real-Ip', self.headers.getone('X-Forwarded-For', self.address))
|
return self.headers.getone('X-Real-Ip', self.headers.getone('X-Forwarded-For', self.address))
|
||||||
|
|
||||||
|
|
||||||
|
@property
|
||||||
|
def method(self):
|
||||||
|
return self._method
|
||||||
|
|
||||||
|
|
||||||
|
@method.setter
|
||||||
|
def method(self, data):
|
||||||
|
self._method = data.upper()
|
||||||
|
|
||||||
|
|
||||||
async def read(self, length=2048, timeout=None):
|
async def read(self, length=2048, timeout=None):
|
||||||
try: return await asyncio.wait_for(self._reader.read(length), timeout or self.app.cfg.timeout)
|
try: return await asyncio.wait_for(self._reader.read(length), timeout or self.app.cfg.timeout)
|
||||||
except: return
|
except: return
|
||||||
|
@ -118,6 +131,11 @@ class Request:
|
||||||
|
|
||||||
|
|
||||||
async def dict(self):
|
async def dict(self):
|
||||||
|
logging.warning('Request.dict will be removed in a future update')
|
||||||
|
return DotDict(await self.body())
|
||||||
|
|
||||||
|
|
||||||
|
async def json(self):
|
||||||
return DotDict(await self.body())
|
return DotDict(await self.body())
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue