@@ -20,7 +20,7 @@ import FormData = require('form-data');
20
20
import https = require( 'https' ) ;
21
21
import querystring = require( 'querystring' ) ;
22
22
import { PassThrough as readableStream } from 'stream' ;
23
- import { buildRequestFileObject , getMissingParams , isEmptyObject , isFileParam } from './helper' ;
23
+ import { buildRequestFileObject , getMissingParams , isEmptyObject , isFileObject , isFileParam , isFileParamAttributes } from './helper' ;
24
24
25
25
const isBrowser = typeof window === 'object' ;
26
26
const globalTransactionId = 'x-global-transaction-id' ;
@@ -127,48 +127,30 @@ export class RequestWrapper {
127
127
128
128
// Form params
129
129
if ( formData ) {
130
- // Remove keys with undefined/null values
131
- // Remove empty objects
132
- // Remove non-valid inputs for buildRequestFileObject,
133
- // i.e things like {contentType: <contentType>}
134
130
Object . keys ( formData ) . forEach ( key => {
135
- if ( formData [ key ] == null ||
136
- isEmptyObject ( formData [ key ] ) ||
137
- ( formData [ key ] . hasOwnProperty ( 'contentType' ) && ! formData [ key ] . hasOwnProperty ( 'data' ) ) ) {
138
- delete formData [ key ] ;
139
- }
140
- } ) ;
141
- // Convert file form parameters to request-style objects
142
- Object . keys ( formData ) . forEach ( key => {
143
- if ( formData [ key ] . data != null ) {
144
- formData [ key ] = buildRequestFileObject ( formData [ key ] ) ;
145
- }
146
- } ) ;
147
-
148
- // Stringify arrays
149
- Object . keys ( formData ) . forEach ( key => {
150
- if ( Array . isArray ( formData [ key ] ) ) {
151
- formData [ key ] = formData [ key ] . join ( ',' ) ;
152
- }
153
- } ) ;
154
-
155
- // Convert non-file form parameters to strings
156
- Object . keys ( formData ) . forEach ( key => {
157
- if ( ! isFileParam ( formData [ key ] ) &&
158
- ! Array . isArray ( formData [ key ] ) &&
159
- typeof formData [ key ] === 'object' ) {
160
- ( formData [ key ] = JSON . stringify ( formData [ key ] ) ) ;
161
- }
162
- } ) ;
163
-
164
- // build multipart form data
165
- Object . keys ( formData ) . forEach ( key => {
166
- // handle files differently to maintain options
167
- if ( formData [ key ] . value ) {
168
- multipartForm . append ( key , formData [ key ] . value , formData [ key ] . options ) ;
169
- } else {
170
- multipartForm . append ( key , formData [ key ] ) ;
171
- }
131
+ const values = Array . isArray ( formData [ key ] ) ? formData [ key ] : [ formData [ key ] ] ;
132
+ // Skip keys with undefined/null values or empty object value
133
+ values . filter ( v => v != null && ! isEmptyObject ( v ) ) . forEach ( value => {
134
+
135
+ // Special case of empty file object
136
+ if ( value . hasOwnProperty ( 'contentType' ) && ! value . hasOwnProperty ( 'data' ) ) {
137
+ return ;
138
+ }
139
+
140
+ // Convert file form parameters to request-style objects
141
+ if ( isFileParamAttributes ( value ) ) {
142
+ value = buildRequestFileObject ( value ) ;
143
+ }
144
+
145
+ if ( isFileObject ( value ) ) {
146
+ multipartForm . append ( key , value . value , value . options ) ;
147
+ } else {
148
+ if ( typeof value === 'object' && ! isFileParam ( value ) ) {
149
+ value = JSON . stringify ( value ) ;
150
+ }
151
+ multipartForm . append ( key , value ) ;
152
+ }
153
+ } ) ;
172
154
} ) ;
173
155
}
174
156
0 commit comments