- move some cruft of http_request_api.c to php_http_request_int.h
[m6w6/ext-http] / http_api.c
index 22542083ee1e88b3a01bbbe46909ae644f1dc281..acff118b1f9edd40b9d678f549a327a85e22c306 100644 (file)
@@ -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;