X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=acff118b1f9edd40b9d678f549a327a85e22c306;hp=22542083ee1e88b3a01bbbe46909ae644f1dc281;hb=9676c81efbb8f180fa189d71a7ecb50dde4f5646;hpb=dbc4ec02cd319000b5c8589910047cfe6d5738be diff --git a/http_api.c b/http_api.c index 2254208..acff118 100644 --- a/http_api.c +++ b/http_api.c @@ -96,12 +96,15 @@ void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...) va_start(args, format); #ifdef ZEND_ENGINE_2 - if ((type == E_THROW) || (PG(error_handling) == EH_THROW)) { - char *message; - - vspprintf(&message, 0, format, args); - zend_throw_exception(http_exception_get_for_code(code), message, code TSRMLS_CC); - efree(message); + if ((type == E_THROW) || (PG(error_handling) == EH_THROW)) { + char *message; + zend_class_entry *ce = http_exception_get_for_code(code); + + http_try { + vspprintf(&message, 0, format, args); + zend_throw_exception(ce, message, code TSRMLS_CC); + efree(message); + } http_catch(ce); } else #endif php_verror(NULL, "", type, format, args TSRMLS_CC); @@ -109,6 +112,41 @@ void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...) } /* }}} */ +#ifdef ZEND_ENGINE_2 +/* {{{ zval *http_exception_wrap(zval *, zval *, zend_class_entry *) */ +zval *_http_exception_wrap(zval *old_exception, zval *new_exception, zend_class_entry *ce TSRMLS_DC) +{ + zval **args, **trace_0, *old_trace_0, *trace = NULL; + + /* create wrapping exception if requested */ + if (!new_exception) { + MAKE_STD_ZVAL(new_exception); + object_init_ex(new_exception, ce); + zend_update_property_string(ce, new_exception, "message", lenof("message"), "Exception caused by inner exception(s)" TSRMLS_CC); + } + + /* copy bt arguments */ + if ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), old_exception, "trace", lenof("trace"), 0 TSRMLS_CC))) { + if (Z_TYPE_P(trace) == IS_ARRAY && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(trace), 0, (void *) &trace_0)) { + old_trace_0 = *trace_0; + if (Z_TYPE_PP(trace_0) == IS_ARRAY && SUCCESS == zend_hash_find(Z_ARRVAL_PP(trace_0), "args", sizeof("args"), (void *) &args)) { + if ((trace = zend_read_property(ZEND_EXCEPTION_GET_DEFAULT(), new_exception, "trace", lenof("trace"), 0 TSRMLS_CC))) { + if (Z_TYPE_P(trace) == IS_ARRAY && SUCCESS == zend_hash_index_find(Z_ARRVAL_P(trace), 0, (void *) &trace_0)) { + ZVAL_ADDREF(*args); + add_assoc_zval(*trace_0, "args", *args); + } + } + } + } + } + + zend_update_property(Z_OBJCE_P(new_exception), new_exception, "innerException", lenof("innerException"), old_exception TSRMLS_CC); + zval_ptr_dtor(&old_exception); + return new_exception; +} +/* }}} */ +#endif /* ZEND_ENGINE_2 */ + /* {{{ void http_log(char *, char *, char *) */ void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC) { @@ -116,7 +154,7 @@ void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC) struct tm nowtm; char datetime[20] = {0}; - now = HTTP_GET_REQUEST_TIME(); + now = HTTP_G->request.time; strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", php_localtime_r(&now, &nowtm)); #define HTTP_LOG_WRITE(file, type, msg) \ @@ -145,7 +183,7 @@ static void http_ob_blackhole(char *output, uint output_len, char **handled_outp STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header TSRMLS_DC) { if ( (send_header && (SUCCESS != http_send_status_header(status, header))) || - (!send_header && status && (SUCCESS != http_send_status(status)))) { + (status && (SUCCESS != http_send_status(status)))) { http_error_ex(HE_WARNING, HTTP_E_HEADER, "Failed to exit with status/header: %d - %s", status, header ? header : ""); STR_FREE(header); STR_FREE(body); @@ -166,6 +204,7 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header case 305: http_log(HTTP_G->log.redirect, "305-REDIRECT", header); break; case 307: http_log(HTTP_G->log.redirect, "307-REDIRECT", header); break; case 304: http_log(HTTP_G->log.cache, "304-CACHE", header); break; + case 404: http_log(HTTP_G->log.not_found, "404-NOTFOUND", NULL); break; case 405: http_log(HTTP_G->log.allowed_methods, "405-ALLOWED", header); break; default: http_log(NULL, header, body); break; } @@ -208,10 +247,10 @@ PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_size, zen 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_size, (void *) &var)) || (Z_TYPE_PP(var) != IS_STRING)) { + if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_size, (void *) &var))) { return NULL; } - if (check && !(Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) { + if (check && !((Z_TYPE_PP(var) == IS_STRING) && Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) { return NULL; } return *var;