moto/moto/moto_proxy/utils.py
2024-03-29 18:34:05 +00:00

128 lines
3.6 KiB
Python

from typing import Dict, Optional, Tuple
import re
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:
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")
else:
if b'name="file"' in header.value:
data = part.data
print("YO SETTING FILE")
else:
match = re.search(r'name="([^"]*)"', header.value)
if match:
name = match.group(1)
print("YO GOT NAME", name)
headers[name] = part.data.decode("utf-8")
print("YO AYY")
print("YO COPING OUT")
# 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