projects
/
m6w6
/
ext-http
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
hack PHP_5_4 compatibility into v1
[m6w6/ext-http]
/
http_api.c
diff --git
a/http_api.c
b/http_api.c
index 138b08e0697377e05afd17470cba39b2abc5a84d..aa5b97b88c056fe94be0f11311b06d2a98d24e3e 100644
(file)
--- a/
http_api.c
+++ b/
http_api.c
@@
-6,7
+6,7
@@
| modification, are permitted provided that the conditions mentioned |
| in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
| modification, are permitted provided that the conditions mentioned |
| in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
- | Copyright (c) 2004-20
07
, Michael Wallner <mike@php.net> |
+ | Copyright (c) 2004-20
10
, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
*/
+--------------------------------------------------------------------+
*/
@@
-17,6
+17,7
@@
#include "php_output.h"
#include "ext/standard/url.h"
#include "php_output.h"
#include "ext/standard/url.h"
+#include "ext/standard/php_lcg.h"
#include "php_http_api.h"
#include "php_http_send_api.h"
#include "php_http_api.h"
#include "php_http_send_api.h"
@@
-32,6
+33,7
@@
PHP_MINIT_FUNCTION(http_support)
HTTP_LONG_CONSTANT("HTTP_SUPPORT_MAGICMIME", HTTP_SUPPORT_MAGICMIME);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_ENCODINGS", HTTP_SUPPORT_ENCODINGS);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_SSLREQUESTS", HTTP_SUPPORT_SSLREQUESTS);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_MAGICMIME", HTTP_SUPPORT_MAGICMIME);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_ENCODINGS", HTTP_SUPPORT_ENCODINGS);
HTTP_LONG_CONSTANT("HTTP_SUPPORT_SSLREQUESTS", HTTP_SUPPORT_SSLREQUESTS);
+ HTTP_LONG_CONSTANT("HTTP_SUPPORT_EVENTS", HTTP_SUPPORT_EVENTS);
HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_COMMA", HTTP_PARAMS_ALLOW_COMMA);
HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_FAILURE", HTTP_PARAMS_ALLOW_FAILURE);
HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_COMMA", HTTP_PARAMS_ALLOW_COMMA);
HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_FAILURE", HTTP_PARAMS_ALLOW_FAILURE);
@@
-50,6
+52,9
@@
PHP_HTTP_API long _http_support(long feature)
# ifdef HTTP_HAVE_SSL
support |= HTTP_SUPPORT_SSLREQUESTS;
# endif
# ifdef HTTP_HAVE_SSL
support |= HTTP_SUPPORT_SSLREQUESTS;
# endif
+# ifdef HTTP_HAVE_EVENT
+ support |= HTTP_SUPPORT_EVENTS;
+# endif
#endif
#ifdef HTTP_HAVE_MAGIC
support |= HTTP_SUPPORT_MAGICMIME;
#endif
#ifdef HTTP_HAVE_MAGIC
support |= HTTP_SUPPORT_MAGICMIME;
@@
-90,6
+95,13
@@
char *_http_pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool x
}
/* }}} */
}
/* }}} */
+/* {{{ http_boundary(char *, size_t) */
+size_t _http_boundary(char *buf, size_t buf_len TSRMLS_DC)
+{
+ return snprintf(buf, buf_len, "%lu%0.9f", (ulong) HTTP_G->request.time, (float) php_combined_lcg(TSRMLS_C));
+}
+/* }}} */
+
/* {{{ void http_error(long, long, char*) */
void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...)
{
/* {{{ void http_error(long, long, char*) */
void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...)
{
@@
-97,7
+109,7
@@
void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...)
va_start(args, format);
#ifdef ZEND_ENGINE_2
va_start(args, format);
#ifdef ZEND_ENGINE_2
- if ((type == E_THROW) || (
PG(error_handling)
== EH_THROW)) {
+ if ((type == E_THROW) || (
GLOBAL_ERROR_HANDLING
== EH_THROW)) {
char *message;
zend_class_entry *ce = http_exception_get_for_code(code);
char *message;
zend_class_entry *ce = http_exception_get_for_code(code);
@@
-105,7
+117,7
@@
void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...)
vspprintf(&message, 0, format, args);
zend_throw_exception(ce, message, code TSRMLS_CC);
efree(message);
vspprintf(&message, 0, format, args);
zend_throw_exception(ce, message, code TSRMLS_CC);
efree(message);
- } http_catch(
PG(exception_class) ? PG(exception_class)
: HTTP_EX_DEF_CE);
+ } http_catch(
GLOBAL_EXCEPTION_CLASS ? GLOBAL_EXCEPTION_CLASS
: HTTP_EX_DEF_CE);
} else
#endif
php_verror(NULL, "", type, format, args TSRMLS_CC);
} else
#endif
php_verror(NULL, "", type, format, args TSRMLS_CC);
@@
-168,7
+180,10
@@
zval *_http_exception_wrap(zval *old_exception, zval *new_exception, zend_class_
copy_bt_args(old_exception, new_exception TSRMLS_CC);
copy_bt_args(old_exception, sub_exception TSRMLS_CC);
}
copy_bt_args(old_exception, new_exception TSRMLS_CC);
copy_bt_args(old_exception, sub_exception TSRMLS_CC);
}
-
+#if PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3
+ Z_ADDREF_P(old_exception);
+ zend_exception_set_previous(new_exception, old_exception TSRMLS_CC);
+#endif
zval_ptr_dtor(&old_exception);
return new_exception;
}
zval_ptr_dtor(&old_exception);
return new_exception;
}
@@
-180,7
+195,7
@@
STATUS _http_object_new(zend_object_value *ov, const char *cname_str, uint cname
zend_class_entry *ce = parent_ce;
if (cname_str && cname_len) {
zend_class_entry *ce = parent_ce;
if (cname_str && cname_len) {
- if (!(ce = zend_fetch_class((char *) cname_str, cname_len, ZEND_FETCH_CLASS_DEFAULT TSRMLS_CC))) {
+ if (!(ce = zend_fetch_class(
HTTP_ZAPI_CONST_CAST
(char *) cname_str, cname_len, ZEND_FETCH_CLASS_DEFAULT TSRMLS_CC))) {
return FAILURE;
}
if (!instanceof_function(ce, parent_ce TSRMLS_CC)) {
return FAILURE;
}
if (!instanceof_function(ce, parent_ce TSRMLS_CC)) {
@@
-237,10
+252,14
@@
STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header
STR_FREE(body);
return FAILURE;
}
STR_FREE(body);
return FAILURE;
}
-
- if (!OG(ob_lock)) {
+
+#ifndef PHP_OUTPUT_NEWAPI
+ if (!OG(ob_lock) &&
+ !php_ob_handler_used("zlib output compression" TSRMLS_CC) && !php_ob_handler_used("ob_gzhandler" TSRMLS_CC)) {
php_end_ob_buffers(0 TSRMLS_CC);
}
php_end_ob_buffers(0 TSRMLS_CC);
}
+#endif
+
if ((SUCCESS == sapi_send_headers(TSRMLS_C)) && body) {
PHPWRITE(body, strlen(body));
}
if ((SUCCESS == sapi_send_headers(TSRMLS_C)) && body) {
PHPWRITE(body, strlen(body));
}
@@
-263,7
+282,11
@@
STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header
if (HTTP_G->force_exit) {
zend_bailout();
} else {
if (HTTP_G->force_exit) {
zend_bailout();
} else {
+#ifdef PHP_OUTPUT_NEWAPI
+ php_output_start_devnull(TSRMLS_C);
+#else
php_ob_set_internal_handler(http_ob_blackhole, 4096, "blackhole", 0 TSRMLS_CC);
php_ob_set_internal_handler(http_ob_blackhole, 4096, "blackhole", 0 TSRMLS_CC);
+#endif
}
return SUCCESS;
}
return SUCCESS;
@@
-310,7
+333,7
@@
PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_len, zend
if ((SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) {
return NULL;
}
if ((SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) {
return NULL;
}
- if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_len + 1, (void *) &var))) {
+ if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv),
HTTP_ZAPI_CONST_CAST
(char *) key, key_len + 1, (void *) &var))) {
return NULL;
}
if (check && !((Z_TYPE_PP(var) == IS_STRING) && Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) {
return NULL;
}
if (check && !((Z_TYPE_PP(var) == IS_STRING) && Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) {
@@
-335,17
+358,22
@@
PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_
}
return SUCCESS;
} else if (sapi_module.read_post && !HTTP_G->read_post_data) {
}
return SUCCESS;
} else if (sapi_module.read_post && !HTTP_G->read_post_data) {
- char
buf[4096]
;
+ char
*buf = emalloc(4096)
;
int len;
HTTP_G->read_post_data = 1;
int len;
HTTP_G->read_post_data = 1;
- while (0 < (len = sapi_module.read_post(buf, sizeof(buf) TSRMLS_CC))) {
+ while (0 < (len = sapi_module.read_post(buf, 4096 TSRMLS_CC))) {
+ SG(read_post_bytes) += len;
*body = erealloc(*body, *length + len + 1);
memcpy(*body + *length, buf, len);
*length += len;
(*body)[*length] = '\0';
*body = erealloc(*body, *length + len + 1);
memcpy(*body + *length, buf, len);
*length += len;
(*body)[*length] = '\0';
+ if (len < 4096) {
+ break;
+ }
}
}
+ efree(buf);
/* check for error */
if (len < 0) {
/* check for error */
if (len < 0) {
@@
-378,12
+406,16
@@
PHP_HTTP_API php_stream *_http_get_request_body_stream(TSRMLS_D)
HTTP_G->read_post_data = 1;
if ((s = php_stream_temp_new())) {
HTTP_G->read_post_data = 1;
if ((s = php_stream_temp_new())) {
- char
buf[4096]
;
+ char
*buf = emalloc(4096)
;
int len;
int len;
- while (0 < (len = sapi_module.read_post(buf,
sizeof(buf)
TSRMLS_CC))) {
+ while (0 < (len = sapi_module.read_post(buf,
4096
TSRMLS_CC))) {
php_stream_write(s, buf, len);
php_stream_write(s, buf, len);
+ if (len < 4096) {
+ break;
+ }
}
}
+ efree(buf);
if (len < 0) {
php_stream_close(s);
if (len < 0) {
php_stream_close(s);
@@
-537,15
+569,6
@@
PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int flags, http_par
goto failure;
break;
goto failure;
break;
- case '=':
- if (key) {
- keylen = c - key;
- st = ST_VALUE;
- } else {
- goto failure;
- }
- break;
-
case ' ':
if (key) {
keylen = c - key;
case ' ':
if (key) {
keylen = c - key;
@@
-562,7
+585,32
@@
PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int flags, http_par
}
break;
}
break;
+ case ':':
+ if (!(flags & HTTP_PARAMS_COLON_SEPARATOR)) {
+ goto not_separator;
+ }
+ if (key) {
+ keylen = c - key;
+ st = ST_VALUE;
+ } else {
+ goto failure;
+ }
+ break;
+
+ case '=':
+ if (flags & HTTP_PARAMS_COLON_SEPARATOR) {
+ goto not_separator;
+ }
+ if (key) {
+ keylen = c - key;
+ st = ST_VALUE;
+ } else {
+ goto failure;
+ }
+ break;
+
default:
default:
+ not_separator:
if (!key) {
key = c;
}
if (!key) {
key = c;
}
@@
-634,7
+682,7
@@
failure:
/* }}} */
/* {{{ array_join */
/* }}} */
/* {{{ array_join */
-int apply_array_append_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key)
+int apply_array_append_func(void *pDest
HTTP_ZAPI_HASH_TSRMLS_DC
, int num_args, va_list args, zend_hash_key *hash_key)
{
int flags;
char *key = NULL;
{
int flags;
char *key = NULL;
@@
-654,10
+702,7
@@
int apply_array_append_func(void *pDest, int num_args, va_list args, zend_hash_k
ZVAL_ADDREF(*value);
if (data) {
ZVAL_ADDREF(*value);
if (data) {
- if (Z_TYPE_PP(data) != IS_ARRAY) {
- convert_to_array(*data);
- }
- add_next_index_zval(*data, *value);
+ add_next_index_zval(http_zset(IS_ARRAY, *data), *value);
} else if (key) {
zend_hash_add(dst, key, hash_key->nKeyLength, value, sizeof(zval *), NULL);
} else {
} else if (key) {
zend_hash_add(dst, key, hash_key->nKeyLength, value, sizeof(zval *), NULL);
} else {
@@
-672,7
+717,7
@@
int apply_array_append_func(void *pDest, int num_args, va_list args, zend_hash_k
return ZEND_HASH_APPLY_KEEP;
}
return ZEND_HASH_APPLY_KEEP;
}
-int apply_array_merge_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key)
+int apply_array_merge_func(void *pDest
HTTP_ZAPI_HASH_TSRMLS_DC
, int num_args, va_list args, zend_hash_key *hash_key)
{
int flags;
char *key = NULL;
{
int flags;
char *key = NULL;