@@ -124,6 +124,20 @@ def follow_redirect(request, status:, response_headers:)
124124
125125 request
126126 end
127+
128+ # @api private
129+ #
130+ # @param status [Integer, OpenAI::APIConnectionError]
131+ # @param stream [Enumerable, nil]
132+ def reap_connection! ( status , stream :)
133+ case status
134+ in ( ..199 ) | ( 300 ..499 )
135+ stream &.each { next }
136+ in OpenAI ::APIConnectionError | ( 500 ..)
137+ OpenAI ::Util . close_fused! ( stream )
138+ else
139+ end
140+ end
127141 end
128142
129143 # @api private
@@ -321,28 +335,23 @@ def initialize(
321335 end
322336
323337 begin
324- response , stream = @requester . execute ( input )
325- status = Integer ( response . code )
338+ status , response , stream = @requester . execute ( input )
326339 rescue OpenAI ::APIConnectionError => e
327340 status = e
328341 end
329342
330- # normally we want to drain the response body and reuse the HTTP session by clearing the socket buffers
331- # unless we hit a server error
332- srv_fault = ( 500 ...) . include? ( status )
333-
334343 case status
335344 in ..299
336345 [ status , response , stream ]
337346 in 300 ..399 if redirect_count >= self . class ::MAX_REDIRECTS
338- message = "Failed to complete the request within #{ self . class :: MAX_REDIRECTS } redirects."
347+ self . class . reap_connection! ( status , stream : stream )
339348
340- stream . each { next }
349+ message = "Failed to complete the request within #{ self . class :: MAX_REDIRECTS } redirects."
341350 raise OpenAI ::APIConnectionError . new ( url : url , message : message )
342351 in 300 ..399
343- request = self . class . follow_redirect ( request , status : status , response_headers : response )
352+ self . class . reap_connection! ( status , stream : stream )
344353
345- stream . each { next }
354+ request = self . class . follow_redirect ( request , status : status , response_headers : response )
346355 send_request (
347356 request ,
348357 redirect_count : redirect_count + 1 ,
@@ -352,12 +361,10 @@ def initialize(
352361 in OpenAI ::APIConnectionError if retry_count >= max_retries
353362 raise status
354363 in ( 400 ..) if retry_count >= max_retries || !self . class . should_retry? ( status , headers : response )
355- decoded = OpenAI ::Util . decode_content ( response , stream : stream , suppress_error : true )
356-
357- if srv_fault
358- OpenAI ::Util . close_fused! ( stream )
359- else
360- stream . each { next }
364+ decoded = Kernel . then do
365+ OpenAI ::Util . decode_content ( response , stream : stream , suppress_error : true )
366+ ensure
367+ self . class . reap_connection! ( status , stream : stream )
361368 end
362369
363370 raise OpenAI ::APIStatusError . for (
@@ -368,13 +375,9 @@ def initialize(
368375 response : response
369376 )
370377 in ( 400 ..) | OpenAI ::APIConnectionError
371- delay = retry_delay ( response , retry_count : retry_count )
378+ self . class . reap_connection! ( status , stream : stream )
372379
373- if srv_fault
374- OpenAI ::Util . close_fused! ( stream )
375- else
376- stream &.each { next }
377- end
380+ delay = retry_delay ( response , retry_count : retry_count )
378381 sleep ( delay )
379382
380383 send_request (
0 commit comments