diff --git a/pages/api/nip95-upload.ts b/pages/api/nip95-upload.ts index b5f14a5..447fbdb 100644 --- a/pages/api/nip95-upload.ts +++ b/pages/api/nip95-upload.ts @@ -82,6 +82,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const clientModule = isHttps ? https : http const headers = requestFormData.getHeaders() + // Add standard headers that some endpoints require + headers['Accept'] = 'application/json' + headers['User-Agent'] = 'zapwall.fr/1.0' + // Add NIP-98 Authorization header if token is provided if (authToken) { headers['Authorization'] = `Nostr ${authToken}` @@ -246,23 +250,50 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // Check if response is HTML (error page) instead of JSON const trimmedBody = response.body.trim() const isHtml = trimmedBody.startsWith(']*>([^<]+)<\/title>/i) const h1Match = response.body.match(/]*>([^<]+)<\/h1>/i) const errorText = titleMatch?.[1] || h1Match?.[1] || 'HTML error page returned' + + // Check if it's a 404 or other error page + const is404 = response.body.includes('404') || response.body.includes('Not Found') || titleMatch?.[1]?.includes('404') + const is403 = response.body.includes('403') || response.body.includes('Forbidden') || titleMatch?.[1]?.includes('403') + const is500 = response.body.includes('500') || response.body.includes('Internal Server Error') || titleMatch?.[1]?.includes('500') console.error('NIP-95 proxy HTML response error:', { targetEndpoint, finalUrl: currentUrl.toString(), status: response.statusCode, errorText, - bodyPreview: response.body.substring(0, 200), + is404, + is403, + is500, + bodyPreview: response.body.substring(0, 500), + contentType: 'HTML (expected JSON)', + suggestion: is404 + ? 'The endpoint URL may be incorrect or the endpoint does not exist' + : is403 + ? 'The endpoint may require authentication or have access restrictions' + : is500 + ? 'The endpoint server encountered an error' + : 'The endpoint may not be a valid NIP-95 upload endpoint or may require specific headers', }) + let userMessage = `Endpoint returned an HTML error page instead of JSON` + if (is404) { + userMessage = `Endpoint not found (404). The URL may be incorrect: ${currentUrl.toString()}` + } else if (is403) { + userMessage = `Access forbidden (403). The endpoint may require authentication or have restrictions.` + } else if (is500) { + userMessage = `Server error (500). The endpoint server encountered an error.` + } else { + userMessage = `Endpoint returned an HTML error page instead of JSON. The endpoint may be unavailable, the URL may be incorrect, or specific headers may be required. Error: ${errorText}` + } + return res.status(500).json({ - error: `Endpoint returned an HTML error page instead of JSON. The endpoint may be unavailable or the URL may be incorrect. Error: ${errorText}`, + error: userMessage, }) }