From 1a5139797e446a00fd65a8657fbd65d01a3a654b Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Fri, 19 May 2023 14:08:31 -0400 Subject: [PATCH 1/5] Remove dynamic input used in regular expression --- lib/datadog/tracing/contrib/rack/middlewares.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/datadog/tracing/contrib/rack/middlewares.rb b/lib/datadog/tracing/contrib/rack/middlewares.rb index 456ac9b84d4..c6941593dad 100644 --- a/lib/datadog/tracing/contrib/rack/middlewares.rb +++ b/lib/datadog/tracing/contrib/rack/middlewares.rb @@ -304,7 +304,15 @@ def parse_url(env, original_env) else # normally REQUEST_URI starts at the path, but it # might contain the full URL in some cases (e.g WEBrick) - request_uri.sub(/^#{base_url}/, '') + # + # DEV: Use `request_uri.delete_prefix(base_url)`, supported in Ruby 2.5+ + # rubocop:disable Style/IfInsideElse + if request_uri.rindex(base_url, 0) + request_uri[base_url.length..-1] + else + request_uri + end + # rubocop:enable Style/IfInsideElse end base_url + fullpath From abb314cd74f85e56c0fc43f7d7718d6a74a09527 Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Mon, 19 Jun 2023 12:17:51 -0700 Subject: [PATCH 2/5] Extract backport to is own method --- lib/datadog/core/utils/backport.rb | 33 +++++++++++++++++++ .../tracing/contrib/rack/middlewares.rb | 11 ++----- 2 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 lib/datadog/core/utils/backport.rb diff --git a/lib/datadog/core/utils/backport.rb b/lib/datadog/core/utils/backport.rb new file mode 100644 index 00000000000..e4314fc5c65 --- /dev/null +++ b/lib/datadog/core/utils/backport.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Datadog + module Core + module Utils + # Methods from future versions of Ruby implemented in for older rubies. + # + # This helps keep the project using newer APIs for never rubies and + # facilitates cleaning up when support for an older versions of Ruby is removed. + module Backport + # `String` class backports. + module String + module_function + + if ::String.method_defined?(:delete_prefix) + def delete_prefix(string, prefix) + string.delete_prefix(prefix) + end + else + def delete_prefix(string, prefix) + prefix = prefix.to_s + if string.start_with?(prefix) + string[prefix.length..-1] + else + dup + end + end + end + end + end + end + end +end diff --git a/lib/datadog/tracing/contrib/rack/middlewares.rb b/lib/datadog/tracing/contrib/rack/middlewares.rb index c6941593dad..77636af1305 100644 --- a/lib/datadog/tracing/contrib/rack/middlewares.rb +++ b/lib/datadog/tracing/contrib/rack/middlewares.rb @@ -1,6 +1,7 @@ require 'date' require_relative '../../../core/environment/variable_helpers' +require_relative '../../../core/utils/backport' require_relative '../../client_ip' require_relative '../../metadata/ext' require_relative '../../propagation/http' @@ -304,15 +305,7 @@ def parse_url(env, original_env) else # normally REQUEST_URI starts at the path, but it # might contain the full URL in some cases (e.g WEBrick) - # - # DEV: Use `request_uri.delete_prefix(base_url)`, supported in Ruby 2.5+ - # rubocop:disable Style/IfInsideElse - if request_uri.rindex(base_url, 0) - request_uri[base_url.length..-1] - else - request_uri - end - # rubocop:enable Style/IfInsideElse + Datadog::Core::Utils::Backport::String.delete_prefix(request_uri, base_url) end base_url + fullpath From ad28578554bc0f825ae3ffa1cdc681cf79a90233 Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Mon, 19 Jun 2023 12:45:08 -0700 Subject: [PATCH 3/5] Add type check --- lib/datadog/core/utils/backport.rb | 2 +- sig/datadog/core/utils/backport.rbs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 sig/datadog/core/utils/backport.rbs diff --git a/lib/datadog/core/utils/backport.rb b/lib/datadog/core/utils/backport.rb index e4314fc5c65..7a083986904 100644 --- a/lib/datadog/core/utils/backport.rb +++ b/lib/datadog/core/utils/backport.rb @@ -22,7 +22,7 @@ def delete_prefix(string, prefix) if string.start_with?(prefix) string[prefix.length..-1] else - dup + string.dup end end end diff --git a/sig/datadog/core/utils/backport.rbs b/sig/datadog/core/utils/backport.rbs new file mode 100644 index 00000000000..028bcf6da6f --- /dev/null +++ b/sig/datadog/core/utils/backport.rbs @@ -0,0 +1,14 @@ +module Datadog + module Core + module Utils + module Backport + module String + # This method can't return `nil`, but we use `String#[]` to compute + # its return value and `String#[]` can return `nil` but only in + # scenarios that are impossible for `delete_prefix`. + def self?.delete_prefix: (::String string, ::String prefix) -> ::String? + end + end + end + end +end From af6d0d024aa86952a0db642714052865dfce82ce Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Tue, 20 Jun 2023 10:36:23 -0700 Subject: [PATCH 4/5] Add guard to ensure rbs has non-nil return type --- lib/datadog/core/utils/backport.rb | 2 +- sig/datadog/core/utils/backport.rbs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/datadog/core/utils/backport.rb b/lib/datadog/core/utils/backport.rb index 7a083986904..c6c544748f9 100644 --- a/lib/datadog/core/utils/backport.rb +++ b/lib/datadog/core/utils/backport.rb @@ -20,7 +20,7 @@ def delete_prefix(string, prefix) def delete_prefix(string, prefix) prefix = prefix.to_s if string.start_with?(prefix) - string[prefix.length..-1] + string[prefix.length..-1] || raise('rbs-guard: String#[] is non-nil as `prefix` is guaranteed present') else string.dup end diff --git a/sig/datadog/core/utils/backport.rbs b/sig/datadog/core/utils/backport.rbs index 028bcf6da6f..91ec5f9ef0b 100644 --- a/sig/datadog/core/utils/backport.rbs +++ b/sig/datadog/core/utils/backport.rbs @@ -3,10 +3,7 @@ module Datadog module Utils module Backport module String - # This method can't return `nil`, but we use `String#[]` to compute - # its return value and `String#[]` can return `nil` but only in - # scenarios that are impossible for `delete_prefix`. - def self?.delete_prefix: (::String string, ::String prefix) -> ::String? + def self?.delete_prefix: (::String string, ::String prefix) -> ::String end end end From fdfc987ca5f82d192e05f4185c66c2e7a7f3665f Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Wed, 21 Jun 2023 12:14:54 -0700 Subject: [PATCH 5/5] Move backports --- lib/datadog/core/backport.rb | 25 ++++++++++++++ lib/datadog/core/utils/backport.rb | 33 ------------------- .../tracing/contrib/rack/middlewares.rb | 4 +-- sig/datadog/core/backport.rbs | 7 ++++ sig/datadog/core/utils/backport.rbs | 11 ------- 5 files changed, 34 insertions(+), 46 deletions(-) create mode 100644 lib/datadog/core/backport.rb delete mode 100644 lib/datadog/core/utils/backport.rb create mode 100644 sig/datadog/core/backport.rbs delete mode 100644 sig/datadog/core/utils/backport.rbs diff --git a/lib/datadog/core/backport.rb b/lib/datadog/core/backport.rb new file mode 100644 index 00000000000..e80fcd8edab --- /dev/null +++ b/lib/datadog/core/backport.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Datadog + module Core + # This module is used to provide features from Ruby 2.5+ to older Rubies + module BackportFrom25 + module_function + + if ::String.method_defined?(:delete_prefix) + def string_delete_prefix(string, prefix) + string.delete_prefix(prefix) + end + else + def string_delete_prefix(string, prefix) + prefix = prefix.to_s + if string.start_with?(prefix) + string[prefix.length..-1] || raise('rbs-guard: String#[] is non-nil as `prefix` is guaranteed present') + else + string.dup + end + end + end + end + end +end diff --git a/lib/datadog/core/utils/backport.rb b/lib/datadog/core/utils/backport.rb deleted file mode 100644 index c6c544748f9..00000000000 --- a/lib/datadog/core/utils/backport.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -module Datadog - module Core - module Utils - # Methods from future versions of Ruby implemented in for older rubies. - # - # This helps keep the project using newer APIs for never rubies and - # facilitates cleaning up when support for an older versions of Ruby is removed. - module Backport - # `String` class backports. - module String - module_function - - if ::String.method_defined?(:delete_prefix) - def delete_prefix(string, prefix) - string.delete_prefix(prefix) - end - else - def delete_prefix(string, prefix) - prefix = prefix.to_s - if string.start_with?(prefix) - string[prefix.length..-1] || raise('rbs-guard: String#[] is non-nil as `prefix` is guaranteed present') - else - string.dup - end - end - end - end - end - end - end -end diff --git a/lib/datadog/tracing/contrib/rack/middlewares.rb b/lib/datadog/tracing/contrib/rack/middlewares.rb index 77636af1305..17d26a97361 100644 --- a/lib/datadog/tracing/contrib/rack/middlewares.rb +++ b/lib/datadog/tracing/contrib/rack/middlewares.rb @@ -1,7 +1,7 @@ require 'date' require_relative '../../../core/environment/variable_helpers' -require_relative '../../../core/utils/backport' +require_relative '../../../core/backport' require_relative '../../client_ip' require_relative '../../metadata/ext' require_relative '../../propagation/http' @@ -305,7 +305,7 @@ def parse_url(env, original_env) else # normally REQUEST_URI starts at the path, but it # might contain the full URL in some cases (e.g WEBrick) - Datadog::Core::Utils::Backport::String.delete_prefix(request_uri, base_url) + Datadog::Core::BackportFrom25.string_delete_prefix(request_uri, base_url) end base_url + fullpath diff --git a/sig/datadog/core/backport.rbs b/sig/datadog/core/backport.rbs new file mode 100644 index 00000000000..daa910a53c5 --- /dev/null +++ b/sig/datadog/core/backport.rbs @@ -0,0 +1,7 @@ +module Datadog + module Core + module BackportFrom25 + def self?.string_delete_prefix: (::String string, ::String prefix) -> ::String + end + end +end diff --git a/sig/datadog/core/utils/backport.rbs b/sig/datadog/core/utils/backport.rbs deleted file mode 100644 index 91ec5f9ef0b..00000000000 --- a/sig/datadog/core/utils/backport.rbs +++ /dev/null @@ -1,11 +0,0 @@ -module Datadog - module Core - module Utils - module Backport - module String - def self?.delete_prefix: (::String string, ::String prefix) -> ::String - end - end - end - end -end