konrad
6c999ad148
All checks were successful
continuous-integration/drone/push Build is passing
Resolves https://github.com/go-vikunja/frontend/issues/109 Vikunja would save the api url with `http` instead of `https` when the frontend was accessed via https. This was fine in most cases when the server would redirect all requests made to http to the secure https variant. However, in newer Firefox versions (and soon, Chrome probably as well) the browser would not follow that redirect anymore. Hence, we need to make sure to only make api requests to the same protocol. Doing API requests from an https hosted fronted to an http hosted api would probably fail already anyway. Co-authored-by: kolaente <k@knt.li> Reviewed-on: #3303 Reviewed-by: Dominik Pschenitschni <dpschen@noreply.kolaente.de> Co-authored-by: konrad <k@knt.li> Co-committed-by: konrad <k@knt.li>
92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import {useConfigStore} from '@/stores/config'
|
|
|
|
const API_DEFAULT_PORT = '3456'
|
|
|
|
export const ERROR_NO_API_URL = 'noApiUrlProvided'
|
|
|
|
|
|
export const checkAndSetApiUrl = (url: string): Promise<string> => {
|
|
if (url.startsWith('/')) {
|
|
url = window.location.host + url
|
|
}
|
|
|
|
// Check if the url has a http prefix
|
|
if (
|
|
!url.startsWith('http://') &&
|
|
!url.startsWith('https://')
|
|
) {
|
|
url = `${window.location.protocol}//${url}`
|
|
}
|
|
|
|
const urlToCheck: URL = new URL(url)
|
|
const origUrlToCheck = urlToCheck
|
|
|
|
const oldUrl = window.API_URL
|
|
window.API_URL = urlToCheck.toString()
|
|
|
|
const configStore = useConfigStore()
|
|
const updateConfig = () => configStore.update()
|
|
|
|
// Check if the api is reachable at the provided url
|
|
return updateConfig()
|
|
.catch(e => {
|
|
// Check if it is reachable at /api/v1 and http
|
|
if (
|
|
!urlToCheck.pathname.endsWith('/api/v1') &&
|
|
!urlToCheck.pathname.endsWith('/api/v1/')
|
|
) {
|
|
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
|
|
window.API_URL = urlToCheck.toString()
|
|
return updateConfig()
|
|
}
|
|
throw e
|
|
})
|
|
.catch(e => {
|
|
// Check if it is reachable at /api/v1 and https
|
|
urlToCheck.pathname = origUrlToCheck.pathname
|
|
if (
|
|
!urlToCheck.pathname.endsWith('/api/v1') &&
|
|
!urlToCheck.pathname.endsWith('/api/v1/')
|
|
) {
|
|
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
|
|
window.API_URL = urlToCheck.toString()
|
|
return updateConfig()
|
|
}
|
|
throw e
|
|
})
|
|
.catch(e => {
|
|
// Check if it is reachable at port API_DEFAULT_PORT and https
|
|
if (urlToCheck.port !== API_DEFAULT_PORT) {
|
|
urlToCheck.port = API_DEFAULT_PORT
|
|
window.API_URL = urlToCheck.toString()
|
|
return updateConfig()
|
|
}
|
|
throw e
|
|
})
|
|
.catch(e => {
|
|
// Check if it is reachable at :API_DEFAULT_PORT and /api/v1
|
|
urlToCheck.pathname = origUrlToCheck.pathname
|
|
if (
|
|
!urlToCheck.pathname.endsWith('/api/v1') &&
|
|
!urlToCheck.pathname.endsWith('/api/v1/')
|
|
) {
|
|
urlToCheck.pathname = `${urlToCheck.pathname}api/v1`
|
|
window.API_URL = urlToCheck.toString()
|
|
return updateConfig()
|
|
}
|
|
throw e
|
|
})
|
|
.catch(e => {
|
|
window.API_URL = oldUrl
|
|
throw e
|
|
})
|
|
.then(success => {
|
|
if (success) {
|
|
localStorage.setItem('API_URL', window.API_URL)
|
|
return window.API_URL
|
|
}
|
|
|
|
throw new Error(ERROR_NO_API_URL)
|
|
})
|
|
}
|