52static void php_replace_controlchars(
char *str,
size_t len)
54 unsigned char *
s = (
unsigned char *)str;
55 unsigned char *e = (
unsigned char *)str +
len;
72static const char *binary_strcspn(
const char *
s,
const char *e,
const char *chars) {
74 const char *
p = memchr(
s, *chars, e -
s);
96 char const *
s, *e, *
p, *pp, *ue;
103 if ((e = memchr(
s,
':', length)) && e !=
s) {
108 if (!isalpha(*
p) && !isdigit(*
p) && *
p !=
'+' && *
p !=
'.' && *
p !=
'-') {
109 if (e + 1 < ue && e < binary_strcspn(
s, ue,
"?#")) {
111 }
else if (
s + 1 < ue && *
s ==
'/' && *(
s + 1) ==
'/') {
123 ret->scheme = zend_string_init(
s, (e -
s), 0);
137 while (
p < ue && isdigit(*
p)) {
141 if ((
p == ue || *
p ==
'/') && (
p - e) < 7) {
145 ret->scheme = zend_string_init(
s, (e-
s), 0);
151 ret->scheme = zend_string_init(
s, (e-
s), 0);
154 if (e + 2 < ue && *(e + 2) ==
'/') {
157 if (e + 3 < ue && *(e + 3) ==
'/') {
161 if (e + 5 < ue && *(e + 5) ==
':') {
177 while (pp < ue && pp -
p < 6 && isdigit(*pp)) {
181 if (pp -
p > 0 && pp -
p < 6 && (pp == ue || *pp ==
'/')) {
185 port_buf[pp -
p] =
'\0';
187 if (port >= 0 && port <= 65535 &&
end != port_buf) {
189 ret->port = (
unsigned short) port;
190 if (
s + 1 < ue && *
s ==
'/' && *(
s + 1) ==
'/') {
197 }
else if (
p == pp && pp == ue) {
200 }
else if (
s + 1 < ue && *
s ==
'/' && *(
s + 1) ==
'/') {
205 }
else if (
s + 1 < ue && *
s ==
'/' && *(
s + 1) ==
'/') {
212 e = binary_strcspn(
s, ue,
"/?#");
215 if ((
p = zend_memrchr(
s,
'@', (e-
s)))) {
216 if ((pp = memchr(
s,
':', (
p-
s)))) {
217 ret->user = zend_string_init(
s, (pp-
s), 0);
221 ret->pass = zend_string_init(pp, (
p-pp), 0);
224 ret->user = zend_string_init(
s, (
p-
s), 0);
232 if (
s < ue && *
s ==
'[' && *(e-1) ==
']') {
238 p = zend_memrchr(
s,
':', (e-
s));
247 }
else if (e -
p > 0) {
251 port_buf[e -
p] =
'\0';
253 if (port >= 0 && port <= 65535 &&
end != port_buf) {
255 ret->port = (
unsigned short)port;
273 ret->host = zend_string_init(
s, (
p-
s), 0);
285 p = memchr(
s,
'#', (e -
s));
289 ret->fragment = zend_string_init(
p, (e -
p), 0);
297 p = memchr(
s,
'?', (e -
s));
301 ret->query = zend_string_init(
p, (e -
p), 0);
309 if (
s < e ||
s == ue) {
310 ret->path = zend_string_init(
s, (e -
s), 0);
335 if (resource ==
NULL) {
415static int php_htoi(
char *
s)
420 c = ((
unsigned char *)
s)[0];
423 value = (c >=
'0' && c <=
'9' ? c -
'0' : c -
'a' + 10) * 16;
425 c = ((
unsigned char *)
s)[1];
428 value += c >=
'0' && c <=
'9' ? c -
'0' : c -
'a' + 10;
447static const unsigned char hexchars[] =
"0123456789ABCDEF";
452 unsigned char const *from, *
end;
455 from = (
unsigned char *)
s;
456 end = (
unsigned char *)
s +
len;
457 start = zend_string_safe_alloc(3,
len, 0, 0);
461 while (from + 16 <
end) {
464 const __m128i _A = _mm_set1_epi8(
'A' - 1);
465 const __m128i Z_ = _mm_set1_epi8(
'Z' + 1);
466 const __m128i _a = _mm_set1_epi8(
'a' - 1);
467 const __m128i z_ = _mm_set1_epi8(
'z' + 1);
468 const __m128i _zero = _mm_set1_epi8(
'0' - 1);
469 const __m128i nine_ = _mm_set1_epi8(
'9' + 1);
470 const __m128i dot = _mm_set1_epi8(
'.');
471 const __m128i minus = _mm_set1_epi8(
'-');
472 const __m128i under = _mm_set1_epi8(
'_');
474 __m128i in = _mm_loadu_si128((__m128i *)from);
476 __m128i
gt = _mm_cmpgt_epi8(in, _A);
477 __m128i lt = _mm_cmplt_epi8(in, Z_);
478 mask = _mm_and_si128(lt,
gt);
479 gt = _mm_cmpgt_epi8(in, _a);
480 lt = _mm_cmplt_epi8(in, z_);
481 mask = _mm_or_si128(mask, _mm_and_si128(lt,
gt));
482 gt = _mm_cmpgt_epi8(in, _zero);
483 lt = _mm_cmplt_epi8(in, nine_);
484 mask = _mm_or_si128(mask, _mm_and_si128(lt,
gt));
485 mask = _mm_or_si128(mask, _mm_cmpeq_epi8(in, dot));
486 mask = _mm_or_si128(mask, _mm_cmpeq_epi8(in, minus));
487 mask = _mm_or_si128(mask, _mm_cmpeq_epi8(in, under));
490 const __m128i blank = _mm_set1_epi8(
' ');
491 __m128i eq = _mm_cmpeq_epi8(in, blank);
492 if (_mm_movemask_epi8(eq)) {
493 in = _mm_add_epi8(in, _mm_and_si128(eq, _mm_set1_epi8(
'+' -
' ')));
494 mask = _mm_or_si128(mask, eq);
498 const __m128i wavy = _mm_set1_epi8(
'~');
499 mask = _mm_or_si128(mask, _mm_cmpeq_epi8(in, wavy));
501 if (((bits = _mm_movemask_epi8(mask)) & 0xffff) == 0xffff) {
502 _mm_storeu_si128((__m128i*)to, in);
505 unsigned char xmm[16];
506 _mm_storeu_si128((__m128i*)xmm, in);
507 for (
size_t i = 0; i <
sizeof(xmm); i++) {
508 if ((bits & (0x1 << i))) {
512 *to++ = hexchars[xmm[i] >> 4];
513 *to++ = hexchars[xmm[i] & 0xf];
523 if (!raw && c ==
' ') {
525 }
else if ((c <
'0' && c !=
'-' && c !=
'.') ||
526 (c <
'A' && c >
'9') ||
527 (c >
'Z' && c <
'a' && c !=
'_') ||
528 (c >
'z' && (!raw || c !=
'~'))) {
530 to[1] = hexchars[c >> 4];
531 to[2] = hexchars[c & 15];
548 return php_url_encode_impl(
s,
len, 0);
591 else if (*
data ==
'%' &&
len >= 2 && isxdigit((
int) *(
data + 1))
592 && isxdigit((
int) *(
data + 2))) {
593 *dest = (char) php_htoi(
data + 1);
610 return php_url_encode_impl(
s,
len, 1);
650 if (*
data ==
'%' &&
len >= 2 && isxdigit((
int) *(
data + 1))
651 && isxdigit((
int) *(
data + 2))) {
652 *dest = (char) php_htoi(
data + 1);
712 while (isspace((
int)*(
unsigned char *)
s)) {
get_headers(string $url, bool $associative=false, $context=null)
parse_url(string $url, int $component=-1)
rawurldecode(string $string)
rawurlencode(string $string)
urlencode(string $string)
urldecode(string $string)
strchr(string $haystack, string $needle, bool $before_needle=false)
unsigned const char * end
unsigned char key[REFLECTION_KEY_LEN]
#define php_stream_context_from_zval(zcontext, nocontext)
struct _php_stream php_stream
struct _php_stream_context php_stream_context
#define STREAM_ONLY_GET_HEADERS
#define php_stream_open_wrapper_ex(path, mode, options, opened, context)
#define php_stream_close(stream)
PHPAPI size_t php_url_decode(char *str, size_t len)
PHPAPI zend_string * php_raw_url_encode(char const *s, size_t len)
PHPAPI zend_string * php_url_encode(char const *s, size_t len)
PHPAPI php_url * php_url_parse_ex2(char const *str, size_t length, bool *has_port)
PHPAPI php_url * php_url_parse(char const *str)
PHPAPI size_t php_raw_url_decode(char *str, size_t len)
PHPAPI php_url * php_url_parse_ex(char const *str, size_t length)
PHPAPI void php_url_free(php_url *theurl)
ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length)
ZEND_API void add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, const char *str, size_t length)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API zend_result add_next_index_str(zval *arg, zend_string *str)
#define ZEND_PARSE_PARAMETERS_END()
#define RETVAL_STR_COPY(s)
#define Z_PARAM_STRING(dest, dest_len)
#define Z_PARAM_STR(dest)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
#define RETURN_NEW_STR(s)
#define Z_PARAM_BOOL(dest)
#define Z_PARAM_PATH(dest, dest_len)
#define Z_PARAM_RESOURCE_OR_NULL(dest)
#define ecalloc(nmemb, size)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API zval *ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData)
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_FOREACH_VAL(ht, _val)
#define ZEND_STRTOL(s0, s1, base)
struct _zend_string zend_string
ZEND_API void ZEND_FASTCALL convert_to_array(zval *op)
#define zend_always_inline
#define ZSTR_EMPTY_ALLOC()
#define zend_string_equals_literal_ci(str, c)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
#define ZVAL_STR_COPY(z, s)
#define Z_STRLEN_P(zval_p)