2023-11-13 15:34:50 -05:00
|
|
|
/*
|
2023-11-13 18:31:54 -05:00
|
|
|
* IpMe - A self-hosted API for obtaining your public IP address.
|
2023-11-13 15:34:50 -05:00
|
|
|
* Copyright (C) 2023 Foster Hangdaan <foster@hangdaan.email>
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as
|
|
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
|
|
* License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Affero General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
2024-09-09 07:08:40 -04:00
|
|
|
*/
|
2023-11-13 15:34:50 -05:00
|
|
|
|
|
|
|
import { getVersion } from "./utils/app.ts";
|
|
|
|
|
|
|
|
const port = Number(Deno.env.get("PORT")) || 8000;
|
|
|
|
|
2023-11-13 18:31:54 -05:00
|
|
|
const ROOT_PATTERN = new URLPattern({ pathname: "/" });
|
|
|
|
|
|
|
|
const handler = (req: Request): Response => {
|
|
|
|
const rootMatch = ROOT_PATTERN.exec(req.url);
|
|
|
|
|
|
|
|
if (rootMatch && req.method === "GET") {
|
2024-09-09 07:08:40 -04:00
|
|
|
const clientIpAddress =
|
|
|
|
req.headers.get("x-forwarded-for")?.split(",").shift() ||
|
|
|
|
req.headers.get("host");
|
2023-11-13 18:31:54 -05:00
|
|
|
const url = new URL(req.url);
|
|
|
|
const format = url.searchParams.get("format");
|
|
|
|
|
2024-09-09 07:08:40 -04:00
|
|
|
switch (format) {
|
|
|
|
case "json": {
|
|
|
|
return new Response(JSON.stringify({ ip: clientIpAddress }), {
|
|
|
|
headers: {
|
|
|
|
"content-type": "application/json",
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
case "jsonp": {
|
|
|
|
const parameter = JSON.stringify({ ip: clientIpAddress });
|
|
|
|
const callback = url.searchParams.get("callback") || "callback";
|
|
|
|
return new Response(`${callback}(${parameter});`, {
|
|
|
|
headers: {
|
|
|
|
"content-type": "application/javascript",
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
default: {
|
|
|
|
return new Response(clientIpAddress);
|
|
|
|
}
|
2023-11-13 18:31:54 -05:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return new Response("Not found", { status: 404 });
|
|
|
|
}
|
2023-11-13 15:34:50 -05:00
|
|
|
};
|
|
|
|
|
2024-09-09 07:08:40 -04:00
|
|
|
console.log("IpMe - A self-hosted API for obtaining your public IP address.");
|
2023-11-13 15:34:50 -05:00
|
|
|
console.log(`Version: ${getVersion()}`);
|
2025-01-20 12:40:23 -05:00
|
|
|
console.log("Source Code: https://code.hangdaan.com/foster/ipme");
|
2024-09-09 07:08:40 -04:00
|
|
|
console.log("License: GNU AGPL (version 3 or later)");
|
2023-11-13 18:31:54 -05:00
|
|
|
|
2023-11-13 15:34:50 -05:00
|
|
|
Deno.serve({ port }, handler);
|