From 36fcf3370ecede0afe1ca9ff5f2a1c995e2e29d4 Mon Sep 17 00:00:00 2001 From: Eric Milford Date: Thu, 30 Jul 2020 16:25:56 -0500 Subject: [PATCH 1/2] Remove invalid RSpec options The `--debugger` option in `.rspec` was misspelled and is also no longer a valid option. The gem also does not currently have a `spec/spec_helper.rb` file. Co-authored-by: Daniel Colson --- .rspec | 2 -- 1 file changed, 2 deletions(-) diff --git a/.rspec b/.rspec index d74dd626..4e1e0d2f 100644 --- a/.rspec +++ b/.rspec @@ -1,3 +1 @@ --color ---require spec_helper ---debuger From f433e827947f4523581ac879a60a88c88d5ec5ee Mon Sep 17 00:00:00 2001 From: Eric Milford Date: Thu, 30 Jul 2020 16:29:30 -0500 Subject: [PATCH 2/2] Address URI.escape obsolete warning Prior to these changes, `URI.escape` would trigger a warning. Instead, this uses `Addressable::URI.escape` to maintain similar behavior, but without the warning. One difference between the two being how the `#` sign is handled. `URI.escape` escapes this character. `Addressable::URI.escape` does not. See this link for more information: https://stackoverflow.com/a/13059657 Co-authored-by: Daniel Colson --- docusign_esign.gemspec | 1 + lib/docusign_esign/client/api_client.rb | 5 +- lib/docusign_esign/configuration.rb | 6 +-- .../docusign_esign/client/api_client_spec.rb | 46 +++++++++++++++++++ spec/lib/docusign_esign/configuration_spec.rb | 39 ++++++++++++++++ 5 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 spec/lib/docusign_esign/client/api_client_spec.rb create mode 100644 spec/lib/docusign_esign/configuration_spec.rb diff --git a/docusign_esign.gemspec b/docusign_esign.gemspec index 59ecf3e1..f657b597 100644 --- a/docusign_esign.gemspec +++ b/docusign_esign.gemspec @@ -29,6 +29,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency 'jwt', '~> 2.2', '>= 2.2.1' s.add_runtime_dependency 'typhoeus', '~> 1.0', '>= 1.0.1' s.add_runtime_dependency 'json', '~> 2.1', '>= 2.1.0' + s.add_runtime_dependency 'addressable', '~> 2.7', '>= 2.7.0' s.add_development_dependency 'rspec-mocks', '~> 3.8', '>= 3.8.0' s.add_development_dependency 'rspec-expectations', '~> 3.8', '>= 3.8.0' diff --git a/lib/docusign_esign/client/api_client.rb b/lib/docusign_esign/client/api_client.rb index 0ebf3d6b..dc7fc57c 100644 --- a/lib/docusign_esign/client/api_client.rb +++ b/lib/docusign_esign/client/api_client.rb @@ -9,6 +9,7 @@ =end +require 'addressable' require 'date' require 'json' require 'logger' @@ -259,8 +260,8 @@ def sanitize_filename(filename) def build_request_url(path, opts) # Add leading and trailing slashes to path path = "/#{path}".gsub(/\/+/, '/') - return URI.encode("https://" + self.get_oauth_base_path + path) if opts[:oauth] - URI.encode(@config.base_url + path) + return Addressable::URI.escape("https://" + self.get_oauth_base_path + path) if opts[:oauth] + Addressable::URI.escape(@config.base_url + path) end # Builds the HTTP request body diff --git a/lib/docusign_esign/configuration.rb b/lib/docusign_esign/configuration.rb index ff26e7a8..c0ff5dd7 100644 --- a/lib/docusign_esign/configuration.rb +++ b/lib/docusign_esign/configuration.rb @@ -10,7 +10,7 @@ =end -require 'uri' +require 'addressable' module DocuSign_eSign class Configuration @@ -169,7 +169,7 @@ def base_path=(base_path) def base_url url = "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '') - URI.encode(url) + Addressable::URI.escape(url) end # Gets API key (with prefix if set). @@ -200,4 +200,4 @@ def auth_settings } end end -end \ No newline at end of file +end diff --git a/spec/lib/docusign_esign/client/api_client_spec.rb b/spec/lib/docusign_esign/client/api_client_spec.rb new file mode 100644 index 00000000..ca538fc0 --- /dev/null +++ b/spec/lib/docusign_esign/client/api_client_spec.rb @@ -0,0 +1,46 @@ +require "docusign_esign" +require "docusign_esign/client/api_client" + +RSpec.describe DocuSign_eSign::ApiClient do + describe "#build_request_url" do + context "when the oauth option is set" do + it "replaces unsafe characters with safe characters" do + client = described_class.new + client.oauth_base_path = "domain.com/oauth" + + url = client.build_request_url("/path^{}%<> #anchor", { oauth: true }) + + expect(url).to eq("https://domain.com/oauth/path%5E%7B%7D%25%3C%3E%20#anchor") + end + + it "replaces multiple forward slashes with a single forward slash" do + client = described_class.new + client.oauth_base_path = "domain.com/oauth" + + url = client.build_request_url("//path", { oauth: true }) + + expect(url).to eq("https://domain.com/oauth/path") + end + end + + context "when the oauth option is not set" do + it "replaces unsafe characters with safe characters" do + config = instance_double("Configuration", base_url: "http://domain.com") + client = described_class.new(config) + + url = client.build_request_url("/path^{}%<> #anchor", { oauth: false }) + + expect(url).to eq("http://domain.com/path%5E%7B%7D%25%3C%3E%20#anchor") + end + + it "replaces multiple forward slashes with a single forward slash" do + config = instance_double("Configuration", base_url: "http://domain.com") + client = described_class.new(config) + + url = client.build_request_url("//path", { oauth: false }) + + expect(url).to eq("http://domain.com/path") + end + end + end +end diff --git a/spec/lib/docusign_esign/configuration_spec.rb b/spec/lib/docusign_esign/configuration_spec.rb new file mode 100644 index 00000000..192de3ef --- /dev/null +++ b/spec/lib/docusign_esign/configuration_spec.rb @@ -0,0 +1,39 @@ +require "docusign_esign" +require "docusign_esign/configuration" + +RSpec.describe DocuSign_eSign::Configuration do + describe "#base_url" do + it "replaces unsafe characters with safe characters" do + configuration = DocuSign_eSign::Configuration.new + configuration.scheme = "https" + configuration.host = "www.domain.com" + configuration.base_path = "/base/path^{}%<> #anchor" + + base_url = configuration.base_url + + expect(base_url).to eq("https://www.domain.com/base/path%5E%7B%7D%25%3C%3E%20#anchor") + end + + it "replaces multiple forward slashes with a single forward slash" do + configuration = DocuSign_eSign::Configuration.new + configuration.scheme = "https" + configuration.host = "www.domain.com" + configuration.base_path = "//base/path" + + base_url = configuration.base_url + + expect(base_url).to eq("https://www.domain.com/base/path") + end + + it "strips the trailing forward slash" do + configuration = DocuSign_eSign::Configuration.new + configuration.scheme = "https" + configuration.host = "www.domain.com" + configuration.base_path = "/base/path/" + + base_url = configuration.base_url + + expect(base_url).to eq("https://www.domain.com/base/path") + end + end +end