@@ -46,9 +46,7 @@ export class BearerTokenInterceptor implements HttpInterceptor {
4646 */
4747 intercept ( request : HttpRequest < unknown > , next : HttpHandler ) : Observable < HttpEvent < unknown > > {
4848 // Базовые заголовки для всех запросов
49- const headers : Record < string , string > = {
50- Accept : "application/json" ,
51- } ;
49+ const headers : Record < string , string > = { } ;
5250
5351 const tokens = this . tokenService . getTokens ( ) ;
5452
@@ -57,14 +55,24 @@ export class BearerTokenInterceptor implements HttpInterceptor {
5755 headers [ "Authorization" ] = `Bearer ${ tokens . access } ` ;
5856 }
5957
58+ // Для blob запросов (файлы) не устанавливаем Accept, чтобы не парсить blob как JSON
59+ const isBlobRequest =
60+ request . url . includes ( "/export" ) ||
61+ request . url . includes ( "/download" ) ||
62+ ( request . headers . has ( "X-Request-Type" ) && request . headers . get ( "X-Request-Type" ) === "blob" ) ;
63+
64+ const hasAcceptHeader = request . headers . has ( "Accept" ) ;
65+
66+ if ( ! isBlobRequest && ! hasAcceptHeader ) {
67+ headers [ "Accept" ] = "application/json" ;
68+ }
69+
6070 const req = request . clone ( { setHeaders : headers } ) ;
6171
62- // Если токены есть, обрабатываем запрос с возможностью обновления токенов
6372 if ( tokens !== null ) {
6473 return this . handleRequestWithTokens ( req , next ) ;
6574 } else {
66- // Если токенов нет, просто выполняем запрос
67- return next . handle ( request ) ;
75+ return next . handle ( req ) ;
6876 }
6977 }
7078
@@ -107,10 +115,9 @@ export class BearerTokenInterceptor implements HttpInterceptor {
107115 request : HttpRequest < unknown > ,
108116 next : HttpHandler
109117 ) : Observable < HttpEvent < unknown > > {
110- // Если токен еще не обновляется, начинаем процесс обновления
111118 if ( ! this . isRefreshing ) {
112119 this . isRefreshing = true ;
113- this . refreshTokenSubject . next ( null ) ; // Сбрасываем subject
120+ this . refreshTokenSubject . next ( null ) ;
114121
115122 return this . tokenService . refreshTokens ( ) . pipe (
116123 catchError ( err => {
@@ -119,22 +126,29 @@ export class BearerTokenInterceptor implements HttpInterceptor {
119126 } ) ,
120127 switchMap ( res => {
121128 this . isRefreshing = false ;
122- this . refreshTokenSubject . next ( res . access ) ; // Уведомляем о новом токене
129+ this . refreshTokenSubject . next ( res . access ) ;
123130
124- // Сохраняем новые токены в хранилище
125131 this . tokenService . memTokens ( res ) ;
126132
127- // Подготавливаем заголовки с новым токеном
128- const headers : Record < string , string > = {
129- Accept : "application/json" ,
130- } ;
133+ const headers : Record < string , string > = { } ;
131134
132135 const tokens = this . tokenService . getTokens ( ) ;
133136 if ( tokens ) {
134137 headers [ "Authorization" ] = `Bearer ${ tokens . access } ` ;
135138 }
136139
137- // Повторяем исходный запрос с новым токеном
140+ const isBlobRequest =
141+ request . url . includes ( "/export" ) ||
142+ request . url . includes ( "/download" ) ||
143+ ( request . headers . has ( "X-Request-Type" ) &&
144+ request . headers . get ( "X-Request-Type" ) === "blob" ) ;
145+
146+ const hasAcceptHeader = request . headers . has ( "Accept" ) ;
147+
148+ if ( ! isBlobRequest && ! hasAcceptHeader ) {
149+ headers [ "Accept" ] = "application/json" ;
150+ }
151+
138152 return next . handle (
139153 request . clone ( {
140154 setHeaders : headers ,
@@ -144,17 +158,32 @@ export class BearerTokenInterceptor implements HttpInterceptor {
144158 ) ;
145159 }
146160
147- // Если токен уже обновляется, ждем завершения процесса
148161 return this . refreshTokenSubject . pipe (
149- filter ( token => token !== null ) , // Ждем получения нового токена
150- take ( 1 ) , // Берем только первое значение
151- switchMap ( token =>
152- next . handle (
162+ filter ( token => token !== null ) ,
163+ take ( 1 ) ,
164+ switchMap ( token => {
165+ const headers : Record < string , string > = {
166+ Authorization : `Bearer ${ token } ` ,
167+ } ;
168+
169+ const isBlobRequest =
170+ request . url . includes ( "/export" ) ||
171+ request . url . includes ( "/download" ) ||
172+ ( request . headers . has ( "X-Request-Type" ) &&
173+ request . headers . get ( "X-Request-Type" ) === "blob" ) ;
174+
175+ const hasAcceptHeader = request . headers . has ( "Accept" ) ;
176+
177+ if ( ! isBlobRequest && ! hasAcceptHeader ) {
178+ headers [ "Accept" ] = "application/json" ;
179+ }
180+
181+ return next . handle (
153182 request . clone ( {
154- setHeaders : { Authorization : `Bearer ${ token } ` } ,
183+ setHeaders : headers ,
155184 } )
156- )
157- )
185+ ) ;
186+ } )
158187 ) ;
159188 }
160189}
0 commit comments