Skip to main content
Glama
test-api-detailed.js•7.93 kB
#!/usr/bin/env node /** * Detailed API Test - Mimicking exact browser behavior */ import { readFileSync } from 'fs'; import { resolve, dirname } from 'path'; import { fileURLToPath } from 'url'; const currentDir = dirname(fileURLToPath(import.meta.url)); const tokenPath = resolve(currentDir, 'correct-jwt-new.txt'); const jwtToken = readFileSync(tokenPath, 'utf8').trim(); async function detailedAPITest() { console.log('šŸ”¬ Detailed API Test - Mimicking Browser Behavior\n'); const baseURL = "https://api.digitalpages.com.br"; const projectUID = "36c92686-c494-ec11-a22a-dc984041c95d"; // Test 1: Check if we need specific content type console.log('1ļøāƒ£ Testing with exact browser content type:'); const compositionUID = generateUID(); const compositionData = { version: "1.1", metadata: { title: "Test Composition", description: "API Test", thumb: null, tags: [] }, interface: { content_language: "pt_br", index_option: "buttons", font_family: "Lato", show_summary: "disabled", finish_btn: "disabled" }, structure: [{ id: generateUID(), type: "text-1", content: "<p>Test content</p>", background_color: "#FFFFFF", padding_top: 0, padding_bottom: 0 }] }; const compositionJSON = JSON.stringify(compositionData); // Try with browser's exact MIME type const formData = new FormData(); const blob = new Blob([compositionJSON], { type: 'digitalpages/composer' }); formData.append('file', blob, 'composition.rdpcomposer'); const url = `${baseURL}/storage/v1.0/content?uid=${compositionUID}&manual_project_uid=${projectUID}`; try { console.log(' - URL:', url); console.log(' - Method: PUT'); console.log(' - Content-Type: multipart/form-data (auto-set)'); console.log(' - File type: digitalpages/composer'); console.log(' - File name: composition.rdpcomposer'); const response = await fetch(url, { method: 'PUT', headers: { 'Authorization': `Bearer ${jwtToken}`, 'Accept': '*/*', 'Origin': 'https://composer.euconquisto.com', 'Referer': 'https://composer.euconquisto.com/', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36' }, body: formData }); console.log(`\n - Status: ${response.status} ${response.statusText}`); const responseText = await response.text(); console.log(` - Response: ${responseText}`); } catch (error) { console.log(` - Error: ${error.message}`); } // Test 2: Try with different UID format console.log('\n2ļøāƒ£ Testing with different UID format:'); const simpleUID = Date.now().toString(); const simpleURL = `${baseURL}/storage/v1.0/content?uid=${simpleUID}&manual_project_uid=${projectUID}`; try { console.log(' - Using timestamp as UID:', simpleUID); console.log(' - URL:', simpleURL); const simpleFormData = new FormData(); const simpleBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' }); simpleFormData.append('file', simpleBlob, 'composition.rdpcomposer'); const simpleResponse = await fetch(simpleURL, { method: 'PUT', headers: { 'Authorization': `Bearer ${jwtToken}`, 'Accept': '*/*' }, body: simpleFormData }); console.log(` - Status: ${simpleResponse.status} ${simpleResponse.statusText}`); const simpleResponseText = await simpleResponse.text(); console.log(` - Response: ${simpleResponseText}`); } catch (error) { console.log(` - Error: ${error.message}`); } // Test 3: Try without manual_project_uid console.log('\n3ļøāƒ£ Testing without manual_project_uid:'); const noProjectURL = `${baseURL}/storage/v1.0/content?uid=${compositionUID}`; try { console.log(' - URL:', noProjectURL); const noProjectFormData = new FormData(); const noProjectBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' }); noProjectFormData.append('file', noProjectBlob, 'composition.rdpcomposer'); const noProjectResponse = await fetch(noProjectURL, { method: 'PUT', headers: { 'Authorization': `Bearer ${jwtToken}` }, body: noProjectFormData }); console.log(` - Status: ${noProjectResponse.status} ${noProjectResponse.statusText}`); const noProjectResponseText = await noProjectResponse.text(); console.log(` - Response: ${noProjectResponseText}`); } catch (error) { console.log(` - Error: ${error.message}`); } // Test 4: Try with project_uid instead of manual_project_uid console.log('\n4ļøāƒ£ Testing with project_uid parameter:'); const projectParamURL = `${baseURL}/storage/v1.0/content?uid=${compositionUID}&project_uid=${projectUID}`; try { console.log(' - URL:', projectParamURL); const projectFormData = new FormData(); const projectBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' }); projectFormData.append('file', projectBlob, 'composition.rdpcomposer'); const projectResponse = await fetch(projectParamURL, { method: 'PUT', headers: { 'Authorization': `Bearer ${jwtToken}` }, body: projectFormData }); console.log(` - Status: ${projectResponse.status} ${projectResponse.statusText}`); const projectResponseText = await projectResponse.text(); console.log(` - Response: ${projectResponseText}`); } catch (error) { console.log(` - Error: ${error.message}`); } // Test 5: Try minimal JSON structure console.log('\n5ļøāƒ£ Testing with minimal JSON structure:'); const minimalData = { structure: [{ type: "text-1", content: "Test" }] }; try { const minimalFormData = new FormData(); const minimalBlob = new Blob([JSON.stringify(minimalData)], { type: 'digitalpages/composer' }); minimalFormData.append('file', minimalBlob, 'composition.rdpcomposer'); const minimalResponse = await fetch(url, { method: 'PUT', headers: { 'Authorization': `Bearer ${jwtToken}` }, body: minimalFormData }); console.log(` - Status: ${minimalResponse.status} ${minimalResponse.statusText}`); const minimalResponseText = await minimalResponse.text(); console.log(` - Response: ${minimalResponseText}`); } catch (error) { console.log(` - Error: ${error.message}`); } console.log('\nšŸ“‹ Summary:'); console.log(' - All variations return 500 Internal Server Error'); console.log(' - The API might be expecting additional headers or parameters'); console.log(' - Or the server might have an issue with our requests'); console.log(' - Need to capture actual browser traffic to see exact format'); } function generateUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } detailedAPITest().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rkm097git/euconquisto-composer-mcp-poc'

If you have feedback or need assistance with the MCP directory API, please join our Discord server