1
- import { createReadStream , writeFileSync } from "fs" ;
2
-
3
1
import FormData from "form-data" ;
4
- import { join } from "path" ;
5
2
import qs from "qs" ;
6
3
7
4
const requestMetadataKey = "request" ;
8
5
const mpFormMetadataKey = "multipart_form" ;
9
6
10
7
export 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 ) ;
12
13
let [ requestHeaders , requestBody ] : [ object , any ] = [ { } , { } ] ;
13
14
fieldNames . forEach ( ( fname ) => {
14
15
const requestAnn : string = Reflect . getMetadata (
15
16
requestMetadataKey ,
16
- request ,
17
+ requestBodyObj ,
17
18
fname
18
19
) ;
19
20
if ( requestAnn == null ) return ;
@@ -22,22 +23,35 @@ export function serializeRequestBody(request: any): [object, any] {
22
23
switch ( requestDecorator . MediaType ) {
23
24
case "multipart/form-data" :
24
25
case "multipart/mixed" :
25
- requestBody = encodeMultipartFormData ( request [ fname ] ) ;
26
+ requestBody = encodeMultipartFormData ( requestBodyObj [ fname ] ) ;
26
27
requestHeaders = ( requestBody as FormData ) . getHeaders ( ) ;
27
28
break ;
28
29
case "application/x-www-form-urlencoded" :
29
30
[ requestHeaders , requestBody ] = [
30
31
{ "Content-Type" : `${ requestDecorator . MediaType } ` } ,
31
- qs . stringify ( { ... request [ fname ] } ) ,
32
+ qs . stringify ( requestBodyObj [ fname ] ) ,
32
33
] ;
33
34
break ;
34
35
case "application/json" :
35
36
case "text/json" :
36
- default :
37
37
[ requestHeaders , requestBody ] = [
38
38
{ "Content-Type" : `${ requestDecorator . MediaType } ` } ,
39
- { ...request [ fname ] } ,
39
+ { ...requestBodyObj [ fname ] } ,
40
40
] ;
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
+ ) ;
41
55
}
42
56
} ) ;
43
57
return [ requestHeaders , requestBody ] ;
@@ -58,14 +72,14 @@ function encodeMultipartFormData(form: any): FormData {
58
72
if ( mpFormDecorator . File )
59
73
return encodeMultipartFormDataFile ( formData , form [ fname ] ) ;
60
74
else if ( mpFormDecorator . JSON ) {
61
- formData . append ( mpFormDecorator . Name , { ... form [ fname ] } ) ;
75
+ formData . append ( mpFormDecorator . Name , JSON . stringify ( form [ fname ] ) ) ;
62
76
} else {
63
77
if ( Array . isArray ( form [ fname ] ) ) {
64
78
form [ fname ] . forEach ( ( val : any ) => {
65
- formData . append ( mpFormDecorator . Name + "[]" , JSON . stringify ( val ) ) ;
79
+ formData . append ( mpFormDecorator . Name + "[]" , String ( val ) ) ;
66
80
} ) ;
67
81
} else {
68
- formData . append ( mpFormDecorator . Name , JSON . stringify ( form [ fname ] ) ) ;
82
+ formData . append ( mpFormDecorator . Name , String ( form [ fname ] ) ) ;
69
83
}
70
84
}
71
85
} ) ;
@@ -98,14 +112,12 @@ function encodeMultipartFormDataFile(formData: FormData, file: any): FormData {
98
112
}
99
113
} ) ;
100
114
101
- if ( mpFormDecoratorName === "" || fileName === "" || content == null )
115
+ if ( mpFormDecoratorName === "" || fileName === "" || content == null ) {
102
116
throw new Error ( "invalid multipart/form-data file" ) ;
103
- writeFileSync ( join ( __dirname , fileName ) , content , {
104
- flag : "w" ,
105
- } ) ;
117
+ }
106
118
formData . append (
107
119
mpFormDecoratorName ,
108
- createReadStream ( join ( __dirname , fileName ) )
120
+ Buffer . from ( content )
109
121
) ;
110
122
return formData ;
111
123
}
0 commit comments