Skip to content

Commit e7d9a3d

Browse files
fix: better thread safety via early initializing SSL store during HTTP client creation
1 parent 866194b commit e7d9a3d

File tree

5 files changed

+18
-5
lines changed

5 files changed

+18
-5
lines changed

lib/openai.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require "etc"
99
require "json"
1010
require "net/http"
11+
require "openssl"
1112
require "pathname"
1213
require "rbconfig"
1314
require "securerandom"

lib/openai/internal/transport/pooled_net_requester.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ class PooledNetRequester
1616
class << self
1717
# @api private
1818
#
19+
# @param cert_store [OpenSSL::X509::Store]
1920
# @param url [URI::Generic]
2021
#
2122
# @return [Net::HTTP]
22-
def connect(url)
23+
def connect(cert_store:, url:)
2324
port =
2425
case [url.port, url.scheme]
2526
in [Integer, _]
@@ -33,6 +34,8 @@ def connect(url)
3334
Net::HTTP.new(url.host, port).tap do
3435
_1.use_ssl = %w[https wss].include?(url.scheme)
3536
_1.max_retries = 0
37+
38+
(_1.cert_store = cert_store) if _1.use_ssl?
3639
end
3740
end
3841

@@ -102,7 +105,7 @@ def build_request(request, &blk)
102105
pool =
103106
@mutex.synchronize do
104107
@pools[origin] ||= ConnectionPool.new(size: @size) do
105-
self.class.connect(url)
108+
self.class.connect(cert_store: @cert_store, url: url)
106109
end
107110
end
108111

@@ -192,6 +195,7 @@ def execute(request)
192195
def initialize(size: self.class::DEFAULT_MAX_CONNECTIONS)
193196
@mutex = Mutex.new
194197
@size = size
198+
@cert_store = OpenSSL::X509::Store.new.tap(&:set_default_paths)
195199
@pools = {}
196200
end
197201

manifest.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ dependencies:
66
- etc
77
- json
88
- net/http
9+
- openssl
910
- pathname
1011
- rbconfig
1112
- securerandom

rbi/openai/internal/transport/pooled_net_requester.rbi

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ module OpenAI
2626

2727
class << self
2828
# @api private
29-
sig { params(url: URI::Generic).returns(Net::HTTP) }
30-
def connect(url)
29+
sig do
30+
params(cert_store: OpenSSL::X509::Store, url: URI::Generic).returns(
31+
Net::HTTP
32+
)
33+
end
34+
def connect(cert_store:, url:)
3135
end
3236

3337
# @api private

sig/openai/internal/transport/pooled_net_requester.rbs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ module OpenAI
1717

1818
DEFAULT_MAX_CONNECTIONS: Integer
1919

20-
def self.connect: (URI::Generic url) -> top
20+
def self.connect: (
21+
cert_store: OpenSSL::X509::Store,
22+
url: URI::Generic
23+
) -> top
2124

2225
def self.calibrate_socket_timeout: (top conn, Float deadline) -> void
2326

0 commit comments

Comments
 (0)