Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(vite/client): allow ping to http from https website #9561

Merged
merged 1 commit into from Aug 13, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 11 additions & 3 deletions packages/vite/src/client/client.ts
Expand Up @@ -101,7 +101,7 @@ function setupWebSocket(
}

console.log(`[vite] server connection lost. polling for restart...`)
await waitForSuccessfulPing(hostAndPath)
await waitForSuccessfulPing(protocol, hostAndPath)
location.reload()
})

Expand Down Expand Up @@ -292,14 +292,22 @@ async function queueUpdate(p: Promise<(() => void) | undefined>) {
}
}

async function waitForSuccessfulPing(hostAndPath: string, ms = 1000) {
async function waitForSuccessfulPing(
socketProtocol: string,
hostAndPath: string,
ms = 1000
) {
const pingHostProtocol = socketProtocol === 'wss' ? 'https' : 'http'

// eslint-disable-next-line no-constant-condition
while (true) {
try {
// A fetch on a websocket URL will return a successful promise with status 400,
// but will reject a networking error.
// When running on middleware mode, it returns status 426, and an cors error happens if mode is not no-cors
await fetch(`${location.protocol}//${hostAndPath}`, { mode: 'no-cors' })
await fetch(`${pingHostProtocol}://${hostAndPath}`, {
mode: 'no-cors'
})
break
} catch (e) {
// wait ms before attempting to ping again
Expand Down