Add content type parser
Тестирование ядра / Tester (push) Failing after 4s

This commit is contained in:
2026-04-22 11:47:41 +03:00
parent d8aa2b0299
commit 21f0386072
3 changed files with 59 additions and 1 deletions
@@ -0,0 +1,55 @@
__author__ = 'RemiZOffAlex'
__email__ = 'remizoffalex@mail.ru'
class ContentType:
def __init__(self, **kwargs):
'''
Parse a string into a ContentType object.
'''
self.value = kwargs['value']
self.media_type = kwargs['media_type']
self.type = kwargs['type']
self.subtype = kwargs['subtype']
self.prefix = kwargs.get('prefix')
self.suffix = kwargs.get('suffix')
self.parameters = kwargs.get('parameters')
self.charset = kwargs.get('charset')
def contenttype_parse(raw):
if not raw:
raise 'Content-Type is empty.'
parts = raw.split(';', 1)
media_type = parts[0].strip()
content_type, subtype = parts[0].split('/')
prefix = None
suffix = None
if '.' in subtype:
prefix, subtype = subtype.split('.')
if '+' in subtype:
subtype, suffix = subtype.split('+')
# Parse content type parameters
parameters = {}
charset = None
for parameter in parts[1:]:
parameter = parameter.strip()
if '=' in parameter:
key, param_value = parameter.split('=', 1)
parameters[key.strip()] = param_value.strip()
if key.strip() == 'charset':
charset = param_value
else:
parameters[parameter] = True
return ContentType(
value=raw,
media_type=media_type,
type=content_type,
prefix=prefix,
subtype=subtype,
suffix=suffix,
parameters=parameters,
charset=charset
)
+3 -1
View File
@@ -2,6 +2,7 @@ __author__ = 'RemiZOffAlex'
__email__ = 'remizoffalex@mail.ru'
from nucleus.domains.http.models.request import Request
from .contenttype import contenttype_parse
from .json import parse_json
@@ -67,7 +68,8 @@ def parse(raw):
request.headers[key] = value
if request.method=='POST':
if 'Content-Type' in request.headers:
if request.headers['Content-Type']=='application/json; charset=UTF-8':
request.content_type = contenttype_parse(request.headers['Content-Type'])
if request.content_type.media_type=='application/json':
request.json = parse_json(body)
request.is_json = True
return request
+1
View File
@@ -35,6 +35,7 @@ class TestRequestParse(unittest.TestCase):
def test_parse_post_json(self):
raw = b'POST /api HTTP/1.1\r\nHost: 10.2.0.1:9000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36\r\nContent-Length: 277\r\nAccept: application/json, text/*\r\nAccept-Language: ru,en-US;q=0.9,en;q=0.8\r\nContent-Type: application/json; charset=UTF-8\r\nCookie: specialistoff_net=eyJpcCI6IjE5Mi4xNjguMzMuODgiLCJ1c2VyX2lkIjoxfQ.aMimlA.Lm8R-IvrbW_1MTtM5An50NH-154; session=eyJpcCI6IjE3Mi4xNi4xLjEiLCJ1c2VyX2lkIjoxfQ.acgSFg.5KkGM_fT5IDNodYcytMzJHd7prk\r\nX-Forwarded-For: 192.18.3.1\r\nX-Forwarded-Host: 10.2.0.1:9000\r\nX-Forwarded-Port: 9000\r\nX-Forwarded-Proto: http\r\nX-Forwarded-Server: 8dd1deb61302\r\nX-Real-Ip: 192.18.3.1\r\nAccept-Encoding: gzip\r\n\r\n[{"jsonrpc":"2.0","method":"questions","params":{"page":1,"order_by":{"field":"id","order":"desc"},"fields":["id","title","created","updated",{"tags":["id","name"],"user":["id","name"]}]},"id":"1099d48b231bb"},{"jsonrpc":"2.0","method":"questions.count","id":"41dbfec0441e68"}]'
raw = b'POST /api HTTP/1.1\r\nHost: 10.2.0.1:9000\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0\r\nContent-Length: 276\r\nAccept: application/json, text/*\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7\r\nCache-Control: no-cache\r\nContent-Type: application/json; charset=utf-8\r\nOrigin: http://10.2.0.1:9000\r\nPragma: no-cache\r\nReferer: http://10.2.0.1:9000/questions\r\nX-Forwarded-For: 192.18.3.1\r\nX-Forwarded-Host: 10.2.0.1:9000\r\nX-Forwarded-Port: 9000\r\nX-Forwarded-Proto: http\r\nX-Forwarded-Server: 8dd1deb61302\r\nX-Real-Ip: 192.18.3.1\r\n\r\n[{"jsonrpc":"2.0","method":"questions","params":{"page":1,"order_by":{"field":"id","order":"desc"},"fields":["id","title","created","updated",{"tags":["id","name"],"user":["id","name"]}]},"id":"6759189805cce"},{"jsonrpc":"2.0","method":"questions.count","id":"821f0655b5d4d"}]'
request = parse(raw)
self.assertTrue(request.is_json)