99
1010import aiohttp
1111
12- from .auth import AuthenticationError , NavienAuthClient
12+ from .auth import (
13+ AuthenticationError ,
14+ NavienAuthClient ,
15+ TokenRefreshError ,
16+ )
1317from .config import API_BASE_URL
1418from .models import Device , FirmwareInfo , TOUInfo
1519
@@ -114,6 +118,7 @@ async def _make_request(
114118 endpoint : str ,
115119 json_data : Optional [dict [str , Any ]] = None ,
116120 params : Optional [dict [str , Any ]] = None ,
121+ retry_on_auth_failure : bool = True ,
117122 ) -> dict [str , Any ]:
118123 """
119124 Make an authenticated API request.
@@ -123,6 +128,7 @@ async def _make_request(
123128 endpoint: API endpoint path
124129 json_data: JSON body data
125130 params: Query parameters
131+ retry_on_auth_failure: Whether to retry once on 401 errors
126132
127133 Returns:
128134 Response data dictionary
@@ -158,6 +164,42 @@ async def _make_request(
158164 msg = response_data .get ("msg" , "" )
159165
160166 if code != 200 or not response .ok :
167+ # If we get a 401 and haven't retried yet, try refreshing
168+ # token
169+ if code == 401 and retry_on_auth_failure :
170+ _logger .warning (
171+ "Received 401 Unauthorized. "
172+ "Attempting to refresh token..."
173+ )
174+ try :
175+ # Try to refresh the token
176+ tokens = self ._auth_client .current_tokens
177+ if tokens and tokens .refresh_token :
178+ await self ._auth_client .refresh_token (
179+ tokens .refresh_token
180+ )
181+ # Retry the request once with new token
182+ return await self ._make_request (
183+ method ,
184+ endpoint ,
185+ json_data ,
186+ params ,
187+ retry_on_auth_failure = False ,
188+ )
189+ else :
190+ _logger .error (
191+ "Cannot refresh token: "
192+ "refresh_token not available"
193+ )
194+ except (
195+ TokenRefreshError ,
196+ AuthenticationError ,
197+ ) as refresh_error :
198+ _logger .error (
199+ f"Token refresh failed: { refresh_error } "
200+ )
201+ # Fall through to raise original error
202+
161203 _logger .error (f"API error: { code } - { msg } " )
162204 raise APIError (
163205 f"API request failed: { msg } " ,
0 commit comments