44import contextlib
55import itertools
66import logging
7- from typing import TYPE_CHECKING , Callable
7+ from typing import TYPE_CHECKING , Any , Callable , Mapping
88
99from .compat import urlparse
1010from .vendored import requests
11- from .vendored .requests import Session
11+ from .vendored .requests import Response , Session
1212from .vendored .requests .adapters import HTTPAdapter
1313from .vendored .requests .exceptions import InvalidProxyURL
1414from .vendored .requests .utils import prepend_scheme_if_needed , select_proxy
@@ -134,8 +134,11 @@ def make_session(self) -> Session:
134134 return s
135135
136136 @contextlib .contextmanager
137- def use_session (self , url : str | None = None ):
138- if not self ._use_pooling :
137+ def use_session (
138+ self , url : str | None = None , use_pooling : bool | None = None
139+ ) -> Session :
140+ use_pooling = use_pooling if use_pooling is not None else self ._use_pooling
141+ if not use_pooling :
139142 session = self .make_session ()
140143 try :
141144 yield session
@@ -150,6 +153,30 @@ def use_session(self, url: str | None = None):
150153 finally :
151154 pool .return_session (session )
152155
156+ def request (
157+ self ,
158+ method : str ,
159+ url : str ,
160+ * ,
161+ headers : Mapping [str , str ] | None = None ,
162+ timeout_sec : int | None = 3 ,
163+ use_pooling : bool | None = None ,
164+ ** kwargs : Any ,
165+ ) -> Response :
166+ """Make a single HTTP request handled by this *SessionManager*.
167+
168+ This wraps :pymeth:`use_session` so callers don’t have to manage the
169+ context manager themselves.
170+ """
171+ with self .use_session (url , use_pooling ) as session :
172+ return session .request (
173+ method = method .upper (),
174+ url = url ,
175+ headers = headers ,
176+ timeout = timeout_sec ,
177+ ** kwargs ,
178+ )
179+
153180 def close (self ):
154181 for pool in self ._sessions_map .values ():
155182 pool .close ()
@@ -160,3 +187,33 @@ def clone(self, *, use_pooling: bool | None = None) -> SessionManager:
160187 use_pooling = self ._use_pooling if use_pooling is None else use_pooling ,
161188 adapter_factory = self ._adapter_factory ,
162189 )
190+
191+
192+ def request (
193+ method : str ,
194+ url : str ,
195+ * ,
196+ headers : Mapping [str , str ] | None = None ,
197+ timeout_sec : int | None = 3 ,
198+ session_manager : SessionManager | None = None ,
199+ use_pooling : bool | None = None ,
200+ ** kwargs : Any ,
201+ ) -> Response :
202+ """Convenience wrapper – *requires* an explicit ``session_manager``.
203+
204+ This keeps a one-liner API equivalent to the old
205+ ``snowflake.connector.http_client.request`` helper.
206+ """
207+ if session_manager is None :
208+ raise ValueError (
209+ "session_manager is required - no default session manager available"
210+ )
211+
212+ return session_manager .request (
213+ method = method ,
214+ url = url ,
215+ headers = headers ,
216+ timeout_sec = timeout_sec ,
217+ use_pooling = use_pooling ,
218+ ** kwargs ,
219+ )
0 commit comments