126 lines
3.5 KiB
Python
126 lines
3.5 KiB
Python
from typing import Dict, Optional, Tuple
|
|
|
|
import multipart
|
|
|
|
class Part:
|
|
headers = []
|
|
data : bytes
|
|
|
|
def __repr__(self):
|
|
return f"Part(headers={repr(self.headers)}, data={self.data})"
|
|
|
|
class Header:
|
|
name : bytes
|
|
value : bytes
|
|
|
|
def __repr__(self):
|
|
return f"{self.name}:{self.value}"
|
|
|
|
def get_body_from_form_data(
|
|
body: bytes, boundary: str
|
|
) -> Tuple[Optional[bytes], Dict[str, str]]:
|
|
print("YO BYTES", body)
|
|
|
|
current_part = Part()
|
|
parts = []
|
|
|
|
def on_part_begin():
|
|
current_part = Part()
|
|
print("YO PART BEGAN")
|
|
return
|
|
|
|
def on_part_data(b,s,e):
|
|
current_part.data = b[s:e]
|
|
print("YO PART DATA", b[s:e])
|
|
return
|
|
|
|
def on_part_end():
|
|
parts.append(current_part)
|
|
print("YO PART ENDED")
|
|
return
|
|
|
|
def on_header_begin():
|
|
print("YO HEADER BEGIN")
|
|
return
|
|
|
|
def on_header_end():
|
|
print("YO HEADER END")
|
|
return
|
|
|
|
def on_header_field(b,s,e):
|
|
h = Header()
|
|
h.name = b[s:e]
|
|
current_part.headers.append(h)
|
|
print("YO HEADER FIELD", )
|
|
return
|
|
|
|
def on_header_value(b,s,e):
|
|
current_part.headers[-1].value = b[s:e]
|
|
print("YO HEADER VALUE", b[s:e])
|
|
return
|
|
|
|
def on_headers_finished():
|
|
print("YO HEADER FINISHED")
|
|
return
|
|
|
|
def on_end():
|
|
print("YO END")
|
|
return
|
|
|
|
parser = multipart.MultipartParser(
|
|
boundary=boundary,
|
|
callbacks={
|
|
"on_part_begin": on_part_begin,
|
|
"on_part_data": on_part_data,
|
|
"on_part_end": on_part_end,
|
|
"on_header_field": on_header_field,
|
|
"on_header_value": on_header_value,
|
|
"on_header_end": on_header_end,
|
|
"on_headers_finished": on_headers_finished,
|
|
"on_end": on_end,
|
|
}
|
|
)
|
|
parser.write(body)
|
|
parser.finalize()
|
|
|
|
print("YO PARTS", parts)
|
|
data = None
|
|
headers: Dict[str, str] = {}
|
|
|
|
for part in parts:
|
|
if data is None:
|
|
for header in part.headers:
|
|
print("YO CHECKING ", header.value)
|
|
if b'name="upload_file"' in header.value:
|
|
headers["key"] = "upload_file"
|
|
data = part.data
|
|
print("YO SET UPLOAD FILE")
|
|
break
|
|
else:
|
|
if b'name="file"' in header.value:
|
|
data = part.data
|
|
print("YO SETTING FILE")
|
|
break
|
|
else:
|
|
headers["file"] = part.data.decode("utf-8")
|
|
print("YO COPING OUT")
|
|
break
|
|
|
|
# name="x-amz-algorithm"', b'Content-Disposition':b'form-data; name="x-amz-credential"', b'Content-Disposition':b'form-data; name="x-amz-date"', b'Content-Disposition':b'form-data; name="policy"', b'Content-Disposition':b'form-data; name="x-amz-signature"', b'Content-Disposition':b'form-data; name="file"; filename="/run/user/1001/tmpi1gf2n_j/test_local_file.txt"'],
|
|
# for prt in parser.parts():
|
|
# if prt.name == "upload_file":
|
|
# headers["key"] = prt.name
|
|
# data = prt.file.read()
|
|
# else:
|
|
# val = prt.file.read()
|
|
# if prt.name == "file":
|
|
# data = val
|
|
# else:
|
|
# headers[prt.name] = val.decode("utf-8")
|
|
print("YO HEADERS", headers)
|
|
print("YO DATA ", data)
|
|
return data, headers
|
|
|
|
# form_data file
|
|
# form_data key
|