Co-authored-by: nivedin <nivedinp@gmail.com> Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com>
55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
import { AxiosRequestConfig } from "axios"
|
|
import { cloneDeep } from "lodash-es"
|
|
import { useSetting } from "~/composables/settings"
|
|
|
|
// Helper function to check if a string is already encoded
|
|
const isEncoded = (value: string) => {
|
|
try {
|
|
return value !== decodeURIComponent(value)
|
|
} catch (e) {
|
|
return false // in case of malformed URI sequence
|
|
}
|
|
}
|
|
|
|
export const preProcessRequest = (
|
|
req: AxiosRequestConfig
|
|
): AxiosRequestConfig => {
|
|
const reqClone = cloneDeep(req)
|
|
const encodeMode = useSetting("ENCODE_MODE")
|
|
|
|
// If the parameters are URLSearchParams, inject them to URL instead
|
|
// This prevents issues of marshalling the URLSearchParams to the proxy
|
|
if (reqClone.params instanceof URLSearchParams) {
|
|
try {
|
|
const url = new URL(reqClone.url ?? "")
|
|
|
|
for (const [key, value] of reqClone.params.entries()) {
|
|
let finalValue = value
|
|
if (
|
|
encodeMode.value === "enable" ||
|
|
(encodeMode.value === "auto" &&
|
|
/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]+/.test(value))
|
|
) {
|
|
// Check if the value is already encoded (e.g., contains % symbols)
|
|
if (!isEncoded(value)) {
|
|
finalValue = encodeURIComponent(value)
|
|
}
|
|
}
|
|
|
|
// Set the parameter with the final value
|
|
url.searchParams.append(key, finalValue)
|
|
}
|
|
|
|
// decode the URL to prevent double encoding
|
|
reqClone.url = decodeURIComponent(url.toString())
|
|
} catch (e) {
|
|
// making this a non-empty block, so we can make the linter happy.
|
|
// we should probably use, allowEmptyCatch, or take the time to do something with the caught errors :)
|
|
}
|
|
|
|
reqClone.params = {}
|
|
}
|
|
|
|
return reqClone
|
|
}
|