From 6003eeadbaeb41dc6c4f9bc7d1d3c8cbbb3bbef8 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Sat, 30 Aug 2025 10:54:31 +0800 Subject: [PATCH] compat: support more kosync server implementations, closes #1862 (#1929) --- apps/readest-app/src/pages/api/kosync.ts | 11 ++++++----- apps/readest-app/src/services/sync/KOSyncClient.ts | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/readest-app/src/pages/api/kosync.ts b/apps/readest-app/src/pages/api/kosync.ts index 1b78b61c..1054c486 100644 --- a/apps/readest-app/src/pages/api/kosync.ts +++ b/apps/readest-app/src/pages/api/kosync.ts @@ -2,6 +2,8 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { corsAllMethods, runMiddleware } from '@/utils/cors'; import { KoSyncProxyPayload } from '@/types/kosync'; +const validEndpoints = [/\/users\/create/, /\/users\/auth/, /\/syncs\/progress/]; + export default async function handler(req: NextApiRequest, res: NextApiResponse) { await runMiddleware(req, res, corsAllMethods); @@ -21,6 +23,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) return res.status(400).json({ error: 'serverUrl and endpoint are required' }); } + if (!validEndpoints.some((regex) => regex.test(endpoint))) { + return res.status(400).json({ error: 'Invalid endpoint' }); + } + const targetUrl = `${serverUrl.replace(/\/$/, '')}${endpoint}`; try { @@ -34,11 +40,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) body: clientBody ? JSON.stringify(clientBody) : null, }); - const contentType = response.headers.get('content-type'); - if (!contentType || !contentType.includes('application/json')) { - throw new Error('Invalid sync server response: Unexpected Content-Type.'); - } - const data = await response.text(); res.status(response.status); try { diff --git a/apps/readest-app/src/services/sync/KOSyncClient.ts b/apps/readest-app/src/services/sync/KOSyncClient.ts index d5adc7b7..94fab562 100644 --- a/apps/readest-app/src/services/sync/KOSyncClient.ts +++ b/apps/readest-app/src/services/sync/KOSyncClient.ts @@ -53,6 +53,7 @@ export class KOSyncClient { method, headers: { accept: 'application/vnd.koreader.v1+json', + ...(method === 'GET' ? {} : { 'Content-Type': 'application/json' }), ...Object.fromEntries(headers.entries()), }, body,