X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_object.c;h=f4f27cf0718892e48c918e6b5685c3ee28d1165e;hp=51e13a6964fd67cbd4b3a0ef40c32f74257161b3;hb=refs%2Fheads%2Fv1.7.x;hpb=4a8fc95fc8796d7e1f2394c63345fa9def53e821 diff --git a/http_request_object.c b/http_request_object.c index 51e13a6..f4f27cf 100644 --- a/http_request_object.c +++ b/http_request_object.c @@ -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 | + | Copyright (c) 2004-2010, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -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) { @@ -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)