|
7 | 7 | from urllib.parse import urljoin |
8 | 8 |
|
9 | 9 | from urllib3 import HTTPConnectionPool, HTTPSConnectionPool, ProxyManager |
10 | | -from urllib3.exceptions import HTTPError, MaxRetryError |
11 | 10 | from urllib3.util import make_headers |
12 | 11 |
|
13 | 12 | from databricks.sql.auth.authenticators import AuthProvider |
@@ -227,77 +226,46 @@ def _make_request( |
227 | 226 |
|
228 | 227 | logger.debug(f"Making {method} request to {url}") |
229 | 228 |
|
230 | | - try: |
231 | | - response = self._pool.request( |
232 | | - method=method.upper(), |
233 | | - url=url, |
234 | | - body=body, |
235 | | - headers=headers, |
236 | | - preload_content=True, |
237 | | - retries=self.retry_policy, |
238 | | - ) |
| 229 | + # When v3 retries are enabled, urllib3 handles retries internally via DatabricksRetryPolicy |
| 230 | + # When disabled, we let exceptions bubble up (similar to Thrift backend approach) |
| 231 | + response = self._pool.request( |
| 232 | + method=method.upper(), |
| 233 | + url=url, |
| 234 | + body=body, |
| 235 | + headers=headers, |
| 236 | + preload_content=True, |
| 237 | + retries=self.retry_policy, |
| 238 | + ) |
239 | 239 |
|
240 | | - logger.debug(f"Response status: {response.status}") |
241 | | - |
242 | | - # Handle successful responses |
243 | | - if 200 <= response.status < 300: |
244 | | - if response.data: |
245 | | - try: |
246 | | - result = json.loads(response.data.decode("utf-8")) |
247 | | - logger.debug("Successfully parsed JSON response") |
248 | | - return result |
249 | | - except (json.JSONDecodeError, UnicodeDecodeError) as e: |
250 | | - logger.error(f"Failed to parse JSON response: {e}") |
251 | | - raise RequestError(f"Invalid JSON response: {e}", e) |
252 | | - return {} |
253 | | - |
254 | | - # Handle error responses |
255 | | - error_message = f"SEA HTTP request failed with status {response.status}" |
256 | | - |
257 | | - try: |
258 | | - if response.data: |
259 | | - error_details = json.loads(response.data.decode("utf-8")) |
260 | | - if isinstance(error_details, dict) and "message" in error_details: |
261 | | - error_message = f"{error_message}: {error_details['message']}" |
262 | | - logger.error(f"Request failed: {error_details}") |
263 | | - except (json.JSONDecodeError, UnicodeDecodeError): |
264 | | - # Log raw response if we can't parse JSON |
265 | | - content = response.data.decode("utf-8", errors="replace") if response.data else "" |
266 | | - logger.error(f"Request failed with non-JSON response: {content}") |
267 | | - |
268 | | - raise RequestError(error_message, None) |
269 | | - |
270 | | - except MaxRetryError as e: |
271 | | - # Extract the most recent error from the retry history |
272 | | - error_message = f"SEA request failed after retries: {str(e)}" |
273 | | - |
274 | | - if hasattr(e, "reason") and e.reason: |
275 | | - if hasattr(e.reason, "response"): |
276 | | - # Extract status code and body from the final failed response |
277 | | - response = e.reason.response |
278 | | - error_message = f"SEA request failed after retries (status {response.status})" |
279 | | - try: |
280 | | - if response.data: |
281 | | - error_details = json.loads(response.data.decode("utf-8")) |
282 | | - if isinstance(error_details, dict) and "message" in error_details: |
283 | | - error_message = f"{error_message}: {error_details['message']}" |
284 | | - except (json.JSONDecodeError, UnicodeDecodeError): |
285 | | - pass |
286 | | - else: |
287 | | - error_message = f"SEA request failed after retries: {str(e.reason)}" |
288 | | - |
289 | | - logger.error(error_message) |
290 | | - raise RequestError(error_message, e) |
291 | | - |
292 | | - except HTTPError as e: |
293 | | - error_message = f"SEA HTTP error: {str(e)}" |
294 | | - logger.error(error_message) |
295 | | - raise RequestError(error_message, e) |
296 | | - |
297 | | - except Exception as e: |
298 | | - error_message = f"Unexpected error in SEA request: {str(e)}" |
299 | | - logger.error(error_message) |
300 | | - raise RequestError(error_message, e) |
| 240 | + logger.debug(f"Response status: {response.status}") |
| 241 | + |
| 242 | + # Handle successful responses |
| 243 | + if 200 <= response.status < 300: |
| 244 | + if response.data: |
| 245 | + try: |
| 246 | + result = json.loads(response.data.decode("utf-8")) |
| 247 | + logger.debug("Successfully parsed JSON response") |
| 248 | + return result |
| 249 | + except (json.JSONDecodeError, UnicodeDecodeError) as e: |
| 250 | + logger.error(f"Failed to parse JSON response: {e}") |
| 251 | + raise RequestError(f"Invalid JSON response: {e}", e) |
| 252 | + return {} |
| 253 | + |
| 254 | + # Handle error responses |
| 255 | + error_message = f"SEA HTTP request failed with status {response.status}" |
| 256 | + |
| 257 | + try: |
| 258 | + if response.data: |
| 259 | + error_details = json.loads(response.data.decode("utf-8")) |
| 260 | + if isinstance(error_details, dict) and "message" in error_details: |
| 261 | + error_message = f"{error_message}: {error_details['message']}" |
| 262 | + logger.error(f"Request failed: {error_details}") |
| 263 | + except (json.JSONDecodeError, UnicodeDecodeError): |
| 264 | + # Log raw response if we can't parse JSON |
| 265 | + content = response.data.decode("utf-8", errors="replace") if response.data else "" |
| 266 | + logger.error(f"Request failed with non-JSON response: {content}") |
| 267 | + |
| 268 | + raise RequestError(error_message, None) |
301 | 269 |
|
302 | 270 | def _get_command_type_from_path(self, path: str, method: str) -> CommandType: |
303 | 271 | """ |
|
0 commit comments