From 3740b9351393925c674ab877a6f0dcd5a17a9a59 Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Mon, 5 Jan 2026 22:56:07 +0100 Subject: [PATCH] Add detailed logging for nostrimg.com requests to diagnose 500 errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Motivations:** - Diagnose why nostrimg.com returns 500 errors - Verify if the code is causing the errors or if it's a server-side issue - Log request and response details for troubleshooting **Root causes:** - Unknown: Could be code issue (wrong field name, headers, format) or server issue - Need detailed logs to determine the cause **Correctifs:** - Added detailed request logging for nostrimg.com: - URL, method, field name, filename, content type, file size - All headers (Content-Type, Accept, User-Agent, Authorization) - Added detailed response logging for nostrimg.com: - Status code, status message, response headers - Body preview (500 chars), body length, HTML detection - Added comment about field name ('file') - some endpoints might need different names **Evolutions:** - None **Pages affectées:** - pages/api/nip95-upload.ts --- pages/api/nip95-upload.ts | 40 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/pages/api/nip95-upload.ts b/pages/api/nip95-upload.ts index cc83afa..f4cfe7c 100644 --- a/pages/api/nip95-upload.ts +++ b/pages/api/nip95-upload.ts @@ -73,7 +73,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // Recreate FormData for each request (needed for redirects) const requestFormData = new FormData() const fileStream = fs.createReadStream(fileField.filepath) - requestFormData.append('file', fileStream, { + + // Use 'file' as field name (standard for NIP-95, but some endpoints may use different names) + // Note: nostrimg.com might expect a different field name - if issues persist, try 'image' or 'upload' + const fieldName = 'file' + requestFormData.append(fieldName, fileStream, { filename: fileField.originalFilename || fileField.newFilename || 'upload', contentType: fileField.mimetype || 'application/octet-stream', }) @@ -91,6 +95,24 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) headers['Authorization'] = `Nostr ${authToken}` } + // Log request details for debugging (only for problematic endpoints) + if (url.hostname.includes('nostrimg.com')) { + console.log('NIP-95 proxy request to nostrimg.com:', { + url: url.toString(), + method: 'POST', + fieldName, + filename: fileField.originalFilename || fileField.newFilename || 'upload', + contentType: fileField.mimetype || 'application/octet-stream', + fileSize: fileField.size, + headers: { + 'Content-Type': headers['content-type'], + 'Accept': headers['Accept'], + 'User-Agent': headers['User-Agent'], + 'Authorization': authToken ? '[present]' : '[absent]', + }, + }) + } + const requestOptions = { hostname: url.hostname, port: url.port || (isHttps ? 443 : 80), @@ -136,6 +158,22 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) body += chunk }) proxyResponse.on('end', () => { + // Log response details for debugging problematic endpoints + if (url.hostname.includes('nostrimg.com')) { + console.log('NIP-95 proxy response from nostrimg.com:', { + url: url.toString(), + statusCode, + statusMessage: proxyResponse.statusMessage, + responseHeaders: { + 'content-type': proxyResponse.headers['content-type'], + 'content-length': proxyResponse.headers['content-length'], + }, + bodyPreview: body.substring(0, 500), + bodyLength: body.length, + isHtml: body.trim().startsWith('