Skip to content

Commit

Permalink
fix(ui + browser-extension/v3): when using the cors bypasser extensio…
Browse files Browse the repository at this point in the history
…n, if concurrent requests are made, the first response received from the extension is considered as the response for all active requests - which is very bad
  • Loading branch information
flawiddsouza committed Mar 8, 2024
1 parent 605db95 commit d536d8e
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 6 deletions.
13 changes: 9 additions & 4 deletions packages/browser-extension/v3/src/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,17 @@ async function handleAction() {
}
}

let abortController = null
let abortController = new Map()

async function handleSendRequest(message, sendResponse) {
abortController = new AbortController()
const { eventId } = message

try {
const { url, method, headers, bodyHint } = message.eventData
let { body } = message.eventData

abortController.set(eventId, new AbortController())

if(bodyHint === 'FormData') {
const formData = new FormData()
for(const item of body) {
Expand All @@ -116,7 +119,7 @@ async function handleSendRequest(message, sendResponse) {
method,
headers,
body: method !== 'GET' ? body : undefined,
signal: abortController.signal
signal: abortController.get(eventId).signal
})

const endTime = new Date()
Expand All @@ -142,11 +145,13 @@ async function handleSendRequest(message, sendResponse) {

sendResponse({
event: 'response',
eventId,
eventData: responseToSend
})
} catch(e) {
sendResponse({
event: 'responseError',
eventId,
eventData: e.message
})
}
Expand All @@ -158,7 +163,7 @@ function messageHandler(message, _sender, sendResponse) {
}

if(message.event === 'cancelRequest') {
abortController.abort()
abortController.get(message.eventId).abort()
}

if(message.event === 'ping') {
Expand Down
2 changes: 1 addition & 1 deletion packages/browser-extension/v3/src/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "Restfox CORS Helper",
"description": "Help bypass CORS when making requests from Restfox",
"version": "1.0.8",
"version": "1.0.9",
"manifest_version": 3,
"icons": {
"512": "icons/favicon.png"
Expand Down
10 changes: 9 additions & 1 deletion packages/ui/src/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,11 @@ export async function fetchWrapper(url, method, headers, body, abortControllerSi
}

return new Promise((resolve, reject) => {
const eventId = generateId()

window.postMessage({
event: 'sendRequest',
eventId,
eventData: {
url: url.toString(),
method,
Expand All @@ -126,6 +129,10 @@ export async function fetchWrapper(url, method, headers, body, abortControllerSi
})

const messageHandler = message => {
if (message.data.eventId !== undefined && message.data.eventId !== eventId) {
return
}

if(message.data.event === 'response') {
resolve(message.data.eventData)
window.removeEventListener('message', messageHandler)
Expand All @@ -141,7 +148,8 @@ export async function fetchWrapper(url, method, headers, body, abortControllerSi

abortControllerSignal.onabort = () => {
window.postMessage({
event: 'cancelRequest'
event: 'cancelRequest',
eventId,
})
reject(new DOMException('The user aborted a request.', 'AbortError'))
window.removeEventListener('message', messageHandler)
Expand Down

0 comments on commit d536d8e

Please sign in to comment.