Verified Commit 4cb16b61 authored by Hercules Merscher's avatar Hercules Merscher 🌴
Browse files

fix: Removing duplication when parsing query string

parent 4bf347fa
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
# frozen_string_literal: true

require "cgi"
require "uri"
require "active_support/core_ext/object/blank"

module Labkit
@@ -9,11 +9,9 @@ module Labkit
      def self.detect_service_name(connection_string)
        return Labkit::Tracing::DEFAULT_SERVICE_NAME unless connection_string

        if connection_string =~ /[?&]service_name=([^&]+)/
          CGI.unescape(Regexp.last_match(1))
        else
          Labkit::Tracing::DEFAULT_SERVICE_NAME
        end
        parsed = URI.parse(connection_string)
        options = TracingUtils.parse_query_string(parsed.query)
        options[:service_name] || Labkit::Tracing::DEFAULT_SERVICE_NAME
      end

      def self.initialize!
+1 −7
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@ module Labkit
          parsed = URI.parse(connection_string)

          # Parse query parameters for additional options
          options = parse_query(parsed.query)
          options = TracingUtils.parse_query_string(parsed.query)

          # Handle console exporter (special case - no endpoint needed)
          if parsed.host == "console"
@@ -206,12 +206,6 @@ module Labkit

          endpoint
        end

        def parse_query(query)
          return {} unless query

          CGI.parse(query).symbolize_keys.transform_values(&:first)
        end
      end
    end
  end
+1 −10
Original line number Diff line number Diff line
# frozen_string_literal: true

require "cgi"

module Labkit
  module Tracing
    class OpenTracingFactory
@@ -26,17 +24,10 @@ module Labkit

        raise "Invalid tracing connection string" unless valid_uri?(parsed)

        { driver_name: parsed.host, options: parse_query(parsed.query) }
        { driver_name: parsed.host, options: TracingUtils.parse_query_string(parsed.query) }
      end
      private_class_method :parse_connection_string

      def self.parse_query(query)
        return {} unless query

        CGI.parse(query).symbolize_keys.transform_values(&:first)
      end
      private_class_method :parse_query

      def self.valid_uri?(uri)
        return false unless uri

+7 −0
Original line number Diff line number Diff line
# frozen_string_literal: true

require "cgi"
require "active_support/core_ext/string/starts_ends_with"
require "opentracing"

@@ -80,6 +81,12 @@ module Labkit

        @include_stacktrace[operation_name]
      end

      def self.parse_query_string(query)
        return {} unless query

        CGI.parse(query).symbolize_keys.transform_values(&:first)
      end
    end
  end
end
+56 −0
Original line number Diff line number Diff line
@@ -205,4 +205,60 @@ describe Labkit::Tracing::TracingUtils do
      end
    end
  end

  describe ".parse_query_string" do
    context "when query is nil" do
      it "returns an empty hash" do
        expect(described_class.parse_query_string(nil)).to eq({})
      end
    end

    context "when query is an empty string" do
      it "returns an empty hash" do
        expect(described_class.parse_query_string("")).to eq({})
      end
    end

    context "when query has single parameter" do
      it "returns a hash with symbolized key" do
        result = described_class.parse_query_string("foo=bar")
        expect(result).to eq({ foo: "bar" })
      end
    end

    context "when query has multiple parameters" do
      it "returns a hash with symbolized keys" do
        result = described_class.parse_query_string("foo=bar&baz=qux")
        expect(result).to eq({ foo: "bar", baz: "qux" })
      end
    end

    context "when parameter has multiple values" do
      it "returns only the first value" do
        result = described_class.parse_query_string("foo=bar&foo=baz")
        expect(result).to eq({ foo: "bar" })
      end
    end

    context "when parameter has no value" do
      it "returns an empty string for the value" do
        result = described_class.parse_query_string("foo=")
        expect(result).to eq({ foo: "" })
      end
    end

    context "when parameter has special characters" do
      it "decodes URL-encoded values" do
        result = described_class.parse_query_string("foo=hello%20world&bar=test%2Bvalue")
        expect(result).to eq({ foo: "hello world", bar: "test+value" })
      end
    end

    context "when parameter key has special characters" do
      it "decodes URL-encoded keys" do
        result = described_class.parse_query_string("foo%5Bbar%5D=value")
        expect(result).to eq({ 'foo[bar]': "value" })
      end
    end
  end
end