diff --git a/src/http/kernel/module/ParseIncomingBodyHTTPModule.ts b/src/http/kernel/module/ParseIncomingBodyHTTPModule.ts index ad91598..506a7d7 100644 --- a/src/http/kernel/module/ParseIncomingBodyHTTPModule.ts +++ b/src/http/kernel/module/ParseIncomingBodyHTTPModule.ts @@ -30,8 +30,51 @@ export class ParseIncomingBodyHTTPModule extends HTTPKernelModule { protected readonly logging!: Logging public async apply(request: Request): Promise { - if ( !request.getHeader('content-type') ) return request + const contentType = request.getHeader('content-type') + const contentTypes = (Array.isArray(contentType) ? contentType : [contentType]) + .filter(Boolean).map(x => x!.toLowerCase()) + if ( !contentType ) return request + + if ( + contentTypes.includes('multipart/form-data') + || contentTypes.includes('application/x-www-form-urlencoded') + ) { + return this.applyBusboy(request) + } + + if ( contentTypes.includes('application/json') ) { + return this.applyJSON(request) + } + + return request + } + + public async applyJSON(request: Request): Promise { + await new Promise((res, rej) => { + let data = '' + + request.toNative().on('data', chunk => { + data += chunk + }) + + request.toNative().on('end', () => { + try { + const body = JSON.parse(data) + for ( const key in body ) { + if ( !body.hasOwnProperty(key) ) continue + request.parsedInput[key] = body[key] + } + res() + } catch (e) { + rej(e) + } + }) + }) + + return request + } + public async applyBusboy(request: Request): Promise { const config = this.config.get('server.uploads', {}) await new Promise((res, rej) => {