From 15c1caf41fa240fb95268ebf1c58d00196d19451 Mon Sep 17 00:00:00 2001 From: skidoodle Date: Wed, 13 Dec 2023 10:53:22 +0100 Subject: [PATCH] pdf proxy --- pnpm-lock.yaml | 1 + src/pages/api/erettsegi.ts | 15 +++++++++---- src/pages/api/proxy.ts | 43 ++++++++++++++++++++++++++++++++++++++ src/pages/api/validate.ts | 9 +++++--- 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 src/pages/api/proxy.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58fe935..e3e5785 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3705,6 +3705,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + requiresBuild: true dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 diff --git a/src/pages/api/erettsegi.ts b/src/pages/api/erettsegi.ts index dc5293b..9aba86b 100644 --- a/src/pages/api/erettsegi.ts +++ b/src/pages/api/erettsegi.ts @@ -9,7 +9,14 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) { szint: string } + const secure = req.headers['x-forwarded-proto'] === 'https' + const protocol = secure ? 'https' : 'http' + const address = req.headers.host + const baseUrl = `https://dload-oktatas.educatio.hu/erettsegi/feladatok_${ev}${idoszak}_${szint}/` + const proxiedUrl = `${protocol}://${address}/api/proxy?link=${encodeURIComponent( + baseUrl + )}` const missingParams = [] if (!ev) missingParams.push('ev') @@ -68,13 +75,13 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) { case 'infoism': case 'digkult': flZipUrl = `${baseUrl}${prefix}${forras}_${shortev}${honap}_${feladat}.zip` - flPdfUrl = `${baseUrl}${prefix}_${shortev}${honap}_${feladat}.pdf` + flPdfUrl = `${proxiedUrl}${prefix}_${shortev}${honap}_${feladat}.pdf` utZipUrl = `${baseUrl}${prefix}${megoldas}_${shortev}${honap}_${utmutato}.zip` - utPdfUrl = `${baseUrl}${prefix}_${shortev}${honap}_${utmutato}.pdf` + utPdfUrl = `${proxiedUrl}${prefix}_${shortev}${honap}_${utmutato}.pdf` break default: - flPdfUrl = `${baseUrl}${prefix}_${shortev}${honap}_${feladat}.pdf` - utPdfUrl = `${baseUrl}${prefix}_${shortev}${honap}_${utmutato}.pdf` + flPdfUrl = `${proxiedUrl}${prefix}_${shortev}${honap}_${feladat}.pdf` + utPdfUrl = `${proxiedUrl}${prefix}_${shortev}${honap}_${utmutato}.pdf` break } diff --git a/src/pages/api/proxy.ts b/src/pages/api/proxy.ts new file mode 100644 index 0000000..827b8b8 --- /dev/null +++ b/src/pages/api/proxy.ts @@ -0,0 +1,43 @@ +import type { NextApiRequest, NextApiResponse } from 'next' + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + const { link } = req.query as { link: string } + let missingParam: string | null = null + if (!link) { + missingParam = 'link' + } + + if (missingParam) { + return res.status(400).json({ error: `Hiányzó paraméter: ${missingParam}` }) + } + + const domain = link.split('/')[2] + if (domain !== 'dload-oktatas.educatio.hu') { + return res.status(400).json({ error: 'Érvénytelen link' }) + } + + try { + const response = await fetch(link, { method: 'GET' }) + + if (response.headers.get('content-type') !== 'application/pdf') { + return res.status(400).json({ error: 'Érvénytelen link' }) + } + + if (response.ok) { + res.setHeader('Content-Type', 'application/pdf') + const arrayBuffer: ArrayBuffer = await response.arrayBuffer() + const pdfBuffer: Buffer = Buffer.from(arrayBuffer) + res.send(pdfBuffer) + } else { + res + .status(response.status) + .json({ error: 'Hiba történt a lekérés során.' }) + } + } catch (error) { + console.error(error) + res.status(500).json({ error: 'Internal Server Error' }) + } +} diff --git a/src/pages/api/validate.ts b/src/pages/api/validate.ts index 5c29c60..0c8eb7c 100644 --- a/src/pages/api/validate.ts +++ b/src/pages/api/validate.ts @@ -14,8 +14,11 @@ export default async function handler( return res.status(400).json({ error: `Hiányzó paraméter: ${MissingParam}` }) } - const domain = link.split('/')[2] - if (domain !== 'dload-oktatas.educatio.hu') { + const secure = req.headers['x-forwarded-proto'] === 'https' + const protocol = secure ? 'https' : 'http' + const address = req.headers.host + + if (!link.startsWith(`${protocol}://${address}`)) { return res.status(400).json({ error: 'Érvénytelen link' }) } @@ -24,6 +27,6 @@ export default async function handler( const status = response.status res.status(200).json({ status }) } catch (error) { - res.status(500).json({ error: 'Hiányzó paraméterek:' }) + res.status(500).json({ error: 'Internal Server Error' }) } }