branch off v1 as R_1_7
[m6w6/ext-http] / http_request_object.c
index 1795e37a30f7c29157bc578870f5d869c82c7cf5..f4f27cf0718892e48c918e6b5685c3ee28d1165e 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>            |
     +--------------------------------------------------------------------+
 */
 
@@ -170,6 +170,11 @@ HTTP_BEGIN_ARGS(getResponseInfo, 0)
        HTTP_ARG_VAL(name, 0)
 HTTP_END_ARGS;
 
+HTTP_EMPTY_ARGS(getMessageClass);
+HTTP_BEGIN_ARGS(setMessageClass, 1)
+       HTTP_ARG_VAL(message_class_name, 0)
+HTTP_END_ARGS;
+
 HTTP_EMPTY_ARGS(getResponseMessage);
 HTTP_EMPTY_ARGS(getRawResponseMessage);
 HTTP_EMPTY_ARGS(getRequestMessage);
@@ -322,6 +327,9 @@ zend_function_entry http_request_object_fe[] = {
        HTTP_REQUEST_ME(getHistory, ZEND_ACC_PUBLIC)
        HTTP_REQUEST_ME(clearHistory, ZEND_ACC_PUBLIC)
 
+       HTTP_REQUEST_ME(getMessageClass, ZEND_ACC_PUBLIC)
+       HTTP_REQUEST_ME(setMessageClass, ZEND_ACC_PUBLIC)
+
        HTTP_REQUEST_ME(factory, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
 
        HTTP_REQUEST_ALIAS(get, http_get)
@@ -364,6 +372,7 @@ PHP_MINIT_FUNCTION(http_request_object)
        zend_declare_property_string(THIS_CE, ZEND_STRS("putData")-1, "", ZEND_ACC_PRIVATE TSRMLS_CC);
        zend_declare_property_null(THIS_CE, ZEND_STRS("history")-1, ZEND_ACC_PRIVATE TSRMLS_CC);
        zend_declare_property_bool(THIS_CE, ZEND_STRS("recordHistory")-1, 0, ZEND_ACC_PUBLIC TSRMLS_CC);
+       zend_declare_property_string(THIS_CE, ZEND_STRS("messageClass")-1, "", ZEND_ACC_PRIVATE TSRMLS_CC);
 
 #ifndef WONKY
        /*
@@ -429,6 +438,9 @@ PHP_MINIT_FUNCTION(http_request_object)
        */
        zend_declare_class_constant_long(THIS_CE, ZEND_STRS("AUTH_BASIC")-1, CURLAUTH_BASIC TSRMLS_CC);
        zend_declare_class_constant_long(THIS_CE, ZEND_STRS("AUTH_DIGEST")-1, CURLAUTH_DIGEST TSRMLS_CC);
+#if HTTP_CURL_VERSION(7,19,3)
+       zend_declare_class_constant_long(THIS_CE, ZEND_STRS("AUTH_DIGEST_IE")-1, CURLAUTH_DIGEST_IE TSRMLS_CC);
+#endif
        zend_declare_class_constant_long(THIS_CE, ZEND_STRS("AUTH_NTLM")-1, CURLAUTH_NTLM TSRMLS_CC);
        zend_declare_class_constant_long(THIS_CE, ZEND_STRS("AUTH_GSSNEG")-1, CURLAUTH_GSSNEGOTIATE TSRMLS_CC);
        zend_declare_class_constant_long(THIS_CE, ZEND_STRS("AUTH_ANY")-1, CURLAUTH_ANY TSRMLS_CC);
@@ -445,7 +457,19 @@ PHP_MINIT_FUNCTION(http_request_object)
 #endif
        zend_declare_class_constant_long(THIS_CE, ZEND_STRS("PROXY_SOCKS5")-1, CURLPROXY_SOCKS5 TSRMLS_CC);
        zend_declare_class_constant_long(THIS_CE, ZEND_STRS("PROXY_HTTP")-1, CURLPROXY_HTTP TSRMLS_CC);
+#      if HTTP_CURL_VERSION(7,19,4)
+       zend_declare_class_constant_long(THIS_CE, ZEND_STRS("PROXY_HTTP_1_0")-1, CURLPROXY_HTTP_1_0 TSRMLS_CC);
+#      endif
 #endif /* WONKY */
+
+       /*
+       * Post Redirection Constants
+       */
+#if HTTP_CURL_VERSION(7,19,1)
+       zend_declare_class_constant_long(THIS_CE, ZEND_STRS("POSTREDIR_301")-1, CURL_REDIR_POST_301 TSRMLS_CC);
+       zend_declare_class_constant_long(THIS_CE, ZEND_STRS("POSTREDIR_302")-1, CURL_REDIR_POST_302 TSRMLS_CC);
+       zend_declare_class_constant_long(THIS_CE, ZEND_STRS("POSTREDIR_ALL")-1, CURL_REDIR_POST_ALL TSRMLS_CC);
+#endif
        
        return SUCCESS;
 }
@@ -468,9 +492,14 @@ zend_object_value _http_request_object_new_ex(zend_class_entry *ce, CURL *ch, ht
                *ptr = o;
        }
 
+#ifdef ZEND_ENGINE_2_4
+       zend_object_std_init(o, ce TSRMLS_CC);
+       object_properties_init(o, ce);
+#else
        ALLOC_HASHTABLE(OBJ_PROP(o));
        zend_hash_init(OBJ_PROP(o), zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0);
        zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+#endif
 
        ov.handle = putObject(http_request_object, o);
        ov.handlers = &http_request_object_handlers;
@@ -550,6 +579,19 @@ static inline void _http_request_object_check_request_content_type(zval *this_pt
        }
 }
 
+#define http_request_object_message(zo, msg) _http_request_object_message((zo), (msg) TSRMLS_CC)
+static inline zend_object_value _http_request_object_message(zval *this_ptr, http_message *msg TSRMLS_DC)
+{
+       zend_object_value ov;
+       zval *zcn = zend_read_property(THIS_CE, getThis(), ZEND_STRS("messageClass")-1, 0 TSRMLS_CC);
+
+       if (Z_STRLEN_P(zcn) && (SUCCESS == http_object_new(&ov, Z_STRVAL_P(zcn), Z_STRLEN_P(zcn), _http_message_object_new_ex, http_message_object_ce, msg, NULL))) {
+               return ov;
+       } else {
+               return http_message_object_new_ex(http_message_object_ce, msg, NULL);
+       }
+}
+
 STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ptr TSRMLS_DC)
 {
        STATUS status = SUCCESS;
@@ -641,7 +683,7 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_
                        
                        if (    (Z_TYPE_P(options) != IS_ARRAY)
                                ||      (SUCCESS != zend_hash_find(Z_ARRVAL_P(options), "onprogress", sizeof("onprogress"), (void *) &entry)
-                               ||      (!IS_CALLABLE(*entry, 0, NULL)))) {
+                               ||      (!HTTP_IS_CALLABLE(*entry, 0, NULL)))) {
                                MAKE_STD_ZVAL(pcb);
                                array_init(pcb);
                                ZVAL_ADDREF(getThis());
@@ -682,7 +724,7 @@ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this
                        http_message *request = http_message_parse(PHPSTR_VAL(&obj->request->conv.request), PHPSTR_LEN(&obj->request->conv.request));
                        
                        MAKE_STD_ZVAL(hist);
-                       ZVAL_OBJVAL(hist, http_message_object_new_ex(http_message_object_ce, http_message_interconnect(response, request), NULL), 0);
+                       ZVAL_OBJVAL(hist, http_request_object_message(getThis(), http_message_interconnect(response, request)), 0);
                        if (Z_TYPE_P(history) == IS_OBJECT) {
                                http_message_object_prepend(hist, history);
                        }
@@ -694,7 +736,7 @@ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this
                zend_update_property_string(THIS_CE, getThis(), ZEND_STRS("responseStatus")-1, STR_PTR(msg->http.info.response.status) TSRMLS_CC);
 
                MAKE_STD_ZVAL(message);
-               ZVAL_OBJVAL(message, http_message_object_new_ex(http_message_object_ce, msg, NULL), 0);
+               ZVAL_OBJVAL(message, http_request_object_message(getThis(), msg), 0);
                zend_update_property(THIS_CE, getThis(), ZEND_STRS("responseMessage")-1, message TSRMLS_CC);
                zval_ptr_dtor(&message);
 
@@ -719,7 +761,7 @@ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this
                                zval *hist, *history = zend_read_property(THIS_CE, getThis(), ZEND_STRS("history")-1, 0 TSRMLS_CC);
                                
                                MAKE_STD_ZVAL(hist);
-                               ZVAL_OBJVAL(hist, http_message_object_new_ex(http_message_object_ce, request, NULL), 0);
+                               ZVAL_OBJVAL(hist, http_request_object_message(getThis(), request), 0);
                                if (Z_TYPE_P(history) == IS_OBJECT) {
                                        http_message_object_prepend(hist, history);
                                }
@@ -746,8 +788,12 @@ STATUS _http_request_object_responsehandler(http_request_object *obj, zval *this
        
        return ret;
 }
-
-static int apply_pretty_key(void *pDest, int num_args, va_list args, zend_hash_key *hash_key)
+#ifdef ZEND_ENGINE_2_4
+#      define APK_DC TSRMLS_DC
+#else
+#      define APK_DC
+#endif
+static int apply_pretty_key(void *pDest APK_DC, int num_args, va_list args, zend_hash_key *hash_key)
 {
        if (hash_key->arKey && hash_key->nKeyLength > 1) {
                hash_key->h = zend_hash_func(pretty_key(hash_key->arKey, hash_key->nKeyLength - 1, 1, 0), hash_key->nKeyLength);
@@ -923,6 +969,8 @@ PHP_METHOD(HttpRequest, setOptions)
                                http_request_enable_cookies(obj->request);
                        } else if (KEYMATCH(key, "recordHistory")) {
                                zend_update_property(THIS_CE, getThis(), ZEND_STRS("recordHistory")-1, *opt TSRMLS_CC);
+                       } else if (KEYMATCH(key, "messageClass")) {
+                               zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "setmessageclass", NULL, *opt);
                        } else if (Z_TYPE_PP(opt) == IS_NULL) {
                                old_opts = zend_read_property(THIS_CE, getThis(), ZEND_STRS("options")-1, 0 TSRMLS_CC);
                                if (Z_TYPE_P(old_opts) == IS_ARRAY) {
@@ -1314,14 +1362,14 @@ PHP_METHOD(HttpRequest, addBody)
        }
        
        if (data_len) {
-               zval *data = zend_read_property(THIS_CE, getThis(), ZEND_STRS("rrequestBody")-1, 0 TSRMLS_CC);
+               zval *data = zend_read_property(THIS_CE, getThis(), ZEND_STRS("requestBody")-1, 0 TSRMLS_CC);
                
                if (Z_STRLEN_P(data)) {
                        Z_STRVAL_P(data) = erealloc(Z_STRVAL_P(data), (Z_STRLEN_P(data) += data_len) + 1);
                        Z_STRVAL_P(data)[Z_STRLEN_P(data)] = '\0';
                        memcpy(Z_STRVAL_P(data) + Z_STRLEN_P(data) - data_len, raw_data, data_len);
                } else {
-                       zend_update_property_stringl(THIS_CE, getThis(), ZEND_STRS("putData")-1, raw_data, data_len TSRMLS_CC);
+                       zend_update_property_stringl(THIS_CE, getThis(), ZEND_STRS("requestBody")-1, raw_data, data_len TSRMLS_CC);
                }
        }
        
@@ -1749,7 +1797,7 @@ PHP_METHOD(HttpRequest, getRequestMessage)
 
                SET_EH_THROW_HTTP();
                if ((msg = http_message_parse(PHPSTR_VAL(&obj->request->conv.request), PHPSTR_LEN(&obj->request->conv.request)))) {
-                       RETVAL_OBJVAL(http_message_object_new_ex(http_message_object_ce, msg, NULL), 0);
+                       RETVAL_OBJVAL(http_request_object_message(getThis(), msg), 0);
                }
                SET_EH_NORMAL();
        }
@@ -1820,6 +1868,31 @@ PHP_METHOD(HttpRequest, clearHistory)
 }
 /* }}} */
 
+/* {{{ proto string HttpRequest::getMessageClass()
+       Get the message class name. */
+PHP_METHOD(HttpRequest, getMessageClass)
+{
+       NO_ARGS;
+
+       if (return_value_used) {
+               RETURN_PROP("messageClass");
+       }
+}
+/* }}} */
+
+/* {{{ proto void setMessageClass(string class_name)
+       Set the message class name. */
+PHP_METHOD(HttpRequest, setMessageClass)
+{
+       char *cn;
+       int cl;
+
+       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &cn, &cl)) {
+               zend_update_property_stringl(THIS_CE, getThis(), ZEND_STRS("messageClass")-1, cn, cl TSRMLS_CC);
+       }
+}
+/* }}} */
+
 /* {{{ proto HttpMessage HttpRequest::send()
        Send the HTTP request. */
 PHP_METHOD(HttpRequest, send)