@@ -124,6 +124,20 @@ def follow_redirect(request, status:, response_headers:)
124
124
125
125
request
126
126
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
127
141
end
128
142
129
143
# @api private
@@ -321,28 +335,23 @@ def initialize(
321
335
end
322
336
323
337
begin
324
- response , stream = @requester . execute ( input )
325
- status = Integer ( response . code )
338
+ status , response , stream = @requester . execute ( input )
326
339
rescue OpenAI ::APIConnectionError => e
327
340
status = e
328
341
end
329
342
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
-
334
343
case status
335
344
in ..299
336
345
[ status , response , stream ]
337
346
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 )
339
348
340
- stream . each { next }
349
+ message = "Failed to complete the request within #{ self . class :: MAX_REDIRECTS } redirects."
341
350
raise OpenAI ::APIConnectionError . new ( url : url , message : message )
342
351
in 300 ..399
343
- request = self . class . follow_redirect ( request , status : status , response_headers : response )
352
+ self . class . reap_connection! ( status , stream : stream )
344
353
345
- stream . each { next }
354
+ request = self . class . follow_redirect ( request , status : status , response_headers : response )
346
355
send_request (
347
356
request ,
348
357
redirect_count : redirect_count + 1 ,
@@ -352,12 +361,10 @@ def initialize(
352
361
in OpenAI ::APIConnectionError if retry_count >= max_retries
353
362
raise status
354
363
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 )
361
368
end
362
369
363
370
raise OpenAI ::APIStatusError . for (
@@ -368,13 +375,9 @@ def initialize(
368
375
response : response
369
376
)
370
377
in ( 400 ..) | OpenAI ::APIConnectionError
371
- delay = retry_delay ( response , retry_count : retry_count )
378
+ self . class . reap_connection! ( status , stream : stream )
372
379
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 )
378
381
sleep ( delay )
379
382
380
383
send_request (
0 commit comments