branch off v1 as R_1_7
[m6w6/ext-http] / php_http_api.h
index a490347b211cdf4daf7165bc4a87b2ac7ab64c55..3a64350eca71abc1458be02aaf14b433839a5199 100644 (file)
@@ -6,7 +6,7 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2007, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2010, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
@@ -27,6 +27,7 @@
 #define HTTP_PARAMS_ALLOW_FAILURE      0x02
 #define HTTP_PARAMS_RAISE_ERROR                0x04
 #define HTTP_PARAMS_DEFAULT    (HTTP_PARAMS_ALLOW_COMMA|HTTP_PARAMS_ALLOW_FAILURE|HTTP_PARAMS_RAISE_ERROR)
+#define HTTP_PARAMS_COLON_SEPARATOR    0x10
 
 extern PHP_MINIT_FUNCTION(http_support);
 
@@ -95,12 +96,18 @@ extern STATUS _http_object_new(zend_object_value *ov, const char *cname_str, uin
                http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid compression level (-1 to 9): %d", level); \
                action; \
        }
-
+#ifndef PHP_OUTPUT_NEWAPI
+#      define HTTP_GET_OUTPUT_START() \
+               char *output_start_filename = php_get_output_start_filename(TSRMLS_C); \
+               int output_start_lineno = php_get_output_start_lineno(TSRMLS_C)
+#else
+#      define HTTP_GET_OUTPUT_START() \
+               char *output_start_filename = php_output_get_start_filename(TSRMLS_C); \
+               int output_start_lineno = php_output_get_start_lineno(TSRMLS_C)
+#endif
 #define HTTP_CHECK_HEADERS_SENT(action) \
        if (SG(headers_sent) && !SG(request_info).no_headers) { \
-               char *output_start_filename = php_get_output_start_filename(TSRMLS_C); \
-               int output_start_lineno = php_get_output_start_lineno(TSRMLS_C); \
-                \
+               HTTP_GET_OUTPUT_START(); \
                if (output_start_filename) { \
                        http_error_ex(HE_WARNING, HTTP_E_HEADER, "Cannot modify header information - headers already sent by (output started at %s:%d)", \
                                output_start_filename, output_start_lineno); \
@@ -110,23 +117,6 @@ extern STATUS _http_object_new(zend_object_value *ov, const char *cname_str, uin
                action; \
        }
 
-#define HTTP_CHECK_OPEN_BASEDIR(file, act) \
-       if ((PG(open_basedir) && *PG(open_basedir)) || PG(safe_mode)) \
-       { \
-               const char *tmp = file; \
- \
-               if (!strncasecmp(tmp, "file:", lenof("file:"))) { \
-                       tmp += lenof("file:"); \
-                       while ((tmp - (const char *)file < 7) && (*tmp == '/' || *tmp == '\\')) ++tmp; \
-               } \
- \
-               if (    (tmp != file || !strstr(file, "://")) && \
-                               (!*tmp || php_check_open_basedir(tmp TSRMLS_CC) || \
-                               (PG(safe_mode) && !php_checkuid(tmp, "rb+", CHECKUID_CHECK_MODE_PARAM)))) { \
-                               act; \
-               } \
-       }
-
 #define http_log(f, i, m) _http_log_ex((f), (i), (m) TSRMLS_CC)
 extern void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC);
 
@@ -168,9 +158,9 @@ static inline void _http_sleep(double s)
 #define HTTP_MLLISEC (1000)
 #define HTTP_MCROSEC (1000 * 1000)
 #define HTTP_NANOSEC (1000 * 1000 * 1000)
-#define HTTP_MSEC(s) (s * HTTP_MLLISEC)
-#define HTTP_USEC(s) (s * HTTP_MCROSEC)
-#define HTTP_NSEC(s) (s * HTTP_NANOSEC)
+#define HTTP_MSEC(s) ((long)(s * HTTP_MLLISEC))
+#define HTTP_USEC(s) ((long)(s * HTTP_MCROSEC))
+#define HTTP_NSEC(s) ((long)(s * HTTP_NANOSEC))
 
 #if defined(PHP_WIN32)
        Sleep((DWORD) HTTP_MSEC(s));
@@ -227,7 +217,7 @@ static inline const char *_http_locate_body(const char *message)
                        if (*(msg+1) == '\n') {
                                body = msg + 2;
                                break;
-                       } else if (*(msg+1) == '\r' && *(msg+2) == '\n' && msg != message && *(msg-1) == '\r') {
+                       } else if (*(msg+1) == '\r' && *(msg+2) == '\n') {
                                body = msg + 3;
                                break;
                        }
@@ -248,8 +238,8 @@ static inline const char *_http_locate_eol(const char *line, int *eol_len)
        return eol;
 }
 
-#define convert_to_type(t, z) _convert_to_type((t), (z))
-static inline zval *_convert_to_type(int type, zval *z)
+#define http_zset(t, z) _http_zset((t), (z))
+static inline zval *_http_zset(int type, zval *z)
 {
        if (Z_TYPE_P(z) != type) {
                switch (type) {
@@ -264,12 +254,10 @@ static inline zval *_convert_to_type(int type, zval *z)
        }
        return z;
 }
-#define convert_to_type_ex(t, z, p) _convert_to_type_ex((t), (z), (p))
-static inline zval *_convert_to_type_ex(int type, zval *z, zval **p)
-{
-       if (p) {
-               *p = z;
-       }
+#define http_zsep(t, z) _http_zsep_ex((t), (z), NULL)
+#define http_zsep_ex(t, z, p) _http_zsep_ex((t), (z), (p))
+static inline zval *_http_zsep_ex(int type, zval *z, zval **p) {
+       ZVAL_ADDREF(z);
        if (Z_TYPE_P(z) != type) {
                switch (type) {
                        case IS_NULL:   convert_to_null_ex(&z);         break;
@@ -280,13 +268,11 @@ static inline zval *_convert_to_type_ex(int type, zval *z, zval **p)
                        case IS_ARRAY:  convert_to_array_ex(&z);        break;
                        case IS_OBJECT: convert_to_object_ex(&z);       break;
                }
+       } else {
+               SEPARATE_ZVAL_IF_NOT_REF(&z);
        }
        if (p) {
-               if (*p == z) {
-                       *p = NULL;
-               } else {
-                       *p = z;
-               }
+               *p = z;
        }
        return z;
 }
@@ -322,10 +308,10 @@ typedef struct _HashKey {
 #define array_copy(src, dst) zend_hash_copy(dst, src, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *))
 #define ARRAY_JOIN_STRONLY 1
 #define ARRAY_JOIN_PRETTIFY 2
-#define array_join(src, dst, append, flags) zend_hash_apply_with_arguments(src, (append)?apply_array_append_func:apply_array_merge_func, 2, dst, (int)flags)
+#define array_join(src, dst, append, flags) zend_hash_apply_with_arguments(src HTTP_ZAPI_HASH_TSRMLS_CC, (append)?apply_array_append_func:apply_array_merge_func, 2, dst, (int)flags)
 
-extern int apply_array_append_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key);
-extern int apply_array_merge_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key);
+extern int apply_array_append_func(void *pDest HTTP_ZAPI_HASH_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key);
+extern int apply_array_merge_func(void *pDest HTTP_ZAPI_HASH_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key);
 
 #endif