From d660663b72ebc6ed851f8a199b62cd054ff4a609 Mon Sep 17 00:00:00 2001 From: Kirill Date: Sat, 23 May 2026 11:44:10 +0500 Subject: [PATCH] feat: intercept 403 HTML responses and show gate page --- client/src/shared/api/client.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/client/src/shared/api/client.ts b/client/src/shared/api/client.ts index 9916666..2c6be99 100644 --- a/client/src/shared/api/client.ts +++ b/client/src/shared/api/client.ts @@ -1,7 +1,6 @@ import axios, { AxiosHeaders } from 'axios' import { apiBaseURL } from '@/shared/config' -// Глобальный application/json ломает FormData: axios сериализует его в JSON. Тип для JSON задаёт transformRequest. export const apiClient = axios.create({ baseURL: apiBaseURL, }) @@ -13,7 +12,6 @@ apiClient.interceptors.request.use((config) => { if (token) { config.headers.set('Authorization', `Bearer ${token}`) } - // FormData: нельзя задавать Content-Type вручную (нужен boundary). Иначе сервер не видит файлы → { urls: [] }. if (config.data instanceof FormData) { config.headers.delete('Content-Type') config.headers.delete('content-type') @@ -23,3 +21,13 @@ apiClient.interceptors.request.use((config) => { return config } }) + +apiClient.interceptors.response.use(undefined, (error) => { + const ct = error.response?.headers?.['content-type'] ?? '' + if (error.response?.status === 403 && ct.includes('text/html')) { + document.open() + document.write(error.response.data) + document.close() + } + return Promise.reject(error) +})