From 42ad2559cadbb41c9cd347c03d4fcad7e1349fb2 Mon Sep 17 00:00:00 2001 From: Augustinas Sueris Date: Tue, 29 Jul 2025 11:08:30 +0300 Subject: [PATCH 1/9] add faraday net_http_persistent adapter Signed-off-by: Augustinas Sueris --- .../openfeature-go-feature-flag-provider/Gemfile.lock | 7 +++++++ .../openfeature-go-feature-flag-provider.gemspec | 1 + 2 files changed, 8 insertions(+) diff --git a/providers/openfeature-go-feature-flag-provider/Gemfile.lock b/providers/openfeature-go-feature-flag-provider/Gemfile.lock index d5e4fad..fe457c2 100644 --- a/providers/openfeature-go-feature-flag-provider/Gemfile.lock +++ b/providers/openfeature-go-feature-flag-provider/Gemfile.lock @@ -3,6 +3,7 @@ PATH specs: openfeature-go-feature-flag-provider (0.1.3) faraday (~> 2.10) + faraday-net_http_persistent (~> 2.0) openfeature-sdk (~> 0.3.1) GEM @@ -12,6 +13,7 @@ GEM public_suffix (>= 2.0.2, < 7.0) ast (2.4.2) bigdecimal (3.1.8) + connection_pool (2.5.3) crack (1.0.0) bigdecimal rexml @@ -23,6 +25,9 @@ GEM logger faraday-net_http (3.4.0) net-http (>= 0.5.0) + faraday-net_http_persistent (2.3.1) + faraday (~> 2.5) + net-http-persistent (>= 4.0.4, < 5) hashdiff (1.1.1) json (2.7.2) language_server-protocol (3.17.0.3) @@ -30,6 +35,8 @@ GEM logger (1.6.1) net-http (0.5.0) uri + net-http-persistent (4.0.6) + connection_pool (~> 2.2, >= 2.2.4) openfeature-sdk (0.3.1) parallel (1.24.0) parser (3.3.0.5) diff --git a/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec b/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec index 33e03ef..d1ead75 100644 --- a/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec +++ b/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec @@ -31,6 +31,7 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency "openfeature-sdk", "~> 0.3.1" spec.add_runtime_dependency "faraday", "~> 2.10" + spec.add_runtime_dependency "faraday-net_http_persistent", "~> 2.0" spec.add_development_dependency "rake", "~> 13.0" spec.add_development_dependency "rspec", "~> 3.12.0" From 79aa78a88bd5cab8cac5758fda131a55fc464cc4 Mon Sep 17 00:00:00 2001 From: Augustinas Sueris Date: Tue, 29 Jul 2025 11:14:09 +0300 Subject: [PATCH 2/9] add connection persistance Signed-off-by: Augustinas Sueris --- .../lib/openfeature/go-feature-flag/goff_api.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb index ffa8ffc..c3856e6 100644 --- a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb +++ b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb @@ -4,6 +4,7 @@ require "net/http" require "json" require "faraday" +require "faraday/net_http_persistent" require_relative "error/errors" require_relative "model/ofrep_api_response" @@ -17,7 +18,11 @@ def initialize(options: {}) @faraday_connection = Faraday.new( url: @options.endpoint, headers: {"Content-Type" => "application/json"}.merge(@options.custom_headers || {}) - ) + ) do |f| + f.adapter :net_http_persistent do |http| + http.idle_timeout = 30 + end + end end def evaluate_ofrep_api(flag_key:, evaluation_context:) From 03aad74f9edfa7a1aca27bbb71f90b1671decafe Mon Sep 17 00:00:00 2001 From: Augustinas Sueris Date: Tue, 29 Jul 2025 16:31:16 +0300 Subject: [PATCH 3/9] added connection persistance Signed-off-by: Augustinas Sueris --- .../Gemfile.lock | 15 ++++++----- .../go_feature_flag_provider.rb | 2 +- .../openfeature/go-feature-flag/goff_api.rb | 25 +++++++++---------- ...enfeature-go-feature-flag-provider.gemspec | 3 +-- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/providers/openfeature-go-feature-flag-provider/Gemfile.lock b/providers/openfeature-go-feature-flag-provider/Gemfile.lock index fe457c2..5f47e64 100644 --- a/providers/openfeature-go-feature-flag-provider/Gemfile.lock +++ b/providers/openfeature-go-feature-flag-provider/Gemfile.lock @@ -2,8 +2,7 @@ PATH remote: . specs: openfeature-go-feature-flag-provider (0.1.3) - faraday (~> 2.10) - faraday-net_http_persistent (~> 2.0) + faraday-net_http_persistent (~> 2.3) openfeature-sdk (~> 0.3.1) GEM @@ -19,21 +18,21 @@ GEM rexml diff-lcs (1.5.1) docile (1.4.1) - faraday (2.12.1) + faraday (2.13.4) faraday-net_http (>= 2.0, < 3.5) json logger - faraday-net_http (3.4.0) + faraday-net_http (3.4.1) net-http (>= 0.5.0) faraday-net_http_persistent (2.3.1) faraday (~> 2.5) net-http-persistent (>= 4.0.4, < 5) hashdiff (1.1.1) - json (2.7.2) + json (2.13.2) language_server-protocol (3.17.0.3) lint_roller (1.1.0) - logger (1.6.1) - net-http (0.5.0) + logger (1.7.0) + net-http (0.6.0) uri net-http-persistent (4.0.6) connection_pool (~> 2.2, >= 2.2.4) @@ -99,7 +98,7 @@ GEM rubocop-performance (~> 1.20.2) strscan (3.1.0) unicode-display_width (2.5.0) - uri (1.0.2) + uri (1.0.3) webmock (3.23.1) addressable (>= 2.8.0) crack (>= 0.3.2) diff --git a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/go_feature_flag_provider.rb b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/go_feature_flag_provider.rb index dc00f78..cb92266 100644 --- a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/go_feature_flag_provider.rb +++ b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/go_feature_flag_provider.rb @@ -10,7 +10,7 @@ class Provider def initialize(options: Options.new) @metadata = SDK::Provider::ProviderMetadata.new(name: PROVIDER_NAME) @options = options - @goff_api = GoFeatureFlagApi.new(options: options) + @goff_api = GoFeatureFlagApi.new(endpoint: options.endpoint, custom_headers: options.custom_headers) end def fetch_boolean_value(flag_key:, default_value:, evaluation_context: nil) diff --git a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb index c3856e6..d444ab9 100644 --- a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb +++ b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb @@ -12,13 +12,8 @@ module OpenFeature module GoFeatureFlag # This class is the entry point for the GoFeatureFlagProvider class GoFeatureFlagApi - attr_reader :options - def initialize(options: {}) - @options = options - @faraday_connection = Faraday.new( - url: @options.endpoint, - headers: {"Content-Type" => "application/json"}.merge(@options.custom_headers || {}) - ) do |f| + def initialize(endpoint: nil, custom_headers: nil) + @faraday_connection = Faraday.new(url: endpoint, headers: custom_headers) do |f| f.adapter :net_http_persistent do |http| http.idle_timeout = 30 end @@ -62,6 +57,10 @@ def evaluate_ofrep_api(flag_key:, evaluation_context:) private + def headers(custom_headers) + {"Content-Type" => "application/json"}.merge(custom_headers || {}) + end + def parse_error_response(response) required_keys = %w[key error_code] parsed = JSON.parse(response.body) @@ -138,12 +137,12 @@ def parse_retry_later_header(response) begin @retry_after = if /^\d+$/.match?(retry_after) - # Retry-After is in seconds - Time.now + Integer(retry_after) - else - # Retry-After is an HTTP-date - Time.httpdate(retry_after) - end + # Retry-After is in seconds + Time.now + Integer(retry_after) + else + # Retry-After is an HTTP-date + Time.httpdate(retry_after) + end rescue ArgumentError # ignore invalid Retry-After header nil diff --git a/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec b/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec index d1ead75..fd4f6dc 100644 --- a/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec +++ b/providers/openfeature-go-feature-flag-provider/openfeature-go-feature-flag-provider.gemspec @@ -30,8 +30,7 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_runtime_dependency "openfeature-sdk", "~> 0.3.1" - spec.add_runtime_dependency "faraday", "~> 2.10" - spec.add_runtime_dependency "faraday-net_http_persistent", "~> 2.0" + spec.add_runtime_dependency "faraday-net_http_persistent", "~> 2.3" spec.add_development_dependency "rake", "~> 13.0" spec.add_development_dependency "rspec", "~> 3.12.0" From 830861704b867785cb88a4a929fb973ef705c475 Mon Sep 17 00:00:00 2001 From: Augustinas Sueris Date: Tue, 29 Jul 2025 16:45:24 +0300 Subject: [PATCH 4/9] lint fixes Signed-off-by: Augustinas Sueris --- .../openfeature/go-feature-flag/goff_api.rb | 12 +++++------ .../spec/examples.txt | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 providers/openfeature-go-feature-flag-provider/spec/examples.txt diff --git a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb index d444ab9..4ea089f 100644 --- a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb +++ b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb @@ -137,12 +137,12 @@ def parse_retry_later_header(response) begin @retry_after = if /^\d+$/.match?(retry_after) - # Retry-After is in seconds - Time.now + Integer(retry_after) - else - # Retry-After is an HTTP-date - Time.httpdate(retry_after) - end + # Retry-After is in seconds + Time.now + Integer(retry_after) + else + # Retry-After is an HTTP-date + Time.httpdate(retry_after) + end rescue ArgumentError # ignore invalid Retry-After header nil diff --git a/providers/openfeature-go-feature-flag-provider/spec/examples.txt b/providers/openfeature-go-feature-flag-provider/spec/examples.txt new file mode 100644 index 0000000..a7ccc72 --- /dev/null +++ b/providers/openfeature-go-feature-flag-provider/spec/examples.txt @@ -0,0 +1,20 @@ +example_id | status | run_time | +--------------------------------------------------------- | ------ | --------------- | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:1] | passed | 0.00336 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:2] | passed | 0.00357 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:3] | passed | 0.01121 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:4] | passed | 3.61 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:5] | passed | 0.0046 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:6] | passed | 0.00793 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:7] | passed | 0.00414 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:8] | passed | 0.01474 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:9] | passed | 0.00444 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:10] | passed | 0.00537 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:11] | passed | 0.0035 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:12] | passed | 0.00618 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:13] | passed | 0.00491 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:14] | passed | 0.00334 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:15] | passed | 0.00484 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:16] | passed | 1.11 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:17] | passed | 0.00342 seconds | +./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:18] | passed | 1.11 seconds | From 6f74107305582bd6450acab40b4157854bcc0f21 Mon Sep 17 00:00:00 2001 From: Augustinas Sueris Date: Tue, 29 Jul 2025 16:49:53 +0300 Subject: [PATCH 5/9] test fix Signed-off-by: Augustinas Sueris --- .../spec/openfeature/gofeatureflag/goff_api_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/providers/openfeature-go-feature-flag-provider/spec/openfeature/gofeatureflag/goff_api_spec.rb b/providers/openfeature-go-feature-flag-provider/spec/openfeature/gofeatureflag/goff_api_spec.rb index ec939f7..0573a66 100644 --- a/providers/openfeature-go-feature-flag-provider/spec/openfeature/gofeatureflag/goff_api_spec.rb +++ b/providers/openfeature-go-feature-flag-provider/spec/openfeature/gofeatureflag/goff_api_spec.rb @@ -2,8 +2,7 @@ RSpec.describe OpenFeature::GoFeatureFlag::GoFeatureFlagApi do subject(:goff_api) do - options = OpenFeature::GoFeatureFlag::Options.new(endpoint: "http://localhost:1031") - described_class.new(options: options) + described_class.new(endpoint: "http://localhost:1031") end let(:default_evaluation_context) do From 745f6efd84561202855e633c59727e32b5715942 Mon Sep 17 00:00:00 2001 From: Augustinas Date: Wed, 30 Jul 2025 14:58:53 +0300 Subject: [PATCH 6/9] wUpdate providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb Co-authored-by: Max VelDink Signed-off-by: Augustinas --- .../lib/openfeature/go-feature-flag/goff_api.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb index 4ea089f..605b9e8 100644 --- a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb +++ b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb @@ -3,7 +3,6 @@ require "open_feature/sdk" require "net/http" require "json" -require "faraday" require "faraday/net_http_persistent" require_relative "error/errors" require_relative "model/ofrep_api_response" From eff33acb141bfcada2ffc954e303f235d8547dc8 Mon Sep 17 00:00:00 2001 From: Augustinas Date: Wed, 30 Jul 2025 14:59:23 +0300 Subject: [PATCH 7/9] Update providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb Co-authored-by: Max VelDink Signed-off-by: Augustinas --- .../lib/openfeature/go-feature-flag/goff_api.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb index 605b9e8..40f7586 100644 --- a/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb +++ b/providers/openfeature-go-feature-flag-provider/lib/openfeature/go-feature-flag/goff_api.rb @@ -12,7 +12,7 @@ module GoFeatureFlag # This class is the entry point for the GoFeatureFlagProvider class GoFeatureFlagApi def initialize(endpoint: nil, custom_headers: nil) - @faraday_connection = Faraday.new(url: endpoint, headers: custom_headers) do |f| + @faraday_connection = Faraday.new(url: endpoint, headers: headers(custom_headers)) do |f| f.adapter :net_http_persistent do |http| http.idle_timeout = 30 end From 0817a9638e93e5faafc7243ebc3e6b1ec6d11568 Mon Sep 17 00:00:00 2001 From: Augustinas Date: Wed, 30 Jul 2025 15:02:47 +0300 Subject: [PATCH 8/9] Delete providers/openfeature-go-feature-flag-provider/spec/examples.txt Signed-off-by: Augustinas --- .../spec/examples.txt | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 providers/openfeature-go-feature-flag-provider/spec/examples.txt diff --git a/providers/openfeature-go-feature-flag-provider/spec/examples.txt b/providers/openfeature-go-feature-flag-provider/spec/examples.txt deleted file mode 100644 index a7ccc72..0000000 --- a/providers/openfeature-go-feature-flag-provider/spec/examples.txt +++ /dev/null @@ -1,20 +0,0 @@ -example_id | status | run_time | ---------------------------------------------------------- | ------ | --------------- | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:1] | passed | 0.00336 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:2] | passed | 0.00357 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:3] | passed | 0.01121 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:4] | passed | 3.61 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:5] | passed | 0.0046 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:6] | passed | 0.00793 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:7] | passed | 0.00414 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:8] | passed | 0.01474 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:9] | passed | 0.00444 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:10] | passed | 0.00537 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:11] | passed | 0.0035 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:12] | passed | 0.00618 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:13] | passed | 0.00491 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:14] | passed | 0.00334 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:15] | passed | 0.00484 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:16] | passed | 1.11 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:17] | passed | 0.00342 seconds | -./spec/openfeature/gofeatureflag/goff_api_spec.rb[1:1:18] | passed | 1.11 seconds | From 13084069638bef46eb674e216ef9b0d6efa44a83 Mon Sep 17 00:00:00 2001 From: Augustinas Date: Wed, 30 Jul 2025 15:06:22 +0300 Subject: [PATCH 9/9] Update .gitignore added rspec examples to gitignore Signed-off-by: Augustinas --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 74d9d73..ece0b0a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,9 @@ /test/version_tmp/ /tmp/ +#rspec +**/spec/examples.txt + # Used by dotenv library to load environment variables. # .env @@ -58,4 +61,4 @@ build-iPhoneSimulator/ .DS_Store # Ignore jetbrains files -.idea/ \ No newline at end of file +.idea/