ZEND_EXTERN_MODULE_GLOBALS(http);
-#ifndef HTTP_CURL_USE_ZEND_MM
-# define HTTP_CURL_USE_ZEND_MM 0
-#endif
-
#if LIBCURL_VERSION_NUM < 0x070c00
# define curl_easy_strerror(code) HTTP_G(request).error
#endif
continue; \
}
-typedef struct _http_curl_conv {
- phpstr *response;
- phpstr *request;
- curl_infotype last_info;
-} http_curl_conv;
-
static const char *const http_request_methods[HTTP_MAX_REQUEST_METHOD + 1];
#define http_curl_getopt(o, k, t) _http_curl_getopt_ex((o), (k), sizeof(k), (t) TSRMLS_CC)
#define http_curl_getopt_ex(o, k, l, t) _http_curl_getopt_ex((o), (k), (l), (t) TSRMLS_CC)
static http_curl_callback_ctx *_http_curl_callback_data(void *data TSRMLS_DC);
-#if HTTP_CURL_USE_ZEND_MM
-static void http_curl_free(void *p) { efree(p); }
-static char *http_curl_strdup(const char *p) { return estrdup(p); }
-static void *http_curl_malloc(size_t s) { return emalloc(s); }
-static void *http_curl_realloc(void *p, size_t s) { return erealloc(p, s); }
-static void *http_curl_calloc(size_t n, size_t s) { return ecalloc(n, s); }
-#endif
-
-/* {{{ STATUS http_request_global_init() */
-STATUS _http_request_global_init(void)
-{
-#if HTTP_CURL_USE_ZEND_MM
- if (CURLE_OK != curl_global_init_mem(CURL_GLOBAL_ALL,
- http_curl_malloc,
- http_curl_free,
- http_curl_realloc,
- http_curl_strdup,
- http_curl_calloc)) {
- return FAILURE;
- }
-#else
- if (CURLE_OK != curl_global_init(CURL_GLOBAL_ALL)) {
- return FAILURE;
- }
-#endif
- return SUCCESS;
-}
-/* }}} */
-
/* {{{ void *http_request_data_copy(int, void *) */
void *_http_request_data_copy(int type, void *data TSRMLS_DC)
{
return data;
}
+ case COPY_CONV:
+ {
+ zend_llist_add_element(&HTTP_G(request).copies.convs, &data);
+ return data;
+ }
+
default:
{
return data;
}
/* }}} */
+/* {{{ _http_request_data_free_conv(http_curl_conv **) */
+void _http_request_data_free_conv(void *conv)
+{
+ efree(*((http_curl_conv **) conv));
+}
+/* }}} */
+
/* {{{ http_request_body *http_request_body_new() */
PHP_HTTP_API http_request_body *_http_request_body_new(TSRMLS_D)
{
CURLFORM_END
);
if (CURLE_OK != err) {
- http_error_ex(E_WARNING, HTTP_E_CURL, "Could not encode post fields: %s", curl_easy_strerror(err));
+ http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Could not encode post fields: %s", curl_easy_strerror(err));
curl_formfree(http_post_data[0]);
return FAILURE;
}
CURLFORM_END
);
if (CURLE_OK != err) {
- http_error_ex(E_WARNING, HTTP_E_CURL, "Could not encode post files: %s", curl_easy_strerror(err));
+ http_error_ex(HE_WARNING, HTTP_E_ENCODING, "Could not encode post files: %s", curl_easy_strerror(err));
curl_formfree(http_post_data[0]);
return FAILURE;
}
} else {
- http_error(E_NOTICE, HTTP_E_PARAM, "Post file array entry misses either 'name', 'type' or 'file' entry");
+ http_error(HE_NOTICE, HTTP_E_INVALID_PARAM, "Post file array entry misses either 'name', 'type' or 'file' entry");
}
}
size_t encoded_len;
if (SUCCESS != http_urlencode_hash_ex(fields, 1, NULL, 0, &encoded, &encoded_len)) {
- http_error(E_WARNING, HTTP_E_ENCODE, "Could not encode post data");
+ http_error(HE_WARNING, HTTP_E_ENCODING, "Could not encode post data");
return FAILURE;
}
if (http_request_method_exists(0, meth, NULL)) {
curl_easy_setopt(ch, CURLOPT_CUSTOMREQUEST, http_request_method_name(meth));
} else {
- http_error_ex(E_WARNING, HTTP_E_CURL, "Unsupported request method: %d", meth);
+ http_error_ex(HE_WARNING, HTTP_E_REQUEST_METHOD, "Unsupported request method: %d", meth);
return FAILURE;
}
break;
break;
default:
- http_error_ex(E_WARNING, HTTP_E_CURL, "Unknown request body type: %d", body->type);
+ /* shouldn't ever happen */
+ http_error_ex(HE_ERROR, 0, "Unknown request body type: %d", body->type);
return FAILURE;
break;
}
}
/* }}} */
+/* {{{ void http_request_conv(CURL *, phpstr *, phpstr *) */
+void _http_request_conv(CURL *ch, phpstr* response, phpstr *request TSRMLS_DC)
+{
+ http_curl_conv *conv = emalloc(sizeof(http_curl_conv));
+ conv->response = response;
+ conv->request = request;
+ conv->last_info = -1;
+ HTTP_CURL_OPT(DEBUGDATA, http_curl_callback_data(http_request_data_copy(COPY_CONV, conv)));
+}
+/* }}} */
+
/* {{{ STATUS http_request_exec(CURL *, HashTable *) */
PHP_HTTP_API STATUS _http_request_exec(CURL *ch, HashTable *info, phpstr *response, phpstr *request TSRMLS_DC)
{
CURLcode result;
- http_curl_conv conv = {response, request, -1};
- HTTP_CURL_OPT(DEBUGDATA, http_curl_callback_data(&conv));
+ http_request_conv(ch, response, request);
/* perform request */
if (CURLE_OK != (result = curl_easy_perform(ch))) {
- http_error_ex(E_WARNING, HTTP_E_CURL, "Could not perform request: %s", curl_easy_strerror(result));
+ http_error_ex(HE_WARNING, HTTP_E_REQUEST, "Could not perform request: %s", curl_easy_strerror(result));
return FAILURE;
} else {
/* get curl info */
if ((clean_curl = (!ch))) {
if (!(ch = curl_easy_init())) {
- http_error(E_WARNING, HTTP_E_CURL, "Could not initialize curl.");
+ http_error(HE_WARNING, HTTP_E_REQUEST, "Could not initialize curl.");
return FAILURE;
}
}
char *http_method;
if (SUCCESS != zend_hash_index_find(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method), (void **) &zmethod)) {
- http_error_ex(E_NOTICE, HTTP_E_PARAM, "Request method with id %lu does not exist", method);
+ http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Request method with id %lu does not exist", method);
return FAILURE;
}
if ( (SUCCESS != zend_hash_index_del(&HTTP_G(request).methods.custom, HTTP_CUSTOM_REQUEST_METHOD(method)))
|| (SUCCESS != zend_hash_del(EG(zend_constants), http_method, strlen(http_method) + 1))) {
- http_error_ex(E_NOTICE, 0, "Could not unregister request method: %s", http_method);
+ http_error_ex(HE_NOTICE, HTTP_E_REQUEST_METHOD, "Could not unregister request method: %s", http_method);
efree(http_method);
return FAILURE;
}