2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2014, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 #include "php_http_api.h"
15 #include "ext/standard/php_lcg.h"
16 #include "zend_exceptions.h"
20 void php_http_sleep(double s
)
23 Sleep((DWORD
) PHP_HTTP_MSEC(s
));
25 usleep(PHP_HTTP_USEC(s
));
27 struct timespec req
, rem
;
29 req
.tv_sec
= (time_t) s
;
30 req
.tv_nsec
= PHP_HTTP_NSEC(s
) % PHP_HTTP_NANOSEC
;
32 while (nanosleep(&req
, &rem
) && (errno
== EINTR
) && (PHP_HTTP_NSEC(rem
.tv_sec
) + rem
.tv_nsec
) > PHP_HTTP_NSEC(PHP_HTTP_DIFFSEC
))) {
33 req
.tv_sec
= rem
.tv_sec
;
34 req
.tv_nsec
= rem
.tv_nsec
;
37 struct timeval timeout
;
39 timeout
.tv_sec
= (time_t) s
;
40 timeout
.tv_usec
= PHP_HTTP_USEC(s
) % PHP_HTTP_MCROSEC
;
42 select(0, NULL
, NULL
, NULL
, &timeout
);
47 /* STRING UTILITIES */
49 int php_http_match(const char *haystack_str
, const char *needle_str
, int flags
)
53 if (UNEXPECTED(!haystack_str
|| !needle_str
)) {
57 if (UNEXPECTED(flags
& PHP_HTTP_MATCH_FULL
)) {
58 if (flags
& PHP_HTTP_MATCH_CASE
) {
59 result
= !strcmp(haystack_str
, needle_str
);
61 result
= !strcasecmp(haystack_str
, needle_str
);
65 char *haystack
= estrdup(haystack_str
), *needle
= estrdup(needle_str
);
67 if (UNEXPECTED(flags
& PHP_HTTP_MATCH_CASE
)) {
68 found
= zend_memnstr(haystack
, needle
, strlen(needle
), haystack
+strlen(haystack
));
70 found
= php_stristr(haystack
, needle
, strlen(haystack
), strlen(needle
));
74 if (!(flags
& PHP_HTTP_MATCH_WORD
)
75 || ( (found
== haystack
|| !PHP_HTTP_IS_CTYPE(alnum
, *(found
- 1)))
76 && EXPECTED(!*(found
+ strlen(needle
)) || !PHP_HTTP_IS_CTYPE(alnum
, *(found
+ strlen(needle
))))
90 char *php_http_pretty_key(char *key
, size_t key_len
, zend_bool uctitle
, zend_bool xhyphen
)
96 if (EXPECTED(wasalpha
= PHP_HTTP_IS_CTYPE(alpha
, key
[0]))) {
97 if (EXPECTED(uctitle
)) {
98 key
[0] = PHP_HTTP_TO_CTYPE(upper
, key
[0]);
100 key
[0] = PHP_HTTP_TO_CTYPE(lower
, key
[0]);
103 for (i
= 1; i
< key_len
; ++i
) {
104 if (EXPECTED(PHP_HTTP_IS_CTYPE(alpha
, key
[i
]))) {
105 if (EXPECTED(wasalpha
)) {
106 key
[i
] = PHP_HTTP_TO_CTYPE(lower
, key
[i
]);
107 } else if (EXPECTED(uctitle
)) {
108 key
[i
] = PHP_HTTP_TO_CTYPE(upper
, key
[i
]);
111 key
[i
] = PHP_HTTP_TO_CTYPE(lower
, key
[i
]);
115 if (EXPECTED(xhyphen
&& (key
[i
] == '_'))) {
126 size_t php_http_boundary(char *buf
, size_t buf_len
)
128 return snprintf(buf
, buf_len
, "%15.15F", sapi_get_request_time() * php_combined_lcg());
131 int php_http_select_str(const char *cmp
, int argc
, ...)
136 if (cmp
&& argc
> 0) {
139 va_start(argv
, argc
);
140 for (i
= 0; i
< argc
; ++i
) {
141 const char *test
= va_arg(argv
, const char *);
143 if (!strcasecmp(cmp
, test
)) {
157 unsigned php_http_array_list(HashTable
*ht
, unsigned argc
, ...)
163 va_start(argv
, argc
);
164 ZEND_HASH_FOREACH_VAL(ht
, data
) {
165 zval
**argp
= (zval
**) va_arg(argv
, zval
**);
168 } ZEND_HASH_FOREACH_END();
174 void php_http_array_copy_strings(zval
*zp
)
177 convert_to_string_ex(zp
);
180 int php_http_array_apply_append_func(zval
*value
, int num_args
, va_list args
, zend_hash_key
*hash_key
)
187 dst
= va_arg(args
, HashTable
*);
188 flags
= va_arg(args
, int);
190 if ((!(flags
& ARRAY_JOIN_STRONLY
)) || hash_key
->key
) {
191 if ((flags
& ARRAY_JOIN_PRETTIFY
) && hash_key
->key
) {
192 key
= php_http_pretty_key(estrndup(hash_key
->key
->val
, hash_key
->key
->len
), hash_key
->key
->len
, 1, 1);
193 data
= zend_hash_str_find(dst
, key
, hash_key
->key
->len
);
194 } else if (hash_key
->key
) {
195 data
= zend_hash_find(dst
, hash_key
->key
);
197 data
= zend_hash_index_find(dst
, hash_key
->h
);
200 if (flags
& ARRAY_JOIN_STRINGIFY
) {
201 convert_to_string_ex(value
);
203 Z_TRY_ADDREF_P(value
);
206 if (Z_TYPE_P(data
) != IS_ARRAY
) {
207 convert_to_array(data
);
209 add_next_index_zval(data
, value
);
211 zend_hash_str_update(dst
, key
, hash_key
->key
->len
, value
);
212 } else if (hash_key
->key
) {
213 zend_hash_update(dst
, hash_key
->key
, value
);
215 zend_hash_index_update(dst
, hash_key
->h
, value
);
223 return ZEND_HASH_APPLY_KEEP
;
226 int php_http_array_apply_merge_func(zval
*value
, int num_args
, va_list args
, zend_hash_key
*hash_key
)
232 dst
= va_arg(args
, HashTable
*);
233 flags
= va_arg(args
, int);
235 if ((!(flags
& ARRAY_JOIN_STRONLY
)) || hash_key
->key
) {
236 if (flags
& ARRAY_JOIN_STRINGIFY
) {
237 convert_to_string_ex(value
);
240 Z_TRY_ADDREF_P(value
);
242 if ((flags
& ARRAY_JOIN_PRETTIFY
) && hash_key
->key
) {
243 key
= php_http_pretty_key(estrndup(hash_key
->key
->val
, hash_key
->key
->len
), hash_key
->key
->len
, 1, 1);
244 zend_hash_str_update(dst
, key
, hash_key
->key
->len
, value
);
246 } else if (hash_key
->key
) {
247 zend_hash_update(dst
, hash_key
->key
, value
);
249 zend_hash_index_update(dst
, hash_key
->h
, value
);
253 return ZEND_HASH_APPLY_KEEP
;
258 size_t php_http_pass_fcall_callback(void *cb_arg
, const char *str
, size_t len
)
260 php_http_pass_fcall_arg_t
*fcd
= cb_arg
;
263 ZVAL_STRINGL(&zdata
, str
, len
);
264 if (SUCCESS
== zend_fcall_info_argn(&fcd
->fci
, 2, &fcd
->fcz
, &zdata
)) {
265 zend_fcall_info_call(&fcd
->fci
, &fcd
->fcc
, NULL
, NULL
);
266 zend_fcall_info_args_clear(&fcd
->fci
, 0);
268 zval_ptr_dtor(&zdata
);
280 * vim600: noet sw=4 ts=4 fdm=marker
281 * vim<600: noet sw=4 ts=4