@@ -182,3 +182,60 @@ def test_http_response_headers_in_sse_client():
182182
183183 # Second item should be the event
184184 assert isinstance (all_items [1 ], Event )
185+
186+
187+ def test_http_status_error_includes_headers ():
188+ """Test that HTTPStatusError captures response headers"""
189+ with start_server () as server :
190+ server .for_path ('/' , BasicResponse (429 , None , {
191+ 'Retry-After' : '120' ,
192+ 'X-RateLimit-Remaining' : '0' ,
193+ 'X-RateLimit-Reset' : '1234567890'
194+ }))
195+ try :
196+ with ConnectStrategy .http (server .uri ).create_client (logger ()) as client :
197+ client .connect (None )
198+ raise Exception ("expected exception, did not get one" )
199+ except HTTPStatusError as e :
200+ assert e .status == 429
201+ assert e .headers is not None
202+ assert e .headers .get ('Retry-After' ) == '120'
203+ assert e .headers .get ('X-RateLimit-Remaining' ) == '0'
204+ assert e .headers .get ('X-RateLimit-Reset' ) == '1234567890'
205+
206+
207+ def test_http_content_type_error_includes_headers ():
208+ """Test that HTTPContentTypeError captures response headers"""
209+ with start_server () as server :
210+ with ChunkedResponse ({'Content-Type' : 'application/json' , 'X-Custom' : 'value' }) as stream :
211+ server .for_path ('/' , stream )
212+ try :
213+ with ConnectStrategy .http (server .uri ).create_client (logger ()) as client :
214+ client .connect (None )
215+ raise Exception ("expected exception, did not get one" )
216+ except HTTPContentTypeError as e :
217+ assert e .content_type == "application/json"
218+ assert e .headers is not None
219+ assert e .headers .get ('Content-Type' ) == 'application/json'
220+ assert e .headers .get ('X-Custom' ) == 'value'
221+
222+
223+ def test_fault_exposes_headers_from_http_error ():
224+ """Test that Fault.headers exposes headers from HTTP errors"""
225+ with start_server () as server :
226+ server .for_path ('/' , BasicResponse (503 , None , {
227+ 'Retry-After' : '60' ,
228+ 'X-Error-Code' : 'SERVICE_UNAVAILABLE'
229+ }))
230+ with SSEClient (
231+ connect = ConnectStrategy .http (server .uri ),
232+ error_strategy = ErrorStrategy .always_continue (),
233+ retry_delay_strategy = no_delay ()
234+ ) as client :
235+ # Read first item which should be a Fault with the error
236+ fault = next (client .all )
237+ assert isinstance (fault , Fault )
238+ assert isinstance (fault .error , HTTPStatusError )
239+ assert fault .headers is not None
240+ assert fault .headers .get ('Retry-After' ) == '60'
241+ assert fault .headers .get ('X-Error-Code' ) == 'SERVICE_UNAVAILABLE'
0 commit comments