11import json
22import logging
33import requests
4- from typing import Dict , Any , Optional , Union , List
4+ from typing import Callable , Dict , Any , Optional , Union , List , Tuple
55from urllib .parse import urljoin
66
77from databricks .sql .auth .authenticators import AuthProvider
@@ -23,7 +23,7 @@ def __init__(
2323 server_hostname : str ,
2424 port : int ,
2525 http_path : str ,
26- http_headers : List [tuple ],
26+ http_headers : List [Tuple [ str , str ] ],
2727 auth_provider : AuthProvider ,
2828 ssl_options : SSLOptions ,
2929 ** kwargs ,
@@ -40,6 +40,7 @@ def __init__(
4040 ssl_options: SSL configuration options
4141 **kwargs: Additional keyword arguments
4242 """
43+
4344 self .server_hostname = server_hostname
4445 self .port = port
4546 self .http_path = http_path
@@ -48,7 +49,7 @@ def __init__(
4849
4950 self .base_url = f"https://{ server_hostname } :{ port } "
5051
51- self .headers = dict (http_headers )
52+ self .headers : Dict [ str , str ] = dict (http_headers )
5253 self .headers .update ({"Content-Type" : "application/json" })
5354
5455 self .max_retries = kwargs .get ("_retry_stop_after_attempts_count" , 30 )
@@ -86,6 +87,17 @@ def _get_auth_headers(self) -> Dict[str, str]:
8687 self .auth_provider .add_headers (headers )
8788 return headers
8889
90+ def _get_call (self , method : str ) -> Callable :
91+ """Get the appropriate HTTP method function."""
92+ method = method .upper ()
93+ if method == "GET" :
94+ return self .session .get
95+ if method == "POST" :
96+ return self .session .post
97+ if method == "DELETE" :
98+ return self .session .delete
99+ raise ValueError (f"Unsupported HTTP method: { method } " )
100+
89101 def _make_request (
90102 self ,
91103 method : str ,
@@ -100,33 +112,28 @@ def _make_request(
100112 method: HTTP method (GET, POST, DELETE)
101113 path: API endpoint path
102114 data: Request payload data
115+ params: Query parameters
103116
104117 Returns:
105118 Dict[str, Any]: Response data parsed from JSON
106119
107120 Raises:
108121 RequestError: If the request fails
109122 """
123+
110124 url = urljoin (self .base_url , path )
111- headers = {** self .headers , ** self ._get_auth_headers ()}
125+ headers : Dict [ str , str ] = {** self .headers , ** self ._get_auth_headers ()}
112126
113127 logger .debug (f"making { method } request to { url } " )
114128
115129 try :
116- args = {
117- "url" : url ,
118- "headers" : headers ,
119- "json" : data ,
120- "params" : params ,
121- }
122- if method .upper () == "GET" :
123- response = self .session .get (** args )
124- elif method .upper () == "POST" :
125- response = self .session .post (** args )
126- elif method .upper () == "DELETE" :
127- response = self .session .delete (** args )
128- else :
129- raise ValueError (f"Unsupported HTTP method: { method } " )
130+ call = self ._get_call (method )
131+ response = call (
132+ url = url ,
133+ headers = headers ,
134+ json = data ,
135+ params = params ,
136+ )
130137
131138 # Check for HTTP errors
132139 response .raise_for_status ()
@@ -137,45 +144,41 @@ def _make_request(
137144 # Parse JSON response
138145 if response .content :
139146 result = response .json ()
140-
141147 # Log response content (but limit it for large responses)
142- content_str = json .dumps (result , indent = 4 , sort_keys = True )
143- content_str = (
144- content_str [:1000 ] + "..."
145- if len (content_str ) > 1000
146- else content_str
147- )
148- logger .debug (f"Response content: { content_str } " )
149-
148+ content_str = json .dumps (result )
149+ if len (content_str ) > 1000 :
150+ logger .debug (
151+ f"Response content (truncated): { content_str [:1000 ]} ..."
152+ )
153+ else :
154+ logger .debug (f"Response content: { content_str } " )
150155 return result
151156 return {}
152157
153158 except requests .exceptions .RequestException as e :
154- # Handle request errors
159+ # Handle request errors and extract details from response if available
155160 error_message = f"SEA HTTP request failed: { str (e )} "
156- logger .error (error_message )
157161
158- # Extract error details from response if available
159162 if hasattr (e , "response" ) and e .response is not None :
163+ status_code = e .response .status_code
160164 try :
161165 error_details = e .response .json ()
162166 error_message = (
163167 f"{ error_message } : { error_details .get ('message' , '' )} "
164168 )
165169 logger .error (
166- f"Response status: { e . response . status_code } , Error details : { error_details } "
170+ f"Request failed ( status { status_code } ) : { error_details } "
167171 )
168172 except (ValueError , KeyError ):
169- # If we can't parse the JSON, just log the raw content
170- content_str = (
173+ # If we can't parse JSON, log raw content
174+ content = (
171175 e .response .content .decode ("utf-8" , errors = "replace" )
172176 if isinstance (e .response .content , bytes )
173177 else str (e .response .content )
174178 )
175- logger .error (
176- f"Response status: { e .response .status_code } , Raw content: { content_str } "
177- )
178- pass
179+ logger .error (f"Request failed (status { status_code } ): { content } " )
180+ else :
181+ logger .error (error_message )
179182
180183 # Re-raise as a RequestError
181184 from databricks .sql .exc import RequestError
0 commit comments