From 7904a27e77cc983719c7e69a5dab520777126b2d Mon Sep 17 00:00:00 2001 From: Thomas-xDo Date: Fri, 13 Jun 2025 10:14:22 +0700 Subject: [PATCH 1/2] feat(customize-header): add customize header --- src/lib/detect.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/lib/detect.ts b/src/lib/detect.ts index 522b46c75..785c256c5 100644 --- a/src/lib/detect.ts +++ b/src/lib/detect.ts @@ -76,6 +76,31 @@ export async function getLocation(ip: string, req: NextApiRequestCollect) { log('Localhost:', ip); return; } + const envHeaders = { + country: process.env.X_UMAMI_IP_COUNTRY?.toLowerCase(), + region: process.env.X_UMAMI_IP_COUNTRY_REGION?.toLowerCase(), + city: process.env.X_UMAMI_IP_CITY?.toLowerCase(), + lat: process.env.X_UMAMI_IP_LATITUDE?.toLowerCase(), + lng: process.env.X_UMAMI_IP_LONGITUDE?.toLowerCase(), + }; + + const hasCustomHeaders = + envHeaders.country && + envHeaders.region && + envHeaders.city && + req.headers[envHeaders.country] && + req.headers[envHeaders.region] && + req.headers[envHeaders.city]; + + if (hasCustomHeaders) { + return { + country: safeDecodeURIComponent(req.headers[envHeaders.country]), + subdivision1: safeDecodeURIComponent(req.headers[envHeaders.region]), + city: safeDecodeURIComponent(req.headers[envHeaders.city]), + lat: safeDecodeURIComponent(req.headers[envHeaders.lat]), + lng: safeDecodeURIComponent(req.headers[envHeaders.lng]), + }; + } // Cloudflare headers if (req.headers['cf-ipcountry']) { From 710850729f7257a675001d57fca2a74b179bc817 Mon Sep 17 00:00:00 2001 From: Thomas-xDo Date: Fri, 13 Jun 2025 10:58:42 +0700 Subject: [PATCH 2/2] feat(customize-header): fix mistake customize header --- src/lib/detect.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/lib/detect.ts b/src/lib/detect.ts index 785c256c5..afcb401ce 100644 --- a/src/lib/detect.ts +++ b/src/lib/detect.ts @@ -88,17 +88,29 @@ export async function getLocation(ip: string, req: NextApiRequestCollect) { envHeaders.country && envHeaders.region && envHeaders.city && + envHeaders.lat && + envHeaders.lng && req.headers[envHeaders.country] && req.headers[envHeaders.region] && - req.headers[envHeaders.city]; + req.headers[envHeaders.city] && + req.headers[envHeaders.lat] && + req.headers[envHeaders.lng]; if (hasCustomHeaders) { + log('Use custom headers'); + + const country = safeDecodeURIComponent(req.headers[envHeaders.country]); + const subdivision1Raw = safeDecodeURIComponent(req.headers[envHeaders.region]); + const city = safeDecodeURIComponent(req.headers[envHeaders.city]); + const lat = parseFloat(safeDecodeURIComponent(req.headers[envHeaders.lat])); + const lng = parseFloat(safeDecodeURIComponent(req.headers[envHeaders.lng])); + return { - country: safeDecodeURIComponent(req.headers[envHeaders.country]), - subdivision1: safeDecodeURIComponent(req.headers[envHeaders.region]), - city: safeDecodeURIComponent(req.headers[envHeaders.city]), - lat: safeDecodeURIComponent(req.headers[envHeaders.lat]), - lng: safeDecodeURIComponent(req.headers[envHeaders.lng]), + country, + subdivision1: getRegionCode(country, subdivision1Raw), + city, + lat, + lng, }; }