(
readable: ReadableStream<Uint8Array>,
boundary: Uint8Array,
)
| 96 | } |
| 97 | |
| 98 | async *#handle( |
| 99 | readable: ReadableStream<Uint8Array>, |
| 100 | boundary: Uint8Array, |
| 101 | ): AsyncGenerator<FormDataEntry> { |
| 102 | const decoder = new TextDecoder(); |
| 103 | const reader = readable.pipeThrough( |
| 104 | new CappedDelimiterStream({ |
| 105 | delimiter: Uint8Array.from([13, 10]), |
| 106 | limit: 1024 * 8 - 2, |
| 107 | }), |
| 108 | ).getReader(); |
| 109 | |
| 110 | let buffer = (await reader.read()).value?.value; |
| 111 | // Ignore Preamble |
| 112 | while (buffer != undefined) { |
| 113 | if ( |
| 114 | buffer.length >= boundary.length && |
| 115 | boundary.every((x, i) => x === buffer![i]) |
| 116 | ) break; |
| 117 | buffer = (await reader.read()).value?.value; |
| 118 | } |
| 119 | |
| 120 | let defaultContentType = "text/plain; charset=UTF-8"; |
| 121 | while ( |
| 122 | buffer != undefined && buffer[boundary.length] !== 45 && |
| 123 | buffer[boundary.length + 1] !== 45 |
| 124 | ) { |
| 125 | buffer = (await reader.read()).value?.value; |
| 126 | if (buffer == undefined) throw new SyntaxError("Unexpected EOF"); |
| 127 | if (!buffer.length) { |
| 128 | throw new SyntaxError( |
| 129 | "Missing Content-Disposition header within FormData segment", |
| 130 | ); |
| 131 | } |
| 132 | |
| 133 | // Header |
| 134 | let name: string | undefined; |
| 135 | let filename: string | undefined; |
| 136 | let contentType = defaultContentType; |
| 137 | do { |
| 138 | const header = decoder.decode(buffer); |
| 139 | if (header.startsWith("Content-Disposition:")) { |
| 140 | const x = header |
| 141 | .slice(header.indexOf(":") + 1) |
| 142 | .split(";") |
| 143 | .map((x) => x.trim()); |
| 144 | if (x.findIndex((x) => x === "form-data") === -1) { |
| 145 | throw new SyntaxError("Content-Disposition was not of form-data"); |
| 146 | } |
| 147 | name = x |
| 148 | .find((x) => x.startsWith("name=")) |
| 149 | ?.split("=")[1]; |
| 150 | if (name == undefined) { |
| 151 | throw new SyntaxError("Content-Disposition missing name field"); |
| 152 | } |
| 153 | if (name.startsWith('"')) name = name.slice(1, -1); |
| 154 | |
| 155 | filename = x |
no test coverage detected