Skip to content

Commit 08336ba

Browse files
allow special characters in url generation
1 parent 81ba06a commit 08336ba

File tree

3 files changed

+129
-3
lines changed

3 files changed

+129
-3
lines changed

imagekitio.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
2828
# spec.add_dependency "rails", "~> 5.2.0", ">= 5.2.0"
2929
spec.add_dependency 'carrierwave', '>= 0.7', '< 2.2'
3030
spec.add_dependency 'rest-client', '~> 2.1', ">=2.1"
31+
spec.add_dependency 'addressable', '~> 2.8'
3132

3233
# spec.add_development_dependency "sqlite3"
3334
spec.add_development_dependency "rails", "~> 5.2.0", ">= 5.2.0"

lib/imagekit/url.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# Url holds url generation method
44

55
require "cgi"
6+
require "addressable/uri"
67
require "openssl"
78
require_relative "./utils/formatter"
89
require_relative "./constants/defaults"
@@ -46,16 +47,16 @@ def build_url(options)
4647
result_url_hash = {'host': "", 'path': "", 'query': ""}
4748
existing_query=nil
4849
if path != ""
49-
parsed_url = URI.parse(path)
50+
parsed_url = Addressable::URI.parse(path)
5051
existing_query=parsed_url.query
51-
parsed_host = URI(url_endpoint)
52+
parsed_host = Addressable::URI.parse(url_endpoint)
5253
result_url_hash[:scheme] = parsed_host.scheme
5354

5455
# making sure single '/' at end
5556
result_url_hash[:host] = parsed_host.host.to_s.chomp("/") + parsed_host.path.chomp("/") + "/"
5657
result_url_hash[:path] = trim_slash(parsed_url.path)
5758
else
58-
parsed_url = URI.parse(src)
59+
parsed_url = Addressable::URI.parse(src)
5960
existing_query=parsed_url.query
6061
host = parsed_url.host
6162
result_url_hash[:userinfo] = parsed_url.userinfo if parsed_url.userinfo

test/imagekit/url_test.rb

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,19 @@
3131

3232
expect(url).to eq("https://imagekit.io/your-imgekit-id/tr:h-300,w-400/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
3333
end
34+
35+
it "test_generate_url_with_path_with_special_characters" do
36+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
37+
url_obj = Url.new(request_obj)
38+
39+
options = {path: "/γειασας/Fjällräven_KnSJwp87u6q.png",
40+
url_endpoint: @url_endpoint,
41+
transformation: [{height: 300, width: 400}],
42+
}
43+
url = url_obj.generate_url(options)
44+
45+
expect(url).to eq("https://imagekit.io/your-imgekit-id/tr:h-300,w-400/γειασας/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
46+
end
3447

3548
it "test_generate_url_without_slash" do
3649
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
@@ -43,6 +56,19 @@
4356

4457
expect(url).to eq("https://imagekit.io/your-imgekit-id/tr:h-300,w-400/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
4558
end
59+
60+
it "test_generate_url_with_path_without_slash_with_special_characters" do
61+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
62+
url_obj = Url.new(request_obj)
63+
64+
options = {path: "γειασας/Fjällräven_KnSJwp87u6q.png",
65+
url_endpoint: @url_endpoint,
66+
transformation: [{height: 300, width: 400}],
67+
}
68+
url = url_obj.generate_url(options)
69+
70+
expect(url).to eq("https://imagekit.io/your-imgekit-id/tr:h-300,w-400/γειασας/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
71+
end
4672

4773
it "test_generate_url_with_override_url_endpoint_without_slash" do
4874
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
@@ -55,6 +81,18 @@
5581

5682
expect(url).to eq("https://ik.imagekit.io/your_override_imagekit_id/tr:h-300,w-400/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
5783
end
84+
85+
it "test_generate_url_with_override_url_endpoint_without_slash_with_special_characters" do
86+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
87+
url_obj = Url.new(request_obj)
88+
options = {path: "/γειασας/Fjällräven_KnSJwp87u6q.png",
89+
url_endpoint: "https://ik.imagekit.io/your_override_imagekit_id",
90+
transformation: [{height: 300, width: 400}],
91+
}
92+
url = url_obj.generate_url(options)
93+
94+
expect(url).to eq("https://ik.imagekit.io/your_override_imagekit_id/tr:h-300,w-400/γειασας/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
95+
end
5896

5997
it "test_generate_url_with_override_url_endpoint_with_slash" do
6098
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
@@ -69,6 +107,30 @@
69107
expect(url).to eq("https://ik.imagekit.io/your_override_imagekit_id/tr:h-300,w-400/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
70108
end
71109

110+
it "test_generate_url_with_override_url_endpoint_with_slash_with_special_characters" do
111+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
112+
url_obj = Url.new(request_obj)
113+
options = {path: "/γειασας/Fjällräven_KnSJwp87u6q.png",
114+
url_endpoint: "https://ik.imagekit.io/your_override_imagekit_id/",
115+
transformation: [{height: 300, width: 400}],
116+
}
117+
url = url_obj.generate_url(options)
118+
119+
expect(url).to eq("https://ik.imagekit.io/your_override_imagekit_id/tr:h-300,w-400/γειασας/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
120+
end
121+
122+
it "test_generate_url_with_override_url_endpoint_with_special_characters" do
123+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
124+
url_obj = Url.new(request_obj)
125+
options = {path: "/γειασας/Fjällräven_KnSJwp87u6q.png",
126+
url_endpoint: "https://www.Fjällräven.com/your_override_imagekit_id/",
127+
transformation: [{height: 300, width: 400}],
128+
}
129+
url = url_obj.generate_url(options)
130+
131+
expect(url).to eq("https://www.Fjällräven.com/your_override_imagekit_id/tr:h-300,w-400/γειασας/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}")
132+
end
133+
72134
it "test_generate_url_with_new_transformation_parameters" do
73135
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
74136
url_obj = Url.new(request_obj)
@@ -118,6 +180,20 @@
118180

119181
expect(url).to eq("https://imagekit.io/your-imgekit-id/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}&tr=h-300,w-400")
120182
end
183+
184+
it "test_generate_url_with_special_characters_transformation_parameters_setted_to_query" do
185+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
186+
url_obj = Url.new(request_obj)
187+
188+
options = {path: "/γειασας/Fjällräven_KnSJwp87u6q.png",
189+
url_endpoint: @url_endpoint,
190+
transformation: [{height: 300, width: 400}],
191+
transformation_position: "query",
192+
}
193+
url = url_obj.generate_url(options)
194+
195+
expect(url).to eq("https://imagekit.io/your-imgekit-id/γειασας/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}&tr=h-300,w-400")
196+
end
121197

122198
it "test_generate_url_with_query_parameters" do
123199
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
@@ -132,6 +208,19 @@
132208
expect(url).to eq("https://imagekit.io/your-imgekit-id/tr:h-300,w-400/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}&v=123")
133209
end
134210

211+
it "test_generate_url_with_query_parameters_with_special_characters" do
212+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
213+
url_obj = Url.new(request_obj)
214+
215+
options = {path: "/default-image.jpg",
216+
query_parameters: {"γειασας": "γειασας"},
217+
transformation: [{height: 300, width: 400}]
218+
}
219+
url = url_obj.generate_url(options)
220+
221+
expect(url).to eq("https://imagekit.io/your-imgekit-id/tr:h-300,w-400/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}&γειασας=γειασας")
222+
end
223+
135224
it "test_generate_url_with_src_checking_query_param_added" do
136225
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
137226
url_obj = Url.new(request_obj)
@@ -179,6 +268,27 @@
179268

180269
end
181270

271+
it "test_generate_url_with_src_with_special_characters" do
272+
# Test url generation with src param
273+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
274+
url_obj = Url.new(request_obj)
275+
276+
options = {src: "https://www.Fjällräve.com/γειασας/Fjällräven_KnSJwp87u6q.png",
277+
transformation: [{height: "300",
278+
width: "400",
279+
format: "jpg",
280+
progressive: "true",
281+
effect_sharpen: "-",
282+
effect_contrast: "1",},
283+
{rotation: 90},],
284+
transformation_position: "query"}
285+
286+
url = url_obj.generate_url(options)
287+
288+
expect(url).to eq("https://www.Fjällräve.com/γειασας/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}&tr=h-300,w-400,f-jpg,pr-true,e-sharpen,e-contrast-1:rt-90")
289+
290+
end
291+
182292
it "test_generate_url_with_src_and_query_parameters_is_path" do
183293
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
184294
url_obj = Url.new(request_obj)
@@ -212,6 +322,20 @@
212322
expect(url).to include("https://ik.imagekit.io/your_imagekit_id/endpoint/tr:h-300,w-400/default-image.jpg?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}&ik-s=")
213323
end
214324

325+
it "test_generate_url_with_path_and_signed_with_special_characters" do
326+
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
327+
url_obj = Url.new(request_obj)
328+
329+
options = {path: "/Fjällräven_KnSJwp87u6q.png",
330+
url_endpoint: "https://ik.imagekit.io/your_imagekit_id/endpoint/",
331+
transformation: [{height: "300", width: "400"}],
332+
signed: true,}
333+
334+
url = url_obj.generate_url(options)
335+
336+
expect(url).to include("https://ik.imagekit.io/your_imagekit_id/endpoint/tr:h-300,w-400/Fjällräven_KnSJwp87u6q.png?ik-sdk-version=ruby-#{Imagekit::Sdk::VERSION}&ik-s=")
337+
end
338+
215339
it "test_url_with_invalid_args_returns_as_it_is" do
216340
request_obj=ImageKitRequest.new(@private_key,@public_key,@url_endpoint)
217341
url_obj = Url.new(request_obj)

0 commit comments

Comments
 (0)