1- import { createReadStream , writeFileSync } from "fs" ;
2-
31import FormData from "form-data" ;
4- import { join } from "path" ;
52import qs from "qs" ;
63
74const requestMetadataKey = "request" ;
85const mpFormMetadataKey = "multipart_form" ;
96
107export function serializeRequestBody ( request : any ) : [ object , any ] {
11- const fieldNames : string [ ] = Object . getOwnPropertyNames ( request ) ;
8+ if ( ! request . hasOwnProperty ( requestMetadataKey ) ) {
9+ throw new Error ( "request body not found" ) ;
10+ }
11+ const requestBodyObj = request [ requestMetadataKey ] ;
12+ const fieldNames : string [ ] = Object . getOwnPropertyNames ( requestBodyObj ) ;
1213 let [ requestHeaders , requestBody ] : [ object , any ] = [ { } , { } ] ;
1314 fieldNames . forEach ( ( fname ) => {
1415 const requestAnn : string = Reflect . getMetadata (
1516 requestMetadataKey ,
16- request ,
17+ requestBodyObj ,
1718 fname
1819 ) ;
1920 if ( requestAnn == null ) return ;
@@ -22,22 +23,35 @@ export function serializeRequestBody(request: any): [object, any] {
2223 switch ( requestDecorator . MediaType ) {
2324 case "multipart/form-data" :
2425 case "multipart/mixed" :
25- requestBody = encodeMultipartFormData ( request [ fname ] ) ;
26+ requestBody = encodeMultipartFormData ( requestBodyObj [ fname ] ) ;
2627 requestHeaders = ( requestBody as FormData ) . getHeaders ( ) ;
2728 break ;
2829 case "application/x-www-form-urlencoded" :
2930 [ requestHeaders , requestBody ] = [
3031 { "Content-Type" : `${ requestDecorator . MediaType } ` } ,
31- qs . stringify ( { ... request [ fname ] } ) ,
32+ qs . stringify ( requestBodyObj [ fname ] ) ,
3233 ] ;
3334 break ;
3435 case "application/json" :
3536 case "text/json" :
36- default :
3737 [ requestHeaders , requestBody ] = [
3838 { "Content-Type" : `${ requestDecorator . MediaType } ` } ,
39- { ...request [ fname ] } ,
39+ { ...requestBodyObj [ fname ] } ,
4040 ] ;
41+ break ;
42+ default :
43+ requestBody = requestBodyObj [ fname ] ;
44+ const requestBodyType : string = typeof requestBody ;
45+ if (
46+ requestBodyType === "string" ||
47+ requestBody instanceof String ||
48+ requestBody instanceof Uint8Array
49+ )
50+ requestHeaders = { "Content-Type" : `${ requestDecorator . MediaType } ` } ;
51+ else
52+ throw new Error (
53+ `invalid request body type ${ requestBodyType } for mediaType ${ requestDecorator . MediaType } `
54+ ) ;
4155 }
4256 } ) ;
4357 return [ requestHeaders , requestBody ] ;
@@ -58,14 +72,14 @@ function encodeMultipartFormData(form: any): FormData {
5872 if ( mpFormDecorator . File )
5973 return encodeMultipartFormDataFile ( formData , form [ fname ] ) ;
6074 else if ( mpFormDecorator . JSON ) {
61- formData . append ( mpFormDecorator . Name , { ... form [ fname ] } ) ;
75+ formData . append ( mpFormDecorator . Name , JSON . stringify ( form [ fname ] ) ) ;
6276 } else {
6377 if ( Array . isArray ( form [ fname ] ) ) {
6478 form [ fname ] . forEach ( ( val : any ) => {
65- formData . append ( mpFormDecorator . Name + "[]" , JSON . stringify ( val ) ) ;
79+ formData . append ( mpFormDecorator . Name + "[]" , String ( val ) ) ;
6680 } ) ;
6781 } else {
68- formData . append ( mpFormDecorator . Name , JSON . stringify ( form [ fname ] ) ) ;
82+ formData . append ( mpFormDecorator . Name , String ( form [ fname ] ) ) ;
6983 }
7084 }
7185 } ) ;
@@ -98,14 +112,12 @@ function encodeMultipartFormDataFile(formData: FormData, file: any): FormData {
98112 }
99113 } ) ;
100114
101- if ( mpFormDecoratorName === "" || fileName === "" || content == null )
115+ if ( mpFormDecoratorName === "" || fileName === "" || content == null ) {
102116 throw new Error ( "invalid multipart/form-data file" ) ;
103- writeFileSync ( join ( __dirname , fileName ) , content , {
104- flag : "w" ,
105- } ) ;
117+ }
106118 formData . append (
107119 mpFormDecoratorName ,
108- createReadStream ( join ( __dirname , fileName ) )
120+ Buffer . from ( content )
109121 ) ;
110122 return formData ;
111123}
0 commit comments