(self, event: Event)
| 298 | self.state = State.PREAMBLE |
| 299 | |
| 300 | def send_event(self, event: Event) -> bytes: |
| 301 | if isinstance(event, Preamble) and self.state == State.PREAMBLE: |
| 302 | self.state = State.PART |
| 303 | return event.data |
| 304 | elif isinstance(event, (Field, File)) and self.state in { |
| 305 | State.PREAMBLE, |
| 306 | State.PART, |
| 307 | State.DATA, |
| 308 | }: |
| 309 | data = b"\r\n--" + self.boundary + b"\r\n" |
| 310 | data += b'Content-Disposition: form-data; name="%s"' % event.name.encode() |
| 311 | if isinstance(event, File): |
| 312 | data += b'; filename="%s"' % event.filename.encode() |
| 313 | data += b"\r\n" |
| 314 | for name, value in t.cast(Field, event).headers: |
| 315 | if name.lower() != "content-disposition": |
| 316 | data += f"{name}: {value}\r\n".encode() |
| 317 | self.state = State.DATA_START |
| 318 | return data |
| 319 | elif isinstance(event, Data) and self.state == State.DATA_START: |
| 320 | self.state = State.DATA |
| 321 | if len(event.data) > 0: |
| 322 | return b"\r\n" + event.data |
| 323 | else: |
| 324 | return event.data |
| 325 | elif isinstance(event, Data) and self.state == State.DATA: |
| 326 | return event.data |
| 327 | elif isinstance(event, Epilogue): |
| 328 | self.state = State.COMPLETE |
| 329 | return b"\r\n--" + self.boundary + b"--\r\n" + event.data |
| 330 | else: |
| 331 | raise ValueError(f"Cannot generate {event} in state: {self.state}") |
no outgoing calls