diff --git a/sync-server/server.js b/sync-server/server.js index 1047649..10a3fe8 100644 --- a/sync-server/server.js +++ b/sync-server/server.js @@ -310,7 +310,8 @@ function downloadFile(url, dest) { // --- Music API Proxy Function --- function proxyRequest(targetUrl, req, res) { - const parsedTarget = url.parse(targetUrl); + const parsedTarget = url.parse(targetUrl, true); + const isPicRequest = parsedTarget.query && parsedTarget.query.type === 'pic'; const options = { hostname: parsedTarget.hostname, @@ -325,6 +326,53 @@ function proxyRequest(targetUrl, req, res) { }; const proxyReq = https.request(options, (proxyRes) => { + const passThrough = () => { + const headers = { ...proxyRes.headers }; + delete headers['content-encoding']; + delete headers['transfer-encoding']; + + res.writeHead(proxyRes.statusCode, headers); + proxyRes.pipe(res); + }; + + // pic endpoint now returns JSON, turn it into a redirect for + if (isPicRequest) { + if (proxyRes.statusCode >= 300 && proxyRes.statusCode < 400 && proxyRes.headers.location) { + res.writeHead(302, { Location: proxyRes.headers.location }); + proxyRes.resume(); + res.end(); + return; + } + + const contentType = proxyRes.headers['content-type'] || ''; + if (contentType.startsWith('image/')) { + passThrough(); + return; + } + + let body = ''; + proxyRes.setEncoding('utf8'); + proxyRes.on('data', chunk => body += chunk); + proxyRes.on('end', () => { + try { + const parsedBody = JSON.parse(body); + if (parsedBody && parsedBody.url) { + res.writeHead(302, { Location: parsedBody.url }); + res.end(); + return; + } + } catch (e) { + // fall through + } + + res.writeHead(proxyRes.statusCode || 200, { + 'Content-Type': proxyRes.headers['content-type'] || 'application/json' + }); + res.end(body); + }); + return; + } + // Handle redirects if (proxyRes.statusCode >= 300 && proxyRes.statusCode < 400 && proxyRes.headers.location) { // For redirects, return the redirect URL to client @@ -333,13 +381,7 @@ function proxyRequest(targetUrl, req, res) { return; } - // Copy response headers (except problematic ones) - const headers = { ...proxyRes.headers }; - delete headers['content-encoding']; - delete headers['transfer-encoding']; - - res.writeHead(proxyRes.statusCode, headers); - proxyRes.pipe(res); + passThrough(); }); proxyReq.on('error', (e) => {