Skip to content

Commit 3a6f73f

Browse files
committed
Optimizations
1 parent 1fc86ff commit 3a6f73f

File tree

2 files changed

+141
-58
lines changed

2 files changed

+141
-58
lines changed

Zend/zend_string.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@ EMPTY_SWITCH_DEFAULT_CASE()
593593
_(ZEND_STR_PORT, "port") \
594594
_(ZEND_STR_USER, "user") \
595595
_(ZEND_STR_PASS, "pass") \
596+
_(ZEND_STR_PASSWORD, "password") \
596597
_(ZEND_STR_PATH, "path") \
597598
_(ZEND_STR_QUERY, "query") \
598599
_(ZEND_STR_FRAGMENT, "fragment") \

ext/url/ada_url.cpp

Lines changed: 140 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ extern "C" {
2929
#include "Zend/zend_enum.h"
3030
#include "Zend/zend_interfaces.h"
3131
#include "url_arginfo.h"
32+
#include "ext/standard/url.h"
3233
}
3334

3435
#include <ada/ada.h>
@@ -37,94 +38,175 @@ static zend_class_entry *url_ce;
3738
static zend_class_entry *url_component_ce;
3839
static zend_class_entry *url_parser_ce;
3940

41+
static php_url *parseUrlComponents(zend_string *url) {
42+
ada::result<ada::url> ada_url = ada::parse<ada::url>(ZSTR_VAL(url));
43+
if (!ada_url) {
44+
return NULL;
45+
}
46+
47+
ada::url_components components = ada_url->get_components();
48+
49+
php_url *result = (php_url*) ecalloc(1, sizeof(php_url));
50+
51+
result->scheme = zend_string_init(ZSTR_VAL(url), components.protocol_end - 1, false);
52+
53+
if (components.host_start < components.host_end) {
54+
result->host = zend_string_init(ZSTR_VAL(url) + components.host_start, components.host_end - components.host_start, false);
55+
} else {
56+
result->host = ZSTR_EMPTY_ALLOC();
57+
}
58+
59+
result->port = components.port;
60+
61+
if (components.protocol_end + 2 < components.username_end) {
62+
result->user = zend_string_init(ZSTR_VAL(url) + components.protocol_end + 2, components.username_end - components.protocol_end - 2, false);
63+
} else {
64+
result->user = ZSTR_EMPTY_ALLOC();
65+
}
66+
67+
if (components.host_start - components.username_end > 0) {
68+
result->pass = zend_string_init(ZSTR_VAL(url) + components.username_end + 1, components.host_start - components.username_end - 1, false);
69+
} else {
70+
result->pass = ZSTR_EMPTY_ALLOC();
71+
}
72+
73+
size_t ends_at;
74+
if (ada_url->has_search()) {
75+
ends_at = components.search_start;
76+
} else if (ada_url->has_hash()) {
77+
ends_at = components.hash_start;
78+
} else {
79+
ends_at = components.pathname_start;
80+
}
81+
result->path = zend_string_init(ZSTR_VAL(url) + components.pathname_start, ends_at - components.pathname_start, false);
82+
83+
if (!ada_url->has_search()) {
84+
result->query = ZSTR_EMPTY_ALLOC();
85+
} else {
86+
ends_at = ada_url->has_hash() ? components.hash_start : ZSTR_LEN(url);
87+
if (ends_at - components.search_start <= 1) {
88+
result->query = ZSTR_EMPTY_ALLOC();
89+
} else {
90+
result->query = zend_string_init(ZSTR_VAL(url) + components.search_start, ends_at - components.search_start, false);
91+
}
92+
}
93+
94+
if (ada_url->has_hash() && (ZSTR_LEN(url) - components.hash_start > 1)) {
95+
result->fragment = zend_string_init(ZSTR_VAL(url) + components.hash_start + 1, ZSTR_LEN(url) - components.hash_start - 1, false);
96+
} else {
97+
result->fragment = ZSTR_EMPTY_ALLOC();
98+
}
99+
100+
return result;
101+
}
102+
40103
void parseUrlComponentsArray(zend_string *url, zval *return_value)
41104
{
42-
std::string_view protocol, hostname, username, password, port, path, query, fragment;
105+
php_url *components;
106+
zval tmp;
43107

44-
ada::result<ada::url_aggregator> ada_url = ada::parse<ada::url_aggregator>(ZSTR_VAL(url));
45-
if (!ada_url) {
108+
components = parseUrlComponents(url);
109+
if (!components) {
46110
RETURN_NULL();
47111
}
48112

49-
protocol = ada_url->get_protocol();
50-
hostname = ada_url->get_hostname();
51-
port = ada_url->get_port();
52-
username = ada_url->get_username();
53-
password = ada_url->get_password();
54-
path = ada_url->get_protocol();
55-
query = ada_url->get_search();
56-
fragment = ada_url->get_hash();
57-
58113
array_init(return_value);
59-
add_assoc_stringl(return_value,"scheme",protocol.data(), protocol.length()-1);
60-
add_assoc_stringl(return_value,"host", hostname.data(), hostname.length());
61-
add_assoc_stringl(return_value, "port", port.data(), port.length());
62-
add_assoc_stringl(return_value, "user", username.data(), username.length());
63-
add_assoc_stringl(return_value, "password", password.data(), password.length());
64-
add_assoc_stringl(return_value, "path", path.data(), path.length());
65-
add_assoc_stringl(return_value, "query", query.data(), query.length());
66-
add_assoc_stringl(return_value, "fragment", fragment.data(), fragment.length());
114+
115+
ZVAL_STR_COPY(&tmp, components->scheme);
116+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp);
117+
118+
ZVAL_STR_COPY(&tmp, components->host);
119+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_HOST), &tmp);
120+
121+
if (components->port) {
122+
ZVAL_LONG(&tmp, components->port);
123+
} else {
124+
ZVAL_NULL(&tmp);
125+
}
126+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_HOST), &tmp);
127+
128+
ZVAL_STR_COPY(&tmp, components->user);
129+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_USER), &tmp);
130+
131+
ZVAL_STR_COPY(&tmp, components->pass);
132+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PASS), &tmp);
133+
134+
ZVAL_STR_COPY(&tmp, components->path);
135+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PATH), &tmp);
136+
137+
ZVAL_STR_COPY(&tmp, components->query);
138+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_QUERY), &tmp);
139+
140+
ZVAL_STR_COPY(&tmp, components->fragment);
141+
zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &tmp);
142+
143+
php_url_free(components);
67144
}
68145

69146
void parseUrlComponentsObject(zend_string *url, zval *return_value)
70147
{
71-
std::string_view protocol, hostname, username, password, port, path, query, fragment;
148+
php_url *components;
72149

73-
ada::result<ada::url_aggregator> ada_url = ada::parse<ada::url_aggregator>(ZSTR_VAL(url));
74-
if (!ada_url) {
150+
components = parseUrlComponents(url);
151+
if (!components) {
75152
RETURN_NULL();
76153
}
77154

78-
protocol = ada_url->get_protocol();
79-
hostname = ada_url->get_hostname();
80-
port = ada_url->get_port();
81-
username = ada_url->get_username();
82-
password = ada_url->get_password();
83-
path = ada_url->get_protocol();
84-
query = ada_url->get_search();
85-
fragment = ada_url->get_hash();
86-
87155
object_init_ex(return_value, url_ce);
88-
zend_update_property_stringl(
89-
url_ce, Z_OBJ_P(return_value),
90-
"scheme", sizeof("scheme")-1,
91-
protocol.data(), protocol.length()-1
92-
);
93-
zend_update_property_stringl(
156+
zend_update_property_str(
94157
url_ce, Z_OBJ_P(return_value),
95-
"host", sizeof("host")-1,
96-
hostname.data(), hostname.length()
158+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_SCHEME)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_SCHEME)),
159+
components->scheme
97160
);
98-
zend_update_property_stringl(
161+
zend_update_property_str(
99162
url_ce, Z_OBJ_P(return_value),
100-
"port", sizeof("port")-1,
101-
port.data(), port.length()
163+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_HOST)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_HOST)),
164+
components->host
102165
);
103-
zend_update_property_stringl(
166+
if (components->port) {
167+
zend_update_property_long(
168+
url_ce, Z_OBJ_P(return_value),
169+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_PORT)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_PORT)),
170+
components->port
171+
);
172+
} else {
173+
zend_update_property_null(
174+
url_ce, Z_OBJ_P(return_value),
175+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_PORT)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_PORT))
176+
);
177+
}
178+
179+
zend_update_property_str(
104180
url_ce, Z_OBJ_P(return_value),
105-
"user", sizeof("user")-1,
106-
username.data(), username.length()
181+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_USER)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_USER)),
182+
components->user
107183
);
108-
zend_update_property_stringl(
184+
185+
zend_update_property_str(
109186
url_ce, Z_OBJ_P(return_value),
110-
"password", sizeof("password")-1,
111-
password.data(), password.length()
187+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_PASSWORD)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_PASSWORD)),
188+
components->pass
112189
);
113-
zend_update_property_stringl(
190+
191+
zend_update_property_str(
114192
url_ce, Z_OBJ_P(return_value),
115-
"path", sizeof("path")-1,
116-
path.data(), path.length()
193+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_PATH)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_PATH)),
194+
components->path
117195
);
118-
zend_update_property_stringl(
196+
197+
zend_update_property_str(
119198
url_ce, Z_OBJ_P(return_value),
120-
"query", sizeof("query")-1,
121-
query.data(), query.length()
199+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_QUERY)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_QUERY)),
200+
components->query
122201
);
123-
zend_update_property_stringl(
202+
203+
zend_update_property_str(
124204
url_ce, Z_OBJ_P(return_value),
125-
"fragment", sizeof("fragment")-1,
126-
fragment.data(), fragment.length()
205+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_FRAGMENT)), ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_FRAGMENT)),
206+
components->fragment
127207
);
208+
209+
php_url_free(components);
128210
}
129211

130212
PHP_METHOD(Url_Url, __construct)

0 commit comments

Comments
 (0)