Skip to content

Commit

Permalink
Fix resolving relative URI paths with leading slashes (#1426)
Browse files Browse the repository at this point in the history
Signed-off-by: Juan Cruz Viotti <[email protected]>
  • Loading branch information
jviotti authored Jan 9, 2025
1 parent 0073e1e commit 73da160
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 3 deletions.
7 changes: 6 additions & 1 deletion src/uri/uri.cc
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,12 @@ auto URI::path() const -> std::optional<std::string> {
return "/" + this->path_.value();
}

return path_;
if (this->data.starts_with('/') && this->data.size() > 1 &&
this->path_.has_value()) {
return "/" + this->path_.value();
}

return this->path_;
}

auto URI::path(const std::string &path) -> URI & {
Expand Down
2 changes: 1 addition & 1 deletion test/jsonpointer/jsonpointer_to_uri_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -341,5 +341,5 @@ TEST(JSONPointer_to_uri, with_relative_base) {
const sourcemeta::jsontoolkit::URI base{"../baz"};
const sourcemeta::jsontoolkit::URI fragment{
sourcemeta::jsontoolkit::to_uri(pointer, base)};
EXPECT_EQ(fragment.recompose(), "baz#/foo/bar");
EXPECT_EQ(fragment.recompose(), "/baz#/foo/bar");
}
2 changes: 1 addition & 1 deletion test/uri/uri_parse_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ TEST(URI_parse, relative_1) {

TEST(URI_parse, relative_2) {
sourcemeta::jsontoolkit::URI uri{"/one/two/three"};
EXPECT_EQ(uri.recompose(), "one/two/three");
EXPECT_EQ(uri.recompose(), "/one/two/three");
}

TEST(URI_parse, relative_3) {
Expand Down
8 changes: 8 additions & 0 deletions test/uri/uri_relative_to_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ TEST(URI_relative_to, absolute_relative_1) {
EXPECT_EQ(uri.recompose(), "foo");
}

TEST(URI_relative_to, absolute_relative_2) {
const sourcemeta::jsontoolkit::URI base{
"https://www.example.com/foo/bar/baz"};
sourcemeta::jsontoolkit::URI uri{"/qux"};
uri.relative_to(base);
EXPECT_EQ(uri.recompose(), "/qux");
}

TEST(URI_relative_to, relative_absolute_1) {
const sourcemeta::jsontoolkit::URI base{"foo/bar"};
sourcemeta::jsontoolkit::URI uri{"https://www.example.com/foo"};
Expand Down
7 changes: 7 additions & 0 deletions test/uri/uri_resolve_from_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ TEST(URI_resolve_from, relative_base) {
EXPECT_THROW(relative.resolve_from(base), sourcemeta::jsontoolkit::URIError);
}

TEST(URI_resolve_from, absolute_relative_with_slash) {
const sourcemeta::jsontoolkit::URI base{"https://foobar.com/foo/bar"};
sourcemeta::jsontoolkit::URI relative{"/baz"};
relative.resolve_from(base);
EXPECT_EQ(relative.recompose(), "https://foobar.com/baz");
}

TEST(URI_resolve_from, example_1) {
const sourcemeta::jsontoolkit::URI base{"https://foobar.com/foo/bar"};
sourcemeta::jsontoolkit::URI relative{"../baz"};
Expand Down

4 comments on commit 73da160

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (macos/llvm)

Benchmark suite Current: 73da160 Previous: 0073e1e Ratio
JSON_Array_Of_Objects_Unique 345.7143085267733 ns/iter 328.7903670380859 ns/iter 1.05
JSON_Parse_1 23845.46367664171 ns/iter 21916.720614074173 ns/iter 1.09
JSON_Fast_Hash_Helm_Chart_Lock 57.68083570966103 ns/iter 47.636528159604396 ns/iter 1.21
JSON_Equality_Helm_Chart_Lock 192.64906017398366 ns/iter 139.46101803267734 ns/iter 1.38
Regex_Lower_S_Or_Upper_S_Asterisk 1.6569129708125556 ns/iter 1.578084369345146 ns/iter 1.05
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 1.6099077679600693 ns/iter 1.5884499516627602 ns/iter 1.01
Regex_Period_Asterisk 1.6694413229972065 ns/iter 1.5683639254267756 ns/iter 1.06
Regex_Group_Period_Asterisk_Group 1.6353829299912856 ns/iter 1.5816775133335133 ns/iter 1.03
Regex_Period_Plus 1.9351494303879735 ns/iter 1.8936833934118584 ns/iter 1.02
Regex_Period 1.9176914364979336 ns/iter 1.9050374904958878 ns/iter 1.01
Regex_Caret_Period_Plus_Dollar 1.9263000932549585 ns/iter 1.8795479832337871 ns/iter 1.02
Regex_Caret_Group_Period_Plus_Group_Dollar 1.9498481741570943 ns/iter 1.8905998351084419 ns/iter 1.03
Regex_Caret_Period_Asterisk_Dollar 1.609106765297031 ns/iter 1.595753048787598 ns/iter 1.01
Regex_Caret_Group_Period_Asterisk_Group_Dollar 1.616113680289769 ns/iter 1.5853825491678541 ns/iter 1.02
Regex_Caret_X_Hyphen 6.350501950711262 ns/iter 6.274229046337945 ns/iter 1.01
Regex_Period_Md_Dollar 82.10288452046241 ns/iter 68.22491133125496 ns/iter 1.20
Regex_Caret_Slash_Period_Asterisk 7.142018477298771 ns/iter 5.065476746554579 ns/iter 1.41
Regex_Caret_Period_Range_Dollar 2.1003139590070443 ns/iter 2.0778663986836095 ns/iter 1.01
Regex_Nested_Backtrack 778.4608807946346 ns/iter 729.0860934124488 ns/iter 1.07
Pointer_Object_Traverse 15.224232345362308 ns/iter 14.789855512379075 ns/iter 1.03
Pointer_Object_Try_Traverse 32.55358989989005 ns/iter 31.725896573601894 ns/iter 1.03
Pointer_Push_Back_Pointer_To_Weak_Pointer 173.49714416704595 ns/iter 172.7217316670372 ns/iter 1.00

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (linux/llvm)

Benchmark suite Current: 73da160 Previous: 0073e1e Ratio
JSON_Array_Of_Objects_Unique 445.5113323362429 ns/iter 447.553015649162 ns/iter 1.00
JSON_Parse_1 30099.675387056577 ns/iter 30766.3516652752 ns/iter 0.98
JSON_Fast_Hash_Helm_Chart_Lock 54.7363081394045 ns/iter 54.81587290509493 ns/iter 1.00
JSON_Equality_Helm_Chart_Lock 147.83038994799298 ns/iter 148.14178326295576 ns/iter 1.00
Regex_Lower_S_Or_Upper_S_Asterisk 2.221323262614719 ns/iter 2.179695168788507 ns/iter 1.02
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 2.196563147580705 ns/iter 2.1862986843110845 ns/iter 1.00
Regex_Period_Asterisk 2.2481177012939497 ns/iter 2.1816433487041254 ns/iter 1.03
Regex_Group_Period_Asterisk_Group 2.1910879530301206 ns/iter 2.1901473633619437 ns/iter 1.00
Regex_Period_Plus 2.2445505775899846 ns/iter 2.4940102070691643 ns/iter 0.90
Regex_Period 2.268876420618933 ns/iter 2.4882838756352914 ns/iter 0.91
Regex_Caret_Period_Plus_Dollar 2.2712866095868023 ns/iter 2.367286541466175 ns/iter 0.96
Regex_Caret_Group_Period_Plus_Group_Dollar 2.240255307963727 ns/iter 2.208042396292504 ns/iter 1.01
Regex_Caret_Period_Asterisk_Dollar 2.4873597153191302 ns/iter 2.485994972869138 ns/iter 1.00
Regex_Caret_Group_Period_Asterisk_Group_Dollar 2.486581096661786 ns/iter 2.4860867755670037 ns/iter 1.00
Regex_Caret_X_Hyphen 13.053888967633638 ns/iter 12.510733126488876 ns/iter 1.04
Regex_Period_Md_Dollar 73.5545436709492 ns/iter 73.8455318493536 ns/iter 1.00
Regex_Caret_Slash_Period_Asterisk 7.149032287313548 ns/iter 6.215310730401744 ns/iter 1.15
Regex_Caret_Period_Range_Dollar 3.731257996212018 ns/iter 3.733294662602425 ns/iter 1.00
Regex_Nested_Backtrack 488.9311626692607 ns/iter 497.2641865095072 ns/iter 0.98
Pointer_Object_Traverse 47.29454536773934 ns/iter 44.90654261814661 ns/iter 1.05
Pointer_Object_Try_Traverse 52.30499678541657 ns/iter 52.33534789928957 ns/iter 1.00
Pointer_Push_Back_Pointer_To_Weak_Pointer 354.4760693065961 ns/iter 352.10456363818497 ns/iter 1.01

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (windows/msvc)

Benchmark suite Current: 73da160 Previous: 0073e1e Ratio
JSON_Array_Of_Objects_Unique 417.86640904164796 ns/iter 418.5796107776889 ns/iter 1.00
JSON_Parse_1 80220.21205356112 ns/iter 82906.18722379081 ns/iter 0.97
JSON_Fast_Hash_Helm_Chart_Lock 54.22493000000941 ns/iter 56.118089999995384 ns/iter 0.97
JSON_Equality_Helm_Chart_Lock 218.4062581068665 ns/iter 218.1295000000105 ns/iter 1.00
Regex_Lower_S_Or_Upper_S_Asterisk 8.213707999045111 ns/iter 8.125367374440685 ns/iter 1.01
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 8.281220982142251 ns/iter 8.261071838120843 ns/iter 1.00
Regex_Period_Asterisk 7.836212911445954 ns/iter 8.040854428387942 ns/iter 0.97
Regex_Group_Period_Asterisk_Group 7.847654017857205 ns/iter 7.843118303571777 ns/iter 1.00
Regex_Period_Plus 8.31999103428547 ns/iter 7.889820500492362 ns/iter 1.05
Regex_Period 7.829474330358315 ns/iter 7.88634907193545 ns/iter 0.99
Regex_Caret_Period_Plus_Dollar 8.324883444979417 ns/iter 7.802947544642994 ns/iter 1.07
Regex_Caret_Group_Period_Plus_Group_Dollar 8.636710675729622 ns/iter 8.351357105573998 ns/iter 1.03
Regex_Caret_Period_Asterisk_Dollar 8.674525407703355 ns/iter 7.970506696428308 ns/iter 1.09
Regex_Caret_Group_Period_Asterisk_Group_Dollar 7.808164250855988 ns/iter 7.80397764373295 ns/iter 1.00
Regex_Caret_X_Hyphen 11.552719642858326 ns/iter 11.617942857142793 ns/iter 0.99
Regex_Period_Md_Dollar 142.00484633907078 ns/iter 141.822315097219 ns/iter 1.00
Regex_Caret_Slash_Period_Asterisk 12.053517187499807 ns/iter 12.115610714285399 ns/iter 0.99
Regex_Caret_Period_Range_Dollar 8.942676562499585 ns/iter 8.80138437500122 ns/iter 1.02
Regex_Nested_Backtrack 593.7655999999834 ns/iter 588.478392857082 ns/iter 1.01
Pointer_Object_Traverse 56.1860089285712 ns/iter 56.35006000001112 ns/iter 1.00
Pointer_Object_Try_Traverse 75.9408147321418 ns/iter 76.2199553571311 ns/iter 1.00
Pointer_Push_Back_Pointer_To_Weak_Pointer 175.49091800161145 ns/iter 189.14878474544247 ns/iter 0.93

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (linux/gcc)

Benchmark suite Current: 73da160 Previous: 0073e1e Ratio
Pointer_Object_Traverse 45.419092692203726 ns/iter 44.774279411417886 ns/iter 1.01
Pointer_Object_Try_Traverse 22.408976111966304 ns/iter 22.408160243515837 ns/iter 1.00
Pointer_Push_Back_Pointer_To_Weak_Pointer 213.18366927426004 ns/iter 213.32444964035815 ns/iter 1.00
Regex_Lower_S_Or_Upper_S_Asterisk 3.1176807050833037 ns/iter 2.4904075097940757 ns/iter 1.25
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar 3.1298307012183457 ns/iter 2.489238838168093 ns/iter 1.26
Regex_Period_Asterisk 3.127880919446214 ns/iter 2.4895153933094964 ns/iter 1.26
Regex_Group_Period_Asterisk_Group 3.1357454873595496 ns/iter 2.494174767651315 ns/iter 1.26
Regex_Period_Plus 3.1231723051186915 ns/iter 2.799085491803909 ns/iter 1.12
Regex_Period 3.1228548339147246 ns/iter 2.8007738618275098 ns/iter 1.11
Regex_Caret_Period_Plus_Dollar 3.1288562067726806 ns/iter 2.800605200674068 ns/iter 1.12
Regex_Caret_Group_Period_Plus_Group_Dollar 3.1328709272297153 ns/iter 2.7972793570191588 ns/iter 1.12
Regex_Caret_Period_Asterisk_Dollar 3.1246290860992465 ns/iter 3.7279722272329847 ns/iter 0.84
Regex_Caret_Group_Period_Asterisk_Group_Dollar 3.13493101246359 ns/iter 3.727499524179437 ns/iter 0.84
Regex_Caret_X_Hyphen 12.434664312759386 ns/iter 12.448109471630962 ns/iter 1.00
Regex_Period_Md_Dollar 89.39581191582279 ns/iter 87.92562691833889 ns/iter 1.02
Regex_Caret_Slash_Period_Asterisk 7.1537896883511065 ns/iter 7.153335109577811 ns/iter 1.00
Regex_Caret_Period_Range_Dollar 4.040002535840099 ns/iter 4.0664571862497185 ns/iter 0.99
Regex_Nested_Backtrack 823.780254998226 ns/iter 824.847312885603 ns/iter 1.00
JSON_Array_Of_Objects_Unique 406.0370539277187 ns/iter 381.4357252964387 ns/iter 1.06
JSON_Parse_1 32716.600132281983 ns/iter 32869.40744382275 ns/iter 1.00
JSON_Fast_Hash_Helm_Chart_Lock 64.77728833891042 ns/iter 62.814763990830116 ns/iter 1.03
JSON_Equality_Helm_Chart_Lock 142.8045102793396 ns/iter 141.79247418458766 ns/iter 1.01

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.