#ifdef HTTP_HAVE_CURL
zend_llist_init(&G->request.copies.strings, sizeof(char *), http_request_data_free_string, 0);
zend_llist_init(&G->request.copies.slists, sizeof(struct curl_slist *), http_request_data_free_slist, 0);
+ zend_llist_init(&G->request.copies.contexts, sizeof(http_curl_callback_ctx *), http_request_data_free_context, 0);
#endif
}
#if LIBCURL_VERSION_NUM < 0x070c00
# define curl_easy_strerror(code) HTTP_G(request).error
-# ifndef curl_multi_strerror
- static char *curl_multi_strerror(int code)
- {
- char message[256] = {0};
- snprintf(message, 255, "Unknown HttpRequestPool error (curl multi code: %d)", code);
- return http_request_data_copy(COPY_STRING, message);
- }
-#endif
#endif
#define HTTP_CURL_INFO(I) HTTP_CURL_INFO_EX(I, I)
static int http_curl_progress_callback(void *, double, double, double, double);
static int http_curl_debug_callback(CURL *, curl_infotype, char *, size_t, void *);
-typedef struct {
- void ***tsrm_ctx;
- void *data;
-} http_curl_callback_ctx;
-
#define HTTP_CURL_CALLBACK_DATA(from, type, var) \
http_curl_callback_ctx *__CTX = (http_curl_callback_ctx *) (from); \
TSRMLS_FETCH_FROM_CTX(__CTX->tsrm_ctx); \
return data;
}
+ case COPY_CONTEXT:
+ {
+ zend_llist_add_element(&HTTP_G(request).copies.contexts, &data);
+ return data;
+ }
+
default:
{
return data;
}
/* }}} */
+/* {{{ _http_request_data_free_context(http_curl_callback_ctx **) */
+void _http_request_data_free_context(void *context)
+{
+ efree(*((http_curl_callback_ctx **) context));
+}
+/* }}} */
+
/* {{{ http_request_body *http_request_body_new() */
PHP_HTTP_API http_request_body *_http_request_body_new(TSRMLS_D)
{
http_curl_callback_ctx *ctx = emalloc(sizeof(http_curl_callback_ctx));
TSRMLS_SET_CTX(ctx->tsrm_ctx);
ctx->data = data;
- return ctx;
+ return http_request_data_copy(COPY_CONTEXT, ctx);
}
/* }}} */
int unfinished;
} http_request_pool;
-#define COPY_STRING 1
-#define COPY_SLIST 2
+typedef struct {
+ void ***tsrm_ctx;
+ void *data;
+} http_curl_callback_ctx;
+
+#define COPY_STRING 1
+#define COPY_SLIST 2
+#define COPY_CONTEXT 3
#define http_request_data_copy(type, data) _http_request_data_copy((type), (data) TSRMLS_CC)
extern void *_http_request_data_copy(int type, void *data TSRMLS_DC);
#define http_request_data_free_string _http_request_data_free_string
extern void _http_request_data_free_string(void *string);
#define http_request_data_free_slist _http_request_data_free_slist
extern void _http_request_data_free_slist(void *list);
+#define http_request_data_free_context _http_request_data_free_context
+extern void _http_request_data_free_context(void *context);
#define http_request_pool_responsehandler _http_request_pool_responsehandler
extern void _http_request_pool_responsehandler(zval **req TSRMLS_DC);