Skip to content

Commit 6903e30

Browse files
authored
Version 1.2.0: ada_url to 2.6.5, host_type support (#25)
1 parent 7a871f4 commit 6903e30

File tree

7 files changed

+413
-76
lines changed

7 files changed

+413
-76
lines changed

ada_url/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from ada_url.ada_adapter import (
22
URL,
3+
HostType,
34
check_url,
45
idna,
56
idna_to_ascii,
@@ -12,6 +13,7 @@
1213

1314
__all__ = [
1415
'URL',
16+
'HostType',
1517
'check_url',
1618
'idna',
1719
'idna_to_ascii',

ada_url/ada.cpp

+86-37
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* auto-generated on 2023-07-23 15:03:22 -0400. Do not edit! */
1+
/* auto-generated on 2023-08-30 11:44:21 -0400. Do not edit! */
22
/* begin file src/ada.cpp */
33
#include "ada.h"
44
/* begin file src/checkers.cpp */
@@ -116,10 +116,11 @@ ada_really_inline constexpr bool verify_dns_length(
116116

117117
ADA_PUSH_DISABLE_ALL_WARNINGS
118118
/* begin file src/ada_idna.cpp */
119-
/* auto-generated on 2023-05-07 19:12:14 -0400. Do not edit! */
119+
/* auto-generated on 2023-08-29 15:28:19 -0400. Do not edit! */
120120
/* begin file src/idna.cpp */
121121
/* begin file src/unicode_transcoding.cpp */
122122

123+
#include <algorithm>
123124
#include <cstdint>
124125
#include <cstring>
125126

@@ -226,38 +227,22 @@ size_t utf8_length_from_utf32(const char32_t* buf, size_t len) {
226227
// We are not BOM aware.
227228
const uint32_t* p = reinterpret_cast<const uint32_t*>(buf);
228229
size_t counter{0};
229-
for (size_t i = 0; i < len; i++) {
230-
/** ASCII **/
231-
if (p[i] <= 0x7F) {
232-
counter++;
233-
}
234-
/** two-byte **/
235-
else if (p[i] <= 0x7FF) {
236-
counter += 2;
237-
}
238-
/** three-byte **/
239-
else if (p[i] <= 0xFFFF) {
240-
counter += 3;
241-
}
242-
/** four-bytes **/
243-
else {
244-
counter += 4;
245-
}
230+
for (size_t i = 0; i != len; ++i) {
231+
++counter; // ASCII
232+
counter += static_cast<size_t>(p[i] > 0x7F); // two-byte
233+
counter += static_cast<size_t>(p[i] > 0x7FF); // three-byte
234+
counter += static_cast<size_t>(p[i] > 0xFFFF); // four-bytes
246235
}
247236
return counter;
248237
}
249238

250239
size_t utf32_length_from_utf8(const char* buf, size_t len) {
251240
const int8_t* p = reinterpret_cast<const int8_t*>(buf);
252-
size_t counter{0};
253-
for (size_t i = 0; i < len; i++) {
241+
return std::count_if(p, std::next(p, len), [](int8_t c) {
254242
// -65 is 0b10111111, anything larger in two-complement's
255243
// should start a new code point.
256-
if (p[i] > -65) {
257-
counter++;
258-
}
259-
}
260-
return counter;
244+
return c > -65;
245+
});
261246
}
262247

263248
size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) {
@@ -9525,14 +9510,14 @@ bool constexpr begins_with(std::u32string_view view,
95259510
if (view.size() < prefix.size()) {
95269511
return false;
95279512
}
9528-
return view.substr(0, prefix.size()) == prefix;
9513+
return std::equal(prefix.begin(), prefix.end(), view.begin());
95299514
}
95309515

95319516
bool constexpr begins_with(std::string_view view, std::string_view prefix) {
95329517
if (view.size() < prefix.size()) {
95339518
return false;
95349519
}
9535-
return view.substr(0, prefix.size()) == prefix;
9520+
return std::equal(prefix.begin(), prefix.end(), view.begin());
95369521
}
95379522

95389523
bool constexpr is_ascii(std::u32string_view view) {
@@ -10144,13 +10129,12 @@ ada_really_inline constexpr bool is_lowercase_hex(const char c) noexcept {
1014410129
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
1014510130
}
1014610131

10132+
constexpr static char hex_to_binary_table[] = {
10133+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11,
10134+
12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10135+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15};
1014710136
unsigned constexpr convert_hex_to_binary(const char c) noexcept {
10148-
// this code can be optimized.
10149-
if (c <= '9') {
10150-
return c - '0';
10151-
}
10152-
char del = c >= 'a' ? 'a' : 'A';
10153-
return 10 + (c - del);
10137+
return hex_to_binary_table[c - '0'];
1015410138
}
1015510139

1015610140
std::string percent_decode(const std::string_view input, size_t first_percent) {
@@ -10159,8 +10143,9 @@ std::string percent_decode(const std::string_view input, size_t first_percent) {
1015910143
if (first_percent == std::string_view::npos) {
1016010144
return std::string(input);
1016110145
}
10162-
std::string dest(input.substr(0, first_percent));
10146+
std::string dest;
1016310147
dest.reserve(input.length());
10148+
dest.append(input.substr(0, first_percent));
1016410149
const char* pointer = input.data() + first_percent;
1016510150
const char* end = input.data() + input.size();
1016610151
// Optimization opportunity: if the following code gets
@@ -10197,9 +10182,10 @@ std::string percent_encode(const std::string_view input,
1019710182
return std::string(input);
1019810183
}
1019910184

10200-
std::string result(input.substr(0, std::distance(input.begin(), pointer)));
10185+
std::string result;
1020110186
result.reserve(input.length()); // in the worst case, percent encoding might
1020210187
// produce 3 characters.
10188+
result.append(input.substr(0, std::distance(input.begin(), pointer)));
1020310189

1020410190
for (; pointer != input.end(); pointer++) {
1020510191
if (character_sets::bit_at(character_set, *pointer)) {
@@ -11231,6 +11217,7 @@ bool url::parse_ipv4(std::string_view input) {
1123111217
} else {
1123211218
host = ada::serializers::ipv4(ipv4); // We have to reserialize the address.
1123311219
}
11220+
host_type = IPV4;
1123411221
return true;
1123511222
}
1123611223

@@ -11460,6 +11447,7 @@ bool url::parse_ipv6(std::string_view input) {
1146011447
}
1146111448
host = ada::serializers::ipv6(address);
1146211449
ada_log("parse_ipv6 ", *host);
11450+
host_type = IPV6;
1146311451
return true;
1146411452
}
1146511453

@@ -12569,7 +12557,6 @@ result_type parse_url(std::string_view user_input,
1256912557
// If c is U+002F (/) and remaining starts with U+002F (/),
1257012558
// then set state to special authority ignore slashes state and increase
1257112559
// pointer by 1.
12572-
state = ada::state::SPECIAL_AUTHORITY_IGNORE_SLASHES;
1257312560
std::string_view view = helpers::substring(url_data, input_position);
1257412561
if (ada::checkers::begins_with(view, "//")) {
1257512562
input_position += 2;
@@ -14021,6 +14008,7 @@ bool url_aggregator::parse_ipv4(std::string_view input) {
1402114008
update_base_hostname(
1402214009
ada::serializers::ipv4(ipv4)); // We have to reserialize the address.
1402314010
}
14011+
host_type = IPV4;
1402414012
ADA_ASSERT_TRUE(validate());
1402514013
return true;
1402614014
}
@@ -14256,6 +14244,7 @@ bool url_aggregator::parse_ipv6(std::string_view input) {
1425614244
update_base_hostname(ada::serializers::ipv6(address));
1425714245
ada_log("parse_ipv6 ", get_hostname());
1425814246
ADA_ASSERT_TRUE(validate());
14247+
host_type = IPV6;
1425914248
return true;
1426014249
}
1426114250

@@ -14890,6 +14879,11 @@ void ada_free(ada_url result) noexcept {
1489014879
delete r;
1489114880
}
1489214881

14882+
ada_url ada_copy(ada_url input) noexcept {
14883+
ada::result<ada::url_aggregator>& r = get_instance(input);
14884+
return new ada::result<ada::url_aggregator>(r);
14885+
}
14886+
1489314887
bool ada_is_valid(ada_url result) noexcept {
1489414888
ada::result<ada::url_aggregator>& r = get_instance(result);
1489514889
return r.has_value();
@@ -15007,6 +15001,14 @@ ada_string ada_get_protocol(ada_url result) noexcept {
1500715001
return ada_string_create(out.data(), out.length());
1500815002
}
1500915003

15004+
uint8_t ada_get_host_type(ada_url result) noexcept {
15005+
ada::result<ada::url_aggregator>& r = get_instance(result);
15006+
if (!r) {
15007+
return 0;
15008+
}
15009+
return r->host_type;
15010+
}
15011+
1501015012
bool ada_set_href(ada_url result, const char* input, size_t length) noexcept {
1501115013
ada::result<ada::url_aggregator>& r = get_instance(result);
1501215014
if (!r) {
@@ -15076,20 +15078,67 @@ bool ada_set_pathname(ada_url result, const char* input,
1507615078
return r->set_pathname(std::string_view(input, length));
1507715079
}
1507815080

15081+
/**
15082+
* Update the search/query of the URL.
15083+
*
15084+
* If a URL has `?` as the search value, passing empty string to this function
15085+
* does not remove the attribute. If you need to remove it, please use
15086+
* `ada_clear_search` method.
15087+
*/
1507915088
void ada_set_search(ada_url result, const char* input, size_t length) noexcept {
1508015089
ada::result<ada::url_aggregator>& r = get_instance(result);
1508115090
if (r) {
1508215091
r->set_search(std::string_view(input, length));
1508315092
}
1508415093
}
1508515094

15095+
/**
15096+
* Update the hash/fragment of the URL.
15097+
*
15098+
* If a URL has `#` as the hash value, passing empty string to this function
15099+
* does not remove the attribute. If you need to remove it, please use
15100+
* `ada_clear_hash` method.
15101+
*/
1508615102
void ada_set_hash(ada_url result, const char* input, size_t length) noexcept {
1508715103
ada::result<ada::url_aggregator>& r = get_instance(result);
1508815104
if (r) {
1508915105
r->set_hash(std::string_view(input, length));
1509015106
}
1509115107
}
1509215108

15109+
void ada_clear_port(ada_url result) noexcept {
15110+
ada::result<ada::url_aggregator>& r = get_instance(result);
15111+
if (r) {
15112+
r->clear_port();
15113+
}
15114+
}
15115+
15116+
/**
15117+
* Removes the hash of the URL.
15118+
*
15119+
* Despite `ada_set_hash` method, this function allows the complete
15120+
* removal of the hash attribute, even if it has a value of `#`.
15121+
*/
15122+
void ada_clear_hash(ada_url result) noexcept {
15123+
ada::result<ada::url_aggregator>& r = get_instance(result);
15124+
if (r) {
15125+
r->clear_hash();
15126+
}
15127+
}
15128+
15129+
/**
15130+
* Removes the search of the URL.
15131+
*
15132+
* Despite `ada_set_search` method, this function allows the complete
15133+
* removal of the search attribute, even if it has a value of `?`.
15134+
*/
15135+
void ada_clear_search(ada_url result) noexcept {
15136+
ada::result<ada::url_aggregator>& r = get_instance(result);
15137+
if (r) {
15138+
r->clear_search();
15139+
}
15140+
}
15141+
1509315142
bool ada_has_credentials(ada_url result) noexcept {
1509415143
ada::result<ada::url_aggregator>& r = get_instance(result);
1509515144
if (!r) {

0 commit comments

Comments
 (0)