From ba50ef22e3de777e6da86ec60582dd3b7844479a Mon Sep 17 00:00:00 2001 From: yizhi <946185759@qq.com> Date: Wed, 6 Apr 2022 13:53:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8D=A2=E8=A1=8C=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/reader.ts | 52 +++++++++++++++------------------------------------ 2 files changed, 16 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index 9e29a64..c3c5561 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yizhi-multipart-reader", - "version": "1.0.2", + "version": "1.0.3", "description": "", "main": "dist/index.js", "types": "typing/index.d.ts", diff --git a/src/reader.ts b/src/reader.ts index 04bf468..9f01598 100644 --- a/src/reader.ts +++ b/src/reader.ts @@ -181,23 +181,12 @@ export class MultipartReader { if (this.#boundary.compare(data, 0, this.#boundary.length) == 0) data = data.slice(this.#boundary.length) else throw new Error('multipart body error') //去除\r\n - if (data[0] == 13) { - data = data.slice(1) - if (data[0] == 10) data = data.slice(1) // \r - else throw new Error('multipart body error') // \r后面必须时\n - } - //去除\n - else if (data[0] == 10) data = data.slice(1) - //遇到 -- , 可能就要结束了 - else if (data[0] == 45 && data[1] == 45) { - //看看是否有换行,有换行表示结束 - if (data[2] == 10 || (data[2] == 13 && data[3] == 10)) { - this.#saveHeader() - this.#state = ReadState.finish - return { left: null, exit: true } - } - //否则就当出错 - else throw new Error('multipart body error') + if (data[0] == 13 && data[1] == 10) data = data.slice(2) + //遇到 --\r\n,表示读取完毕 + else if (data[0] == 45 && data[1] == 45 && data[2] == 13 && data[3] == 10) { + this.#saveHeader() + this.#state = ReadState.finish + return { left: null, exit: true } } //上面的情况都不是,表示出错了 else throw new Error('multipart body error') @@ -213,26 +202,20 @@ export class MultipartReader { let endAt = 0 for (let i = 0; i < data.length; ++i) { // 检测是不是两个连续换行 - if (data[i] == 10) { - if (data[i + 1] == 10) { - endAt = i + 1 - break - } - else if (data[i + 1] == 13 && data[i + 2] == 10) { - endAt = i + 2 - break - } + if (data[i] == 13 && data[i + 1] == 10 && data[i + 2] == 13 && data[i + 3] == 10) { + endAt = i + 4 + break } } //如果头读取完成,则读取body if (endAt) { //取得头 - const header = this.#headBuffer ? Buffer.concat([this.#headBuffer, data.slice(0, endAt + 1)]) : data.slice(0, endAt + 1) + const header = this.#headBuffer ? Buffer.concat([this.#headBuffer, data.slice(0, endAt)]) : data.slice(0, endAt) this.#headBuffer = null await this.#resolveHead((header + '').trim()) //读取内容 this.#state = ReadState.content - return { left: data.slice(endAt + 1), exit: false } + return { left: data.slice(endAt), exit: false } } //否则将内容缓存起来,下次处理 else { @@ -244,15 +227,10 @@ export class MultipartReader { //读取内容(头读取完后,就要读取内容了) async #readContent(data: Buffer): Promise { for (let i = 0; i < data.length; ++i) { - //处理换行 - let gotbr = 0 - if (data[i] == 10) gotbr = 1 - else if (data[i] == 13 && data[i + 1] == 10) gotbr = 2 - //遇到换行,那么很有可能就遇到了分隔符 - if (gotbr) { + if (data[i] == 13 && data[i + 1] == 10) { //看看内容够不够,不够啦?先保存起来,剩下的下次处理 - if (data.length - i - gotbr - 2 < this.#boundary.length) { //-gotbr表示减去换行符,-2表示减去分隔符开始的-- + if (data.length - i - 4 < this.#boundary.length) { //-4表示减去分隔符开始的--以及换行符 // 保存数据 await this.#resolveData(data.slice(0, i)) //剩下的可能时分隔符的内容留着下次处理 @@ -261,13 +239,13 @@ export class MultipartReader { //内容充足,处理内容 else { //跳过换行符 - i += gotbr + i += 2 //遇到了 -- ,后面很有可能时分隔符,瞧一眼 if (data[i] == 45 && data[i + 1] == 45) { //看看是不是遇到了分隔符 if (this.#boundary.compare(data, i + 2, i + 2 + this.#boundary.length) == 0) { //保存数据 - await this.#resolveData(data.slice(0, i - gotbr)) + await this.#resolveData(data.slice(0, i - 2)) //去除最后的\r\n进行读取 //接下来读取分隔符 this.#state = ReadState.boundary return { left: data.slice(i), exit: false }