| 103 | self.messages.append(message) |
| 104 | |
| 105 | async def parse(self) -> FormData: |
| 106 | class="cm"># Callbacks dictionary. |
| 107 | callbacks: QuerystringCallbacks = { |
| 108 | class="st">"on_field_start": self.on_field_start, |
| 109 | class="st">"on_field_name": self.on_field_name, |
| 110 | class="st">"on_field_data": self.on_field_data, |
| 111 | class="st">"on_field_end": self.on_field_end, |
| 112 | class="st">"on_end": self.on_end, |
| 113 | } |
| 114 | |
| 115 | class="cm"># Create the parser. |
| 116 | parser = multipart.QuerystringParser(callbacks) |
| 117 | field_name = bytearray() |
| 118 | field_value = bytearray() |
| 119 | |
| 120 | items: list[tuple[str, str | UploadFile]] = [] |
| 121 | |
| 122 | class="cm"># Feed the parser with data from the request. |
| 123 | async for chunk in self.stream: |
| 124 | if chunk: |
| 125 | parser.write(chunk) |
| 126 | else: |
| 127 | parser.finalize() |
| 128 | messages = list(self.messages) |
| 129 | self.messages.clear() |
| 130 | for message_type, message_bytes in messages: |
| 131 | if message_type == FormMessage.FIELD_START: |
| 132 | field_name = bytearray() |
| 133 | field_value = bytearray() |
| 134 | elif message_type == FormMessage.FIELD_NAME: |
| 135 | field_name.extend(message_bytes) |
| 136 | elif message_type == FormMessage.FIELD_DATA: |
| 137 | field_value.extend(message_bytes) |
| 138 | elif message_type == FormMessage.FIELD_END: |
| 139 | name = unquote_plus(field_name.decode(class="st">"latin-1")) |
| 140 | value = unquote_plus(field_value.decode(class="st">"latin-1")) |
| 141 | items.append((name, value)) |
| 142 | |
| 143 | return FormData(items) |
| 144 | |
| 145 | |
| 146 | class MultiPartParser: |