MCPcopy Create free account
hub / github.com/denoland/std / #handle

Method #handle

http/unstable_formdata_decoder_stream.ts:98–252  ·  view source on GitHub ↗
(
    readable: ReadableStream<Uint8Array>,
    boundary: Uint8Array,
  )

Source from the content-addressed store, hash-verified

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

Callers 1

constructorMethod · 0.95

Calls 7

#createLockMethod · 0.95
startsWithMethod · 0.80
findIndexMethod · 0.80
readMethod · 0.65
fromMethod · 0.45
sliceMethod · 0.45
findMethod · 0.45

Tested by

no test coverage detected