1616
1717from urllib .parse import quote as _url_quote
1818
19- import aiohttp
20-
21- from ..core ._async_http import _AsyncHttpClient
19+ from ..core ._async_http import _AsyncHttpClient , _HttpResponse
2220from ._async_upload import _AsyncFileUploadMixin
2321from ._async_relationships import _AsyncRelationshipOperationsMixin
2422from ...core .errors import *
@@ -109,7 +107,7 @@ async def _headers(self) -> Dict[str, str]:
109107 "User-Agent" : ua ,
110108 }
111109
112- async def _raw_request (self , method : str , url : str , ** kwargs ) -> aiohttp . ClientResponse :
110+ async def _raw_request (self , method : str , url : str , ** kwargs ) -> _HttpResponse :
113111 return await self ._http ._request (method , url , ** kwargs )
114112
115113 async def _request (
@@ -119,7 +117,7 @@ async def _request(
119117 * ,
120118 expected : tuple [int , ...] = _DEFAULT_EXPECTED_STATUSES ,
121119 ** kwargs ,
122- ) -> aiohttp . ClientResponse :
120+ ) -> _HttpResponse :
123121 # Acquire base headers once (async), then use a sync closure for _RequestContext.build.
124122 # _RequestContext.build is a sync classmethod defined in _ODataBase and shared by both
125123 # sync and async clients — keeping it sync avoids duplicating the header-injection logic.
@@ -145,11 +143,7 @@ def _merge(h: Optional[Dict[str, str]]) -> Dict[str, str]:
145143 return r
146144
147145 response_headers = getattr (r , "headers" , {}) or {}
148- raw_text = ""
149- try :
150- raw_text = await r .text ()
151- except Exception :
152- pass
146+ raw_text = r .text
153147 body_excerpt = raw_text [:200 ]
154148 svc_code = None
155149 msg = f"HTTP { r .status } "
@@ -207,7 +201,7 @@ async def _execute_raw(
207201 req : _RawRequest ,
208202 * ,
209203 expected : tuple [int , ...] = _DEFAULT_EXPECTED_STATUSES ,
210- ) -> aiohttp . ClientResponse :
204+ ) -> _HttpResponse :
211205 """Execute a ``_RawRequest`` and return the HTTP response.
212206
213207 Encodes the pre-serialised body (if present) as UTF-8 and merges any
@@ -278,8 +272,8 @@ async def _create_multiple(
278272 raise TypeError ("All items for multi-create must be dicts" )
279273 r = await self ._execute_raw (await self ._build_create_multiple (entity_set , table_schema_name , records ))
280274 try :
281- body = await r .json (content_type = None )
282- except ( ValueError , aiohttp . ContentTypeError ) :
275+ body = r .json ()
276+ except ValueError :
283277 body = {}
284278 if not isinstance (body , dict ):
285279 return []
@@ -468,8 +462,8 @@ async def _delete_multiple(
468462 )
469463 job_id = None
470464 try :
471- body = await response .json (content_type = None )
472- except ( ValueError , aiohttp . ContentTypeError ) :
465+ body = response .json ()
466+ except ValueError :
473467 body = {}
474468 if isinstance (body , dict ):
475469 job_id = body .get ("JobId" )
@@ -556,7 +550,7 @@ async def _get(
556550 r = await self ._execute_raw (
557551 await self ._build_get (table_schema_name , key , select = select , expand = expand , include_annotations = include_annotations )
558552 )
559- return await r .json (content_type = None )
553+ return r .json ()
560554
561555 async def _get_multiple (
562556 self ,
@@ -609,8 +603,8 @@ async def _do_request(url: str, *, params: Optional[Dict[str, Any]] = None) -> D
609603 headers = extra_headers if extra_headers else None
610604 r = await self ._request ("get" , url , headers = headers , params = params )
611605 try :
612- return await r .json (content_type = None )
613- except ( ValueError , aiohttp . ContentTypeError ) :
606+ return r .json ()
607+ except ValueError :
614608 return {}
615609
616610 entity_set = await self ._entity_set_from_schema_name (table_schema_name )
@@ -682,8 +676,8 @@ async def _query_sql(self, sql: str) -> list[dict[str, Any]]:
682676
683677 r = await self ._execute_raw (await self ._build_sql (sql ))
684678 try :
685- body = await r .json (content_type = None )
686- except ( ValueError , aiohttp . ContentTypeError ) :
679+ body = r .json ()
680+ except ValueError :
687681 return []
688682
689683 # Collect first page
@@ -745,8 +739,8 @@ async def _query_sql(self, sql: str) -> list[dict[str, Any]]:
745739 )
746740 break
747741 try :
748- page_body = await page_resp .json (content_type = None )
749- except ( ValueError , aiohttp . ContentTypeError ) as exc :
742+ page_body = page_resp .json ()
743+ except ValueError as exc :
750744 warnings .warn (
751745 f"SQL pagination stopped after { len (results )} rows — "
752746 f"the next-page response was not valid JSON: { exc } . "
@@ -790,9 +784,9 @@ async def _entity_set_from_schema_name(self, table_schema_name: str) -> str:
790784 }
791785 r = await self ._request ("get" , url , params = params )
792786 try :
793- body = await r .json (content_type = None )
787+ body = r .json ()
794788 items = body .get ("value" , []) if isinstance (body , dict ) else []
795- except ( ValueError , aiohttp . ContentTypeError ) :
789+ except ValueError :
796790 items = []
797791 if not items :
798792 plural_hint = (
@@ -838,7 +832,7 @@ async def _get_entity_by_table_schema_name(
838832 "$filter" : f"LogicalName eq '{ logical_escaped } '" ,
839833 }
840834 r = await self ._request ("get" , url , params = params , headers = headers )
841- items = (await r .json (content_type = None )).get ("value" , [])
835+ items = (r .json ()).get ("value" , [])
842836 return items [0 ] if items else None
843837
844838 async def _create_entity (
@@ -903,8 +897,8 @@ async def _get_attribute_metadata(
903897 }
904898 r = await self ._request ("get" , url , params = params )
905899 try :
906- body = await r .json (content_type = None )
907- except ( ValueError , aiohttp . ContentTypeError ) :
900+ body = r .json ()
901+ except ValueError :
908902 return None
909903 items = body .get ("value" ) if isinstance (body , dict ) else None
910904 if isinstance (items , list ) and items :
@@ -955,7 +949,7 @@ async def _list_columns(
955949 if filter :
956950 params ["$filter" ] = filter
957951 r = await self ._request ("get" , url , params = params )
958- return (await r .json (content_type = None )).get ("value" , [])
952+ return (r .json ()).get ("value" , [])
959953
960954 async def _wait_for_attribute_visibility (
961955 self ,
@@ -991,7 +985,7 @@ async def _wait_for_attribute_visibility(
991985 f"after { total_wait } seconds (exhausted all retries)."
992986 ) from last_error
993987
994- async def _request_metadata_with_retry (self , method : str , url : str , ** kwargs ) -> aiohttp . ClientResponse :
988+ async def _request_metadata_with_retry (self , method : str , url : str , ** kwargs ) -> _HttpResponse :
995989 """Fetch metadata with retries on transient errors."""
996990 max_attempts = 5
997991 backoff_seconds = 0.4
@@ -1038,7 +1032,7 @@ async def _bulk_fetch_picklists(self, table_schema_name: str) -> None:
10381032 f"?$select=LogicalName&$expand=OptionSet($select=Options)"
10391033 )
10401034 response = await self ._request_metadata_with_retry ("get" , url )
1041- body = await response .json (content_type = None )
1035+ body = response .json ()
10421036 items = body .get ("value" , []) if isinstance (body , dict ) else []
10431037
10441038 picklists : Dict [str , Dict [str , int ]] = {}
@@ -1165,7 +1159,7 @@ async def _list_tables(
11651159 :raises HttpError: If the metadata request fails.
11661160 """
11671161 r = await self ._execute_raw (self ._build_list_entities (filter = filter , select = select ))
1168- return (await r .json (content_type = None )).get ("value" , [])
1162+ return (r .json ()).get ("value" , [])
11691163
11701164 async def _delete_table (self , table_schema_name : str ) -> None :
11711165 """Delete a table by schema name.
@@ -1264,7 +1258,7 @@ async def _get_alternate_keys(self, table_schema_name: str) -> List[Dict[str, An
12641258 logical_name = ent .get ("LogicalName" , table_schema_name .lower ())
12651259 url = f"{ self .api } /EntityDefinitions(LogicalName='{ logical_name } ')/Keys"
12661260 r = await self ._request ("get" , url )
1267- return (await r .json (content_type = None )).get ("value" , [])
1261+ return (r .json ()).get ("value" , [])
12681262
12691263 async def _delete_alternate_key (self , table_schema_name : str , key_id : str ) -> None :
12701264 """Delete an alternate key by metadata ID.
0 commit comments