{"record":{"id":"f78aa1fd3202be3b","repo":"apache/superset","slug":"export-failed-response-status-response-statu","errorCode":null,"errorMessage":"Export failed: ${response.status} ${response.statusText}","messagePattern":"Export failed: (.+?) (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"superset-frontend/src/components/StreamingExportModal/useStreamingExport.ts","lineNumber":235,"sourceCode":"        filename,\n      });\n\n      try {\n        const fetchOptions = await createFetchRequest(\n          url,\n          payload,\n          filename,\n          exportType,\n          exportSource,\n          expectedRows,\n          abortControllerRef.current.signal,\n        );\n        // Guard: ensure URL has app root prefix for subdirectory deployments\n        const prefixedUrl = ensureUrlPrefix(url);\n        const response = await fetch(prefixedUrl, fetchOptions);\n\n        if (!response.ok) {\n          throw new Error(\n            `Export failed: ${response.status} ${response.statusText}`,\n          );\n        }\n\n        if (!response.body) {\n          throw new Error('Response body is not available for streaming');\n        }\n\n        const contentDisposition = response.headers.get('Content-Disposition');\n        const defaultFilename = `export.${exportType}`;\n        let serverFilename = defaultFilename;\n\n        if (contentDisposition) {\n          const filenameMatch =\n            contentDisposition.match(/filename=\"?([^\"]+)\"?/);\n          if (filenameMatch && filenameMatch[1]) {\n            serverFilename = filenameMatch[1];\n          }","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/apache/superset/blob/f4587218dd19d046c3e4d00063e7d27f8a2ed354/superset-frontend/src/components/StreamingExportModal/useStreamingExport.ts#L217-L253","documentation":"Thrown by the streaming export hook when the export fetch resolves with response.ok === false. The streaming-export path uses raw fetch (not SupersetClient), so non-2xx responses are not auto-unwrapped; the error records status and statusText (e.g. 'Export failed: 413 Payload Too Large') for diagnosis. The response body, which usually contains the real reason, is not read into the message.","triggerScenarios":"Clicking a client- or server-side export that streams and the server rejecting it: 401 session expiry, 403 missing export permission (can_export etc.), 413 oversized query payload, 422 unsupported export args, or 500/504 when the export query fails or times out server-side.","commonSituations":"Large row-count exports hitting gateway body/time limits (nginx proxy_read_timeout, Gunicorn timeout); expired sessions on long-lived tabs; users lacking the CSV/dashboard export permission; reverse proxies buffering or rejecting streaming responses.","solutions":["Match the status: 401 re-login; 403 grant the user can_export on the datasource/dashboard; 413/504 reduce the export size or raise gateway/proxy timeouts and disable proxy buffering for the export route.","Retry with a row limit / filtered export to confirm size is the trigger.","Check Superset and proxy logs for the underlying server-side failure when status is 5xx."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// No caller-side validation prevents a server 4xx/5xx; pre-check what you can:\nif (!userCanExport) throw new Error('missing export permission');\nif (estimatedRows > MAX_STREAM_ROWS) throw new Error('narrow the export');","typeGuard":null,"tryCatchPattern":"try {\n  await runStreamingExport(opts);\n} catch (e) {\n  const m = /Export failed: (\\d+)/.exec(String(e?.message));\n  if (m?.[1] === '401') await reLogin();\n  else if (m?.[1] === '413' || m?.[1] === '504') suggestSmallerExport();\n  else showExportError(e);\n}","preventionTips":["Size gateway timeouts/buffers for large exports","Grant can_export to users who need streaming exports","Disable proxy buffering on export routes"],"tags":["export","streaming","http-status","network"],"backgroundTag":null,"analyzedSha":"f4587218dd19d046c3e4d00063e7d27f8a2ed354","analyzedAt":"2026-08-14T22:39:27.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}