@@ -34,28 +34,6 @@ function createRequestModifier (getState, dnslinkResolver, ipfsPathValidator, ru
34
34
const ignoredRequests = new LRU ( requestCacheCfg )
35
35
const ignore = ( id ) => ignoredRequests . set ( id , true )
36
36
const isIgnored = ( id ) => ignoredRequests . get ( id ) !== undefined
37
-
38
- const acrhHeaders = new LRU ( requestCacheCfg ) // webui cors fix in Chrome
39
- const originUrls = new LRU ( requestCacheCfg ) // request.originUrl workaround for Chrome
40
- const originUrl = ( request ) => {
41
- // Firefox and Chrome provide relevant value in different fields:
42
- // (Firefox) request object includes full URL of origin document, return as-is
43
- if ( request . originUrl ) return request . originUrl
44
- // (Chrome) is lacking: `request.initiator` is just the origin (protocol+hostname+port)
45
- // To reconstruct originUrl we read full URL from Referer header in onBeforeSendHeaders
46
- // and cache it for short time
47
- // TODO: when request.originUrl is available in Chrome the `originUrls` cache can be removed
48
- const cachedUrl = originUrls . get ( request . requestId )
49
- if ( cachedUrl ) return cachedUrl
50
- if ( request . requestHeaders ) {
51
- const referer = request . requestHeaders . find ( h => h . name === 'Referer' )
52
- if ( referer ) {
53
- originUrls . set ( request . requestId , referer . value )
54
- return referer . value
55
- }
56
- }
57
- }
58
-
59
37
const preNormalizationSkip = ( state , request ) => {
60
38
// skip requests to the custom gateway or API (otherwise we have too much recursion)
61
39
if ( request . url . startsWith ( state . gwURLString ) || request . url . startsWith ( state . apiURLString ) ) {
@@ -161,46 +139,23 @@ function createRequestModifier (getState, dnslinkResolver, ipfsPathValidator, ru
161
139
162
140
// Special handling of requests made to API
163
141
if ( request . url . startsWith ( state . apiURLString ) ) {
164
- // Requests made by 'blessed' Web UI
165
- // --------------------------------------------
166
- // Goal: Web UI works without setting CORS at go-ipfs
167
- // (Without this snippet go-ipfs will return HTTP 403 due to additional origin check on the backend)
168
- const origin = originUrl ( request )
169
- if ( origin && origin . startsWith ( state . webuiRootUrl ) ) {
170
- // console.log('onBeforeSendHeaders', request)
171
- // console.log('onBeforeSendHeaders.origin', origin)
172
- // Swap Origin to pass server-side check
173
- // (go-ipfs returns HTTP 403 on origin mismatch if there are no CORS headers)
174
- const swapOrigin = ( at ) => {
175
- request . requestHeaders [ at ] . value = request . requestHeaders [ at ] . value . replace ( state . gwURL . origin , state . apiURL . origin )
176
- }
177
- let foundAt = request . requestHeaders . findIndex ( h => h . name === 'Origin' )
178
- if ( foundAt > - 1 ) swapOrigin ( foundAt )
179
- foundAt = request . requestHeaders . findIndex ( h => h . name === 'Referer' )
180
- if ( foundAt > - 1 ) swapOrigin ( foundAt )
181
-
182
- // Save access-control-request-headers from preflight
183
- foundAt = request . requestHeaders . findIndex ( h => h . name && h . name . toLowerCase ( ) === 'access-control-request-headers' )
184
- if ( foundAt > - 1 ) {
185
- acrhHeaders . set ( request . requestId , request . requestHeaders [ foundAt ] . value )
186
- // console.log('onBeforeSendHeaders FOUND access-control-request-headers', acrhHeaders.get(request.requestId))
187
- }
188
- // console.log('onBeforeSendHeaders fixed headers', request.requestHeaders)
189
- }
190
-
191
142
// '403 - Forbidden' fix for Chrome and Firefox
192
143
// --------------------------------------------
193
- // We remove Origin header from requests made to API URL and WebUI
194
- // by js-ipfs-http-client running in WebExtension context to remove need
195
- // for manual CORS whitelisting via Access-Control-Allow-Origin at go-ipfs
144
+ // We remove Origin header from requests made to API URL
145
+ // by js-ipfs-http-client running in WebExtension context.
146
+ // This act as unification of CORS behavior across all vendors,
147
+ // where behavior was non-deterministic and changed between releases.
148
+ // Without this, some users would need to do manual CORS whitelisting
149
+ // by adding webExtensionOrigin to API.Access-Control-Allow-Origin at their IPFS node.
196
150
// More info:
197
151
// Firefox: https://github.com/ipfs-shipyard/ipfs-companion/issues/622
198
152
// Chromium 71: https://github.com/ipfs-shipyard/ipfs-companion/pull/616
199
153
// Chromium 72: https://github.com/ipfs-shipyard/ipfs-companion/issues/630
200
154
const isWebExtensionOrigin = ( origin ) => {
201
155
// console.log(`origin=${origin}, webExtensionOrigin=${webExtensionOrigin}`)
202
- // Chromium <= 71 returns opaque Origin as defined in
156
+ // Chromium <72 returns opaque Origin as defined in
203
157
// https://html.spec.whatwg.org/multipage/origin.html#ascii-serialisation-of-an-origin
158
+ // TODO: remove this when <72 is not used by users
204
159
if ( origin == null || origin === 'null' ) {
205
160
return true
206
161
}
@@ -274,41 +229,6 @@ function createRequestModifier (getState, dnslinkResolver, ipfsPathValidator, ru
274
229
return
275
230
}
276
231
277
- // Special handling of requests made to API
278
- if ( request . url . startsWith ( state . apiURLString ) ) {
279
- // Special handling of requests made by 'blessed' Web UI from local Gateway
280
- // Goal: Web UI works without setting CORS at go-ipfs
281
- // (This includes 'ignored' requests: CORS needs to be fixed even if no redirect is done)
282
- const origin = originUrl ( request )
283
- if ( origin && origin . startsWith ( state . webuiRootUrl ) && request . responseHeaders ) {
284
- // console.log('onHeadersReceived', request)
285
- const acaOriginHeader = { name : 'Access-Control-Allow-Origin' , value : state . gwURL . origin }
286
- const foundAt = findHeaderIndex ( acaOriginHeader . name , request . responseHeaders )
287
- if ( foundAt > - 1 ) {
288
- request . responseHeaders [ foundAt ] . value = acaOriginHeader . value
289
- } else {
290
- request . responseHeaders . push ( acaOriginHeader )
291
- }
292
-
293
- // Restore access-control-request-headers from preflight
294
- const acrhValue = acrhHeaders . get ( request . requestId )
295
- if ( acrhValue ) {
296
- const acahHeader = { name : 'Access-Control-Allow-Headers' , value : acrhValue }
297
- const foundAt = findHeaderIndex ( acahHeader . name , request . responseHeaders )
298
- if ( foundAt > - 1 ) {
299
- request . responseHeaders [ foundAt ] . value = acahHeader . value
300
- } else {
301
- request . responseHeaders . push ( acahHeader )
302
- }
303
- acrhHeaders . del ( request . requestId )
304
- // console.log('onHeadersReceived SET Access-Control-Allow-Headers', header)
305
- }
306
-
307
- // console.log('onHeadersReceived fixed headers', request.responseHeaders)
308
- return { responseHeaders : request . responseHeaders }
309
- }
310
- }
311
-
312
232
// Skip if request is marked as ignored
313
233
if ( isIgnored ( request . requestId ) ) {
314
234
return
@@ -317,6 +237,7 @@ function createRequestModifier (getState, dnslinkResolver, ipfsPathValidator, ru
317
237
if ( state . redirect ) {
318
238
// Late redirect as a workaround for edge cases such as:
319
239
// - CORS XHR in Firefox: https://github.com/ipfs-shipyard/ipfs-companion/issues/436
240
+ // TODO: remove when Firefox with a fix landed in Stable channel
320
241
if ( onHeadersReceivedRedirect . has ( request . requestId ) ) {
321
242
onHeadersReceivedRedirect . delete ( request . requestId )
322
243
if ( state . dnslinkPolicy ) {
@@ -529,6 +450,25 @@ function normalizedUnhandledIpfsProtocol (request, pubGwUrl) {
529
450
}
530
451
}
531
452
532
- function findHeaderIndex ( name , headers ) {
533
- return headers . findIndex ( x => x . name && x . name . toLowerCase ( ) === name . toLowerCase ( ) )
453
+ /* not used at the moment, but this heuristic may be useful in the future
454
+ // Note: Chrome 72+ requires 'extraHeaders' for access to Referer header
455
+ const originUrls = new LRU(requestCacheCfg) // request.originUrl workaround for Chrome
456
+ const originUrl = (request) => {
457
+ // Firefox and Chrome provide relevant value in different fields:
458
+ // (Firefox) request object includes full URL of origin document, return as-is
459
+ if (request.originUrl) return request.originUrl
460
+ // (Chrome) is lacking: `request.initiator` is just the origin (protocol+hostname+port)
461
+ // To reconstruct originUrl we read full URL from Referer header in onBeforeSendHeaders
462
+ // and cache it for short time
463
+ // TODO: when request.originUrl is available in Chrome the `originUrls` cache can be removed
464
+ const cachedUrl = originUrls.get(request.requestId)
465
+ if (cachedUrl) return cachedUrl
466
+ if (request.requestHeaders) {
467
+ const referer = request.requestHeaders.find(h => h.name === 'Referer')
468
+ if (referer) {
469
+ originUrls.set(request.requestId, referer.value)
470
+ return referer.value
471
+ }
472
+ }
534
473
}
474
+ */
0 commit comments