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,
})
}