Skip to content

Commit

Permalink
Fix denoland/std#409 handle multipart header in mime reader (denoland…
Browse files Browse the repository at this point in the history
  • Loading branch information
zekth authored and ry committed May 18, 2019
1 parent 715fe33 commit ef4fd3d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
19 changes: 18 additions & 1 deletion textproto/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ export class TextProtoReader {

while (true) {
let [kv, err] = await this.readLineSlice(); // readContinuedLineSlice
if (kv.byteLength == 0) {

if (kv.byteLength === 0) {
return [m, err];
}

Expand Down Expand Up @@ -140,15 +141,31 @@ export class TextProtoReader {
// Go's len(typed nil) works fine, but not in JS
return [new Uint8Array(0), err];
}

// Avoid the copy if the first call produced a full line.
if (line == null && !more) {
if (this.skipSpace(l) === 0) {
return [new Uint8Array(0), null];
}
return [l, null];
}

line = append(line, l);
if (!more) {
break;
}
}
return [line, null];
}

skipSpace(l: Uint8Array): number {
let n = 0;
for (let i = 0; i < l.length; i++) {
if (l[i] === charCode(" ") || l[i] === charCode("\t")) {
continue;
}
n++;
}
return n;
}
}
17 changes: 17 additions & 0 deletions textproto/reader_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,20 @@ test({
assert(err instanceof ProtocolError);
}
});

test({
name: "[textproto] #409 issue : multipart form boundary",
async fn(): Promise<void> {
const input = [
"Accept: */*\r\n",
'Content-Disposition: form-data; name="test"\r\n',
" \r\n",
"------WebKitFormBoundaryimeZ2Le9LjohiUiG--\r\n\n"
];
const r = reader(input.join(""));
let [m, err] = await r.readMIMEHeader();
assertEquals(m.get("Accept"), "*/*");
assertEquals(m.get("Content-Disposition"), 'form-data; name="test"');
assert(!err);
}
});

0 comments on commit ef4fd3d

Please sign in to comment.