| 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> |
+--------------------------------------------------------------------+
*/
HTTP_END_ARGS;
HTTP_EMPTY_ARGS(enableCookies);
-#if HTTP_CURL_VERSION(7,14,1)
HTTP_BEGIN_ARGS(resetCookies, 0)
HTTP_ARG_VAL(session_only, 0)
HTTP_END_ARGS;
-#endif
+HTTP_EMPTY_ARGS(flushCookies);
HTTP_EMPTY_ARGS(getUrl);
HTTP_BEGIN_ARGS(setUrl, 1)
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);
HTTP_ARG_VAL(method, 0)
HTTP_END_ARGS;
-#if defined(HAVE_CURL_GETFORMDATA) || defined(HAVE_CURL_FORMGET)
+#ifdef HAVE_CURL_FORMGET
HTTP_BEGIN_ARGS(encodeBody, 2)
HTTP_ARG_VAL(fields, 0)
HTTP_ARG_VAL(files, 0)
HTTP_REQUEST_ME(setCookies, ZEND_ACC_PUBLIC)
HTTP_REQUEST_ME(enableCookies, ZEND_ACC_PUBLIC)
-#if HTTP_CURL_VERSION(7,14,1)
HTTP_REQUEST_ME(resetCookies, ZEND_ACC_PUBLIC)
-#endif
+ HTTP_REQUEST_ME(flushCookies, ZEND_ACC_PUBLIC)
HTTP_REQUEST_ME(setMethod, ZEND_ACC_PUBLIC)
HTTP_REQUEST_ME(getMethod, ZEND_ACC_PUBLIC)
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)
HTTP_REQUEST_ALIAS(methodUnregister, http_request_method_unregister)
HTTP_REQUEST_ALIAS(methodName, http_request_method_name)
HTTP_REQUEST_ALIAS(methodExists, http_request_method_exists)
-#if defined(HAVE_CURL_GETFORMDATA) || defined(HAVE_CURL_FORMGET)
+#ifdef HAVE_CURL_FORMGET
HTTP_REQUEST_ALIAS(encodeBody, http_request_body_encode)
#endif
EMPTY_FUNCTION_ENTRY
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
/*
*/
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);
# if HTTP_CURL_VERSION(7,15,2)
zend_declare_class_constant_long(THIS_CE, ZEND_STRS("PROXY_SOCKS4")-1, CURLPROXY_SOCKS4 TSRMLS_CC);
# endif
+#if HTTP_CURL_VERSION(7,18,0)
+ zend_declare_class_constant_long(THIS_CE, ZEND_STRS("PROXY_SOCKS4A")-1, CURLPROXY_SOCKS5 TSRMLS_CC);
+ zend_declare_class_constant_long(THIS_CE, ZEND_STRS("PROXY_SOCKS5_HOSTNAME")-1, CURLPROXY_SOCKS5 TSRMLS_CC);
+#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;
}
}
}
+#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;
+ char *url = http_absolute_url(Z_STRVAL_P(zend_read_property(THIS_CE, getThis(), ZEND_STRS("url")-1, 0 TSRMLS_CC)));
+ if (!url) {
+ return FAILURE;
+ }
+
http_request_reset(obj->request);
+ obj->request->url = url;
HTTP_CHECK_CURL_INIT(obj->request->ch, http_curl_init(obj->request), return FAILURE);
- obj->request->url = http_absolute_url(Z_STRVAL_P(zend_read_property(THIS_CE, getThis(), ZEND_STRS("url")-1, 0 TSRMLS_CC)));
-
switch (obj->request->meth = Z_LVAL_P(zend_read_property(THIS_CE, getThis(), ZEND_STRS("method")-1, 0 TSRMLS_CC)))
{
case HTTP_GET:
if ( (Z_TYPE_P(options) != IS_ARRAY)
|| (SUCCESS != zend_hash_find(Z_ARRVAL_P(options), "onprogress", sizeof("onprogress"), (void *) &entry)
- || (!zval_is_true(*entry)))) {
+ || (!IS_CALLABLE(*entry, 0, NULL)))) {
MAKE_STD_ZVAL(pcb);
array_init(pcb);
ZVAL_ADDREF(getThis());
if ((msg = http_message_parse(PHPSTR_VAL(&obj->request->conv.response), PHPSTR_LEN(&obj->request->conv.response)))) {
zval *message;
- if (zval_is_true(zend_read_property(THIS_CE, getThis(), ZEND_STRS("recordHistory")-1, 0 TSRMLS_CC))) {
+ if (i_zend_is_true(zend_read_property(THIS_CE, getThis(), ZEND_STRS("recordHistory")-1, 0 TSRMLS_CC))) {
zval *hist, *history = zend_read_property(THIS_CE, getThis(), ZEND_STRS("history")-1, 0 TSRMLS_CC);
http_message *response = http_message_parse(PHPSTR_VAL(&obj->request->conv.response), PHPSTR_LEN(&obj->request->conv.response));
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);
}
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);
zend_update_property_string(THIS_CE, getThis(), ZEND_STRS("responseStatus")-1, "" TSRMLS_CC);
/* append request message to history */
- if (zval_is_true(zend_read_property(THIS_CE, getThis(), ZEND_STRS("recordHistory")-1, 0 TSRMLS_CC))) {
+ if (i_zend_is_true(zend_read_property(THIS_CE, getThis(), ZEND_STRS("recordHistory")-1, 0 TSRMLS_CC))) {
http_message *request;
if ((request = http_message_parse(PHPSTR_VAL(&obj->request->conv.request), PHPSTR_LEN(&obj->request->conv.request)))) {
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);
}
static int apply_pretty_key(void *pDest, int num_args, va_list args, zend_hash_key *hash_key)
{
- if (hash_key->nKeyLength > 1) {
+ 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);
}
return ZEND_HASH_APPLY_KEEP;
}
} else if (opts) {
if (prettify_keys) {
- zend_hash_apply_with_arguments(Z_ARRVAL_P(opts), apply_pretty_key, 0);
+ zend_hash_apply_with_arguments(Z_ARRVAL_P(opts) HTTP_ZAPI_HASH_TSRMLS_CC, apply_pretty_key, 0, NULL);
}
ZVAL_ADDREF(opts);
add_assoc_zval_ex(new_opts, key, len, opts);
/* some options need extra attention -- thus cannot use array_merge() directly */
FOREACH_KEYVAL(pos, opts, key, opt) {
if (key.type == HASH_KEY_IS_STRING) {
- if (!strcmp(key.str, "headers")) {
+#define KEYMATCH(k, s) ((sizeof(s)==k.len) && !strcasecmp(k.str, s))
+ if (KEYMATCH(key, "headers")) {
zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "addheaders", NULL, *opt);
- } else if (!strcmp(key.str, "cookies")) {
+ } else if (KEYMATCH(key, "cookies")) {
zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "addcookies", NULL, *opt);
- } else if (!strcmp(key.str, "ssl")) {
+ } else if (KEYMATCH(key, "ssl")) {
zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "addssloptions", NULL, *opt);
- } else if ((!strcasecmp(key.str, "url")) || (!strcasecmp(key.str, "uri"))) {
+ } else if (KEYMATCH(key, "url") || KEYMATCH(key, "uri")) {
zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "seturl", NULL, *opt);
- } else if (!strcmp(key.str, "method")) {
+ } else if (KEYMATCH(key, "method")) {
zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "setmethod", NULL, *opt);
-#if HTTP_CURL_VERSION(7,14,1)
- } else if (!strcmp(key.str, "resetcookies")) {
+ } else if (KEYMATCH(key, "flushcookies")) {
getObject(http_request_object, obj);
- http_request_reset_cookies(obj->request, 0);
-#endif
- } else if (!strcmp(key.str, "enablecookies")) {
+ if (i_zend_is_true(*opt)) {
+ http_request_flush_cookies(obj->request);
+ }
+ } else if (KEYMATCH(key, "resetcookies")) {
+ getObject(http_request_object, obj);
+ http_request_reset_cookies(obj->request, (zend_bool) i_zend_is_true(*opt));
+ } else if (KEYMATCH(key, "enablecookies")) {
getObject(http_request_object, obj);
http_request_enable_cookies(obj->request);
- } else if (!strcasecmp(key.str, "recordHistory")) {
- zend_update_property_bool(THIS_CE, getThis(), ZEND_STRS("recordHistory")-1, 1 TSRMLS_CC);
+ } 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) {
+ zend_hash_del(Z_ARRVAL_P(old_opts), key.str, key.len);
+ }
} else {
ZVAL_ADDREF(*opt);
add_assoc_zval_ex(add_opts, key.str, key.len, *opt);
}
/* }}} */
+/* {{{ proto bool HttpRequest::flushCookies()
+ Flush internal cookies to the cookiestore file */
+PHP_METHOD(HttpRequest, flushCookies)
+{
+ NO_ARGS {
+ getObject(http_request_object, obj);
+ RETURN_SUCCESS(http_request_flush_cookies(obj->request));
+ }
+}
+/* }}} */
+
/* {{{ proto bool HttpRequest::setUrl(string url)
Set the request URL. */
PHP_METHOD(HttpRequest, setUrl)
zend_update_property_string(THIS_CE, getThis(), ZEND_STRS("queryData")-1, query_data TSRMLS_CC);
efree(query_data);
} else {
- zval *orig = qdata;
+ zval *data = http_zsep(IS_STRING, qdata);
- convert_to_string_ex(&qdata);
- zend_update_property_stringl(THIS_CE, getThis(), ZEND_STRS("queryData")-1, Z_STRVAL_P(qdata), Z_STRLEN_P(qdata) TSRMLS_CC);
- if (orig != qdata) {
- zval_ptr_dtor(&qdata);
- }
+ zend_update_property_stringl(THIS_CE, getThis(), ZEND_STRS("queryData")-1, Z_STRVAL_P(data), Z_STRLEN_P(data) TSRMLS_CC);
+ zval_ptr_dtor(&data);
}
RETURN_TRUE;
}
}
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);
}
}
if (allowed_extras_array) {
allowed_extras = ecalloc(zend_hash_num_elements(Z_ARRVAL_P(allowed_extras_array)) + 1, sizeof(char *));
FOREACH_VAL(pos, allowed_extras_array, entry) {
- ZVAL_ADDREF(*entry);
- convert_to_string_ex(entry);
- allowed_extras[i++] = estrndup(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry));
- zval_ptr_dtor(entry);
+ zval *data = http_zsep(IS_STRING, *entry);
+ allowed_extras[i++] = estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data));
+ zval_ptr_dtor(&data);
}
}
zval **single_header;
FOREACH_VAL(pos2, *header, single_header) {
- ZVAL_ADDREF(*single_header);
- convert_to_string_ex(single_header);
- if (http_parse_cookie_ex(&list, Z_STRVAL_PP(single_header), flags, allowed_extras)) {
+ zval *data = http_zsep(IS_STRING, *single_header);
+
+ if (http_parse_cookie_ex(&list, Z_STRVAL_P(data), flags, allowed_extras)) {
zval *cookie;
MAKE_STD_ZVAL(cookie);
add_next_index_zval(return_value, cookie);
http_cookie_list_dtor(&list);
}
- zval_ptr_dtor(single_header);
+ zval_ptr_dtor(&data);
}
} else {
- ZVAL_ADDREF(*header);
- convert_to_string_ex(header);
- if (http_parse_cookie_ex(&list, Z_STRVAL_PP(header), flags, allowed_extras)) {
+ zval *data = http_zsep(IS_STRING, *header);
+ if (http_parse_cookie_ex(&list, Z_STRVAL_P(data), flags, allowed_extras)) {
zval *cookie;
MAKE_STD_ZVAL(cookie);
add_next_index_zval(return_value, cookie);
http_cookie_list_dtor(&list);
}
- zval_ptr_dtor(header);
+ zval_ptr_dtor(&data);
}
}
}
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();
}
}
/* }}} */
+/* {{{ 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)