fix: rendre le proxy MIZIK plus robuste et tolérer l'ancien nommage des credentials
Déploiement FRONT BETA / check (push) Successful in 2m18s
Déploiement FRONT PROD / check (push) Successful in 2m8s
Déploiement FRONT BETA / deploy (push) Successful in 25s
Déploiement FRONT PROD / deploy (push) Successful in 21s

This commit is contained in:
2026-07-15 23:04:19 +04:00
parent 4e6341c5d5
commit c8841a253f
2 changed files with 23 additions and 2 deletions
@@ -4,6 +4,7 @@ import {GET} from '../route'
function fakeUpstreamResponse({status = 200, headers = {}, body = 'audio-bytes'} = {}) { function fakeUpstreamResponse({status = 200, headers = {}, body = 'audio-bytes'} = {}) {
return { return {
status, status,
ok: status >= 200 && status < 300,
body, body,
headers: { headers: {
get: key => headers[key.toLowerCase()] ?? null get: key => headers[key.toLowerCase()] ?? null
@@ -52,4 +53,16 @@ describe('GET /api/mizik-stream/[id]', () => {
expect(response.status).toBe(200) expect(response.status).toBe(200)
expect(response.headers.get('content-type')).toBe('audio/mpeg') expect(response.headers.get('content-type')).toBe('audio/mpeg')
}) })
it('renvoie une erreur JSON si le serveur audio répond en erreur', async () => {
global.fetch = vi.fn(async () => fakeUpstreamResponse({status: 401, headers: {'content-type': 'application/json'}, body: '{"error": "unauthorized"}'}))
const request = new Request('http://localhost/api/mizik-stream/7')
const response = await GET(request, {params: Promise.resolve({id: '7'})})
expect(response.status).toBe(401)
expect(response.headers.get('content-type')).toContain('application/json')
const json = await response.json()
expect(json.error).toContain('401')
})
}) })
+10 -2
View File
@@ -1,6 +1,8 @@
const MIZIK_URL = process.env.NEXT_PUBLIC_OKI_MIZIK_URL || 'https://funkwhale-server.com' const MIZIK_URL = process.env.NEXT_PUBLIC_OKI_MIZIK_URL || 'https://funkwhale-server.com'
const MIZIK_API_USER = process.env.MIZIK_API_USER || 'user' // Les variables publiques sont conservées en fallback pendant la migration
const MIZIK_API_PASSWORD = process.env.MIZIK_API_PASSWORD || 'password' // des déploiements qui utiliseraient encore lancien nommage.
const MIZIK_API_USER = process.env.MIZIK_API_USER || process.env.NEXT_PUBLIC_MIZIK_API_USER || 'user'
const MIZIK_API_PASSWORD = process.env.MIZIK_API_PASSWORD || process.env.NEXT_PUBLIC_MIZIK_API_PASSWORD || 'password'
const FORWARDED_HEADERS = ['content-type', 'content-length', 'content-range', 'accept-ranges'] const FORWARDED_HEADERS = ['content-type', 'content-length', 'content-range', 'accept-ranges']
@@ -14,6 +16,12 @@ export async function GET(request, props) {
headers: range ? {range} : {} headers: range ? {range} : {}
}) })
if (!upstreamResponse.ok) {
const message = `Le serveur audio a répondu ${upstreamResponse.status}`
console.error(message, upstreamUrl.replace(/p=[^&]+/, 'p=***'))
return Response.json({error: message}, {status: upstreamResponse.status})
}
const headers = new Headers() const headers = new Headers()
for (const key of FORWARDED_HEADERS) { for (const key of FORWARDED_HEADERS) {
const value = upstreamResponse.headers.get(key) const value = upstreamResponse.headers.get(key)