* add a real separator vs. a type juggler
[m6w6/ext-http] / php_http_misc.h
index 1cac48b266d0f543ee51fd43fefb18881952d5a7..a07f32fc83b835ccd6971088cc3837a9a8329a57 100644 (file)
@@ -158,7 +158,7 @@ static inline const char *php_http_locate_bin_eol(const char *bin, size_t len, i
                Z_ARRVAL_P(zv) = (ht); \
        }
 
-static inline zval *php_http_zsep(int type, zval *z)
+static inline zval *php_http_ztyp(int type, zval *z)
 {
        SEPARATE_ARG_IF_REF(z);
        if (Z_TYPE_P(z) != type) {
@@ -175,6 +175,26 @@ static inline zval *php_http_zsep(int type, zval *z)
        return z;
 }
 
+static inline zval *php_http_zsep(zend_bool add_ref, int type, zval *z) {
+       if (add_ref) {
+               Z_ADDREF_P(z);
+       }
+       if (Z_TYPE_P(z) != type) {
+               switch (type) {
+                       case IS_NULL:   convert_to_null_ex(&z);         break;
+                       case IS_BOOL:   convert_to_boolean_ex(&z);      break;
+                       case IS_LONG:   convert_to_long_ex(&z);         break;
+                       case IS_DOUBLE: convert_to_double_ex(&z);       break;
+                       case IS_STRING: convert_to_string_ex(&z);       break;
+                       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);
+       }
+       return z;
+}
+
 
 /* return bool (v == SUCCESS) */
 #define RETVAL_SUCCESS(v) RETVAL_BOOL(SUCCESS == (v))
@@ -275,6 +295,15 @@ static inline zval *php_http_zsep(int type, zval *z)
                php_ ##name## _class_entry->ce_flags |= flags;  \
        }
 
+#define PHP_HTTP_REGISTER_INTERFACE(ns, ifacename, name, flags) \
+       { \
+               zend_class_entry ce; \
+               memset(&ce, 0, sizeof(zend_class_entry)); \
+               INIT_NS_CLASS_ENTRY(ce, #ns, #ifacename, php_ ##name## _method_entry); \
+               php_ ##name## _class_entry = zend_register_internal_interface(&ce TSRMLS_CC); \
+               php_ ##name## _class_entry->ce_flags |= flags; \
+       }
+
 #define PHP_HTTP_REGISTER_EXCEPTION(classname, cename, parent) \
        { \
                zend_class_entry ce; \
@@ -323,6 +352,12 @@ static inline zval *php_http_zsep(int type, zval *z)
                                ZEND_ARG_PASS_INFO(0) \
                                ZEND_ARG_PASS_INFO(1) \
                        ZEND_END_ARG_INFO(); \
+\
+                       ZEND_BEGIN_ARG_INFO(http_arg_pass_ref_3, 0) \
+                       ZEND_ARG_PASS_INFO(0) \
+                       ZEND_ARG_PASS_INFO(0) \
+                       ZEND_ARG_PASS_INFO(1) \
+                       ZEND_END_ARG_INFO(); \
 \
                        ZEND_BEGIN_ARG_INFO(http_arg_pass_ref_4, 0) \
                                ZEND_ARG_PASS_INFO(0) \
@@ -343,19 +378,19 @@ typedef struct php_http_array_hashkey {
 } php_http_array_hashkey_t;
 #define php_http_array_hashkey_init(dup) {NULL, 0, 0, (dup), 0}
 
-#define FOREACH_VAL(pos, array, val) FOREACH_HASH_VAL(pos, Z_ARRVAL_P(array), val)
+#define FOREACH_VAL(pos, array, val) FOREACH_HASH_VAL(pos, HASH_OF(array), val)
 #define FOREACH_HASH_VAL(pos, hash, val) \
        for (   zend_hash_internal_pointer_reset_ex(hash, &pos); \
                        zend_hash_get_current_data_ex(hash, (void *) &val, &pos) == SUCCESS; \
                        zend_hash_move_forward_ex(hash, &pos))
 
-#define FOREACH_KEY(pos, array, key) FOREACH_HASH_KEY(pos, Z_ARRVAL_P(array), key)
+#define FOREACH_KEY(pos, array, key) FOREACH_HASH_KEY(pos, HASH_OF(array), key)
 #define FOREACH_HASH_KEY(pos, hash, _key) \
        for (   zend_hash_internal_pointer_reset_ex(hash, &pos); \
                        ((_key).type = zend_hash_get_current_key_ex(hash, &(_key).str, &(_key).len, &(_key).num, (zend_bool) (_key).dup, &pos)) != HASH_KEY_NON_EXISTANT; \
                        zend_hash_move_forward_ex(hash, &pos)) \
 
-#define FOREACH_KEYVAL(pos, array, key, val) FOREACH_HASH_KEYVAL(pos, Z_ARRVAL_P(array), key, val)
+#define FOREACH_KEYVAL(pos, array, key, val) FOREACH_HASH_KEYVAL(pos, HASH_OF(array), key, val)
 #define FOREACH_HASH_KEYVAL(pos, hash, _key, val) \
        for (   zend_hash_internal_pointer_reset_ex(hash, &pos); \
                        ((_key).type = zend_hash_get_current_key_ex(hash, &(_key).str, &(_key).len, &(_key).num, (zend_bool) (_key).dup, &pos)) != HASH_KEY_NON_EXISTANT && \
@@ -404,6 +439,7 @@ extern void php_http_error(long type TSRMLS_DC, long code, const char *format, .
 #define HE_ERROR       E_ERROR TSRMLS_CC
 
 typedef enum php_http_error {
+       PHP_HTTP_E_UNKNOWN = 0,
        PHP_HTTP_E_RUNTIME,
        PHP_HTTP_E_INVALID_PARAM,
        PHP_HTTP_E_HEADER,
@@ -411,9 +447,12 @@ typedef enum php_http_error {
        PHP_HTTP_E_REQUEST_METHOD,
        PHP_HTTP_E_MESSAGE,
        PHP_HTTP_E_MESSAGE_TYPE,
+       PHP_HTTP_E_MESSAGE_BODY,
        PHP_HTTP_E_ENCODING,
        PHP_HTTP_E_REQUEST,
        PHP_HTTP_E_REQUEST_POOL,
+       PHP_HTTP_E_REQUEST_DATASHARE,
+       PHP_HTTP_E_REQUEST_FACTORY,
        PHP_HTTP_E_SOCKET,
        PHP_HTTP_E_RESPONSE,
        PHP_HTTP_E_URL,
@@ -421,42 +460,7 @@ typedef enum php_http_error {
        PHP_HTTP_E_COOKIE,
 } php_http_error_t;
 
-/* CURL */
-
-#define PHP_HTTP_CURL_OPT(OPTION, p) curl_easy_setopt((request->ch), OPTION, (p))
-
-#define PHP_HTTP_CURL_OPT_STRING(OPTION, ldiff, obdc) \
-       { \
-               char *K = #OPTION; \
-               PHP_HTTP_CURL_OPT_STRING_EX(K+lenof("CURLOPT_KEY")+ldiff, OPTION, obdc); \
-       }
-#define PHP_HTTP_CURL_OPT_STRING_EX(keyname, optname, obdc) \
-       if (!strcasecmp(key.str, keyname)) { \
-               zval *copy = php_http_request_option_cache(request, keyname, strlen(keyname)+1, 0, php_http_zsep(IS_STRING, *param)); \
-               if (obdc) { \
-                       if (SUCCESS != php_check_open_basedir(Z_STRVAL_P(copy) TSRMLS_CC)) { \
-                               return FAILURE; \
-                       } \
-               } \
-               PHP_HTTP_CURL_OPT(optname, Z_STRVAL_P(copy)); \
-               zval_ptr_dtor(&copy); \
-               continue; \
-       }
-#define PHP_HTTP_CURL_OPT_LONG(OPTION, ldiff) \
-       { \
-               char *K = #OPTION; \
-               PHP_HTTP_CURL_OPT_LONG_EX(K+lenof("CURLOPT_KEY")+ldiff, OPTION); \
-       }
-#define PHP_HTTP_CURL_OPT_LONG_EX(keyname, optname) \
-       if (!strcasecmp(key.str, keyname)) { \
-               zval *copy = php_http_zsep(IS_LONG, *param); \
-               PHP_HTTP_CURL_OPT(optname, Z_LVAL_P(copy)); \
-               zval_ptr_dtor(&copy); \
-               continue; \
-       }
-
 #endif
-
 /*
  * Local variables:
  * tab-width: 4