@@ -14,6 +14,8 @@ module.exports = class RequestClient {
14
14
this . uppy = uppy
15
15
this . opts = opts
16
16
this . onReceiveResponse = this . onReceiveResponse . bind ( this )
17
+ this . allowedHeaders = [ ]
18
+ this . preflightDone = false
17
19
}
18
20
19
21
get hostname ( ) {
@@ -25,12 +27,15 @@ module.exports = class RequestClient {
25
27
get defaultHeaders ( ) {
26
28
return {
27
29
'Accept' : 'application/json' ,
28
- 'Content-Type' : 'application/json'
30
+ 'Content-Type' : 'application/json' ,
31
+ 'Uppy-Versions' : '@uppy/companion-client=1.0.3'
29
32
}
30
33
}
31
34
32
35
headers ( ) {
33
- return Promise . resolve ( Object . assign ( { } , this . defaultHeaders , this . opts . serverHeaders || { } ) )
36
+ return Promise . resolve (
37
+ Object . assign ( { } , this . defaultHeaders , this . opts . serverHeaders || { } )
38
+ )
34
39
}
35
40
36
41
_getPostResponseFunc ( skip ) {
@@ -77,9 +82,48 @@ module.exports = class RequestClient {
77
82
return res . json ( )
78
83
}
79
84
85
+ preflight ( path ) {
86
+ return new Promise ( ( resolve , reject ) => {
87
+ if ( this . preflightDone ) {
88
+ return resolve ( this . allowedHeaders . slice ( ) )
89
+ }
90
+
91
+ fetch ( this . _getUrl ( path ) , {
92
+ method : 'OPTIONS'
93
+ } )
94
+ . then ( ( response ) => {
95
+ if ( response . headers . has ( 'access-control-allow-headers' ) ) {
96
+ const allowedHeaders = response . headers . get ( 'access-control-allow-headers' )
97
+ . split ( ',' ) . map ( ( headerName ) => headerName . trim ( ) . toLowerCase ( ) )
98
+ this . allowedHeaders = this . allowedHeaders . concat ( allowedHeaders )
99
+ }
100
+ this . preflightDone = true
101
+ resolve ( this . allowedHeaders . slice ( ) )
102
+ } )
103
+ . catch ( reject )
104
+ } )
105
+ }
106
+
107
+ preflightAndHeaders ( path ) {
108
+ return new Promise ( ( resolve , reject ) => {
109
+ this . preflight ( path ) . then ( ( allowedHeaders ) => {
110
+ this . headers ( ) . then ( ( headers ) => {
111
+ // filter to keep only allowed Headers
112
+ Object . keys ( headers ) . forEach ( ( header ) => {
113
+ if ( allowedHeaders . indexOf ( header . toLowerCase ( ) ) === - 1 ) {
114
+ delete headers [ header ]
115
+ }
116
+ } )
117
+
118
+ resolve ( headers )
119
+ } )
120
+ } ) . catch ( reject )
121
+ } )
122
+ }
123
+
80
124
get ( path , skipPostResponse ) {
81
125
return new Promise ( ( resolve , reject ) => {
82
- this . headers ( ) . then ( ( headers ) => {
126
+ this . preflightAndHeaders ( path ) . then ( ( headers ) => {
83
127
fetch ( this . _getUrl ( path ) , {
84
128
method : 'get' ,
85
129
headers : headers ,
@@ -97,7 +141,7 @@ module.exports = class RequestClient {
97
141
98
142
post ( path , data , skipPostResponse ) {
99
143
return new Promise ( ( resolve , reject ) => {
100
- this . headers ( ) . then ( ( headers ) => {
144
+ this . preflightAndHeaders ( path ) . then ( ( headers ) => {
101
145
fetch ( this . _getUrl ( path ) , {
102
146
method : 'post' ,
103
147
headers : headers ,
@@ -116,7 +160,7 @@ module.exports = class RequestClient {
116
160
117
161
delete ( path , data , skipPostResponse ) {
118
162
return new Promise ( ( resolve , reject ) => {
119
- this . headers ( ) . then ( ( headers ) => {
163
+ this . preflightAndHeaders ( path ) . then ( ( headers ) => {
120
164
fetch ( `${ this . hostname } /${ path } ` , {
121
165
method : 'delete' ,
122
166
headers : headers ,
0 commit comments