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-2010, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
17 #include <ext/standard/php_lcg.h>
18 #include <ext/standard/php_string.h>
19 #include <Zend/zend_exceptions.h>
23 PHP_HTTP_API
void php_http_sleep(double s
)
25 #if defined(PHP_WIN32)
26 Sleep((DWORD
) PHP_HTTP_MSEC(s
));
27 #elif defined(HAVE_USLEEP)
28 usleep(PHP_HTTP_USEC(s
));
29 #elif defined(HAVE_NANOSLEEP)
30 struct timespec req
, rem
;
32 req
.tv_sec
= (time_t) s
;
33 req
.tv_nsec
= PHP_HTTP_NSEC(s
) % PHP_HTTP_NANOSEC
;
35 while (nanosleep(&req
, &rem
) && (errno
== EINTR
) && (PHP_HTTP_NSEC(rem
.tv_sec
) + rem
.tv_nsec
) > PHP_HTTP_NSEC(PHP_HTTP_DIFFSEC
))) {
36 req
.tv_sec
= rem
.tv_sec
;
37 req
.tv_nsec
= rem
.tv_nsec
;
40 struct timeval timeout
;
42 timeout
.tv
.sec
= (time_t) s
;
43 timeout
.tv_usec
= PHP_HTTP_USEC(s
) % PHP_HTTP_MCROSEC
;
45 select(0, NULL
, NULL
, NULL
, &timeout
);
50 /* STRING UTILITIES */
52 int php_http_match(const char *haystack_str
, const char *needle_str
, int flags
)
56 if (flags
& PHP_HTTP_MATCH_FULL
) {
57 if (flags
& PHP_HTTP_MATCH_CASE
) {
58 result
= !strcmp(haystack_str
, needle_str
);
60 result
= !strcasecmp(haystack_str
, needle_str
);
63 char *found
, *haystack
= estrdup(haystack_str
), *needle
= estrdup(needle_str
);
65 if (flags
& PHP_HTTP_MATCH_CASE
) {
66 found
= zend_memnstr(haystack
, needle
, strlen(needle
), haystack
+strlen(haystack
));
68 found
= php_stristr(haystack
, needle
, strlen(haystack
), strlen(needle
));
72 if (!(flags
& PHP_HTTP_MATCH_WORD
)
73 || ( (found
== haystack
|| !PHP_HTTP_IS_CTYPE(alnum
, *(found
- 1)))
74 && (!*(found
+ strlen(needle
)) || !PHP_HTTP_IS_CTYPE(alnum
, *(found
+ strlen(needle
))))
88 char *php_http_pretty_key(char *key
, size_t key_len
, zend_bool uctitle
, zend_bool xhyphen
)
94 if ((wasalpha
= PHP_HTTP_IS_CTYPE(alpha
, key
[0]))) {
95 key
[0] = (char) (uctitle
? PHP_HTTP_TO_CTYPE(upper
, key
[0]) : PHP_HTTP_TO_CTYPE(lower
, key
[0]));
97 for (i
= 1; i
< key_len
; i
++) {
98 if (PHP_HTTP_IS_CTYPE(alpha
, key
[i
])) {
99 key
[i
] = (char) (((!wasalpha
) && uctitle
) ? PHP_HTTP_TO_CTYPE(upper
, key
[i
]) : PHP_HTTP_TO_CTYPE(lower
, key
[i
]));
102 if (xhyphen
&& (key
[i
] == '_')) {
113 size_t php_http_boundary(char *buf
, size_t buf_len TSRMLS_DC
)
115 return snprintf(buf
, buf_len
, "%lu%0.9f", (ulong
) PHP_HTTP_G
->env
.request
.time
, (float) php_combined_lcg(TSRMLS_C
));
120 int php_http_array_apply_append_func(void *pDest TSRMLS_DC
, int num_args
, va_list args
, zend_hash_key
*hash_key
)
125 zval
**data
= NULL
, **value
= (zval
**) pDest
;
127 dst
= va_arg(args
, HashTable
*);
128 flags
= va_arg(args
, int);
130 if ((!(flags
& ARRAY_JOIN_STRONLY
)) || hash_key
->nKeyLength
) {
131 if ((flags
& ARRAY_JOIN_PRETTIFY
) && hash_key
->nKeyLength
) {
132 key
= php_http_pretty_key(estrndup(hash_key
->arKey
, hash_key
->nKeyLength
- 1), hash_key
->nKeyLength
- 1, 1, 1);
133 zend_hash_find(dst
, key
, hash_key
->nKeyLength
, (void *) &data
);
135 zend_hash_quick_find(dst
, hash_key
->arKey
, hash_key
->nKeyLength
, hash_key
->h
, (void *) &data
);
140 if (Z_TYPE_PP(data
) != IS_ARRAY
) {
141 convert_to_array(*data
);
143 add_next_index_zval(*data
, *value
);
145 zend_hash_add(dst
, key
, hash_key
->nKeyLength
, value
, sizeof(zval
*), NULL
);
147 zend_hash_quick_add(dst
, hash_key
->arKey
, hash_key
->nKeyLength
, hash_key
->h
, value
, sizeof(zval
*), NULL
);
155 return ZEND_HASH_APPLY_KEEP
;
158 int php_http_array_apply_merge_func(void *pDest TSRMLS_DC
, int num_args
, va_list args
, zend_hash_key
*hash_key
)
163 zval
**value
= (zval
**) pDest
;
165 dst
= va_arg(args
, HashTable
*);
166 flags
= va_arg(args
, int);
168 if ((!(flags
& ARRAY_JOIN_STRONLY
)) || hash_key
->nKeyLength
) {
170 if ((flags
& ARRAY_JOIN_PRETTIFY
) && hash_key
->nKeyLength
) {
171 key
= php_http_pretty_key(estrndup(hash_key
->arKey
, hash_key
->nKeyLength
- 1), hash_key
->nKeyLength
- 1, 1, 1);
172 zend_hash_update(dst
, key
, hash_key
->nKeyLength
, (void *) value
, sizeof(zval
*), NULL
);
175 zend_hash_quick_update(dst
, hash_key
->arKey
, hash_key
->nKeyLength
, hash_key
->h
, (void *) value
, sizeof(zval
*), NULL
);
179 return ZEND_HASH_APPLY_KEEP
;
184 PHP_HTTP_API
size_t php_http_pass_wrapper(php_http_pass_callback_arg_t
*cb
, const char *str
, size_t len
)
187 return cb
->cb_zts(cb
->cb_arg
, str
, len TSRMLS_CC
);
192 static inline int scope_error_handling(long type TSRMLS_DC
)
194 if ((type
== E_THROW
) || (EG(error_handling
) == EH_THROW
)) {
198 if (EG(This
) && instanceof_function(Z_OBJCE_P(EG(This
)), php_http_object_class_entry
)) {
199 return php_http_object_get_error_handling(EG(This
) TSRMLS_CC
);
205 void php_http_error(long type TSRMLS_DC
, long code
, const char *format
, ...)
209 va_start(args
, format
);
210 switch (scope_error_handling(type TSRMLS_CC
)) {
213 zend_class_entry
*ce
= php_http_exception_class_entry
;
215 if (0&& EG(exception_class
) && instanceof_function(EG(exception_class
), php_http_exception_class_entry
)) {
216 ce
= EG(exception_class
);
219 vspprintf(&message
, 0, format
, args
);
220 zend_throw_exception(ce
, message
, code TSRMLS_CC
);
225 php_verror(NULL
, "", type
, format
, args TSRMLS_CC
);
238 * vim600: noet sw=4 ts=4 fdm=marker
239 * vim<600: noet sw=4 ts=4