+static int http_curl_raw_callback(CURL *, curl_infotype, char *, size_t, void *);
+static int http_curl_dummy_callback(char *data, size_t n, size_t l, void *s) { return n*l; }
+
+#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); \
+ type (var) = (type) (__CTX->data)
+
+#define http_curl_callback_data(data) _http_curl_callback_data((data) TSRMLS_CC)
+static http_curl_callback_ctx *_http_curl_callback_data(void *data TSRMLS_DC);
+
+
+/* {{{ void *http_request_data_copy(int, void *) */
+void *_http_request_data_copy(int type, void *data TSRMLS_DC)
+{
+ switch (type)
+ {
+ case COPY_STRING:
+ {
+ char *new_str = estrdup(data);
+ zend_llist_add_element(&HTTP_G(request).copies.strings, &new_str);
+ return new_str;
+ }
+
+ case COPY_SLIST:
+ {
+ zend_llist_add_element(&HTTP_G(request).copies.slists, &data);
+ return data;
+ }
+
+ case COPY_CONTEXT:
+ {
+ zend_llist_add_element(&HTTP_G(request).copies.contexts, &data);
+ return data;
+ }
+
+ case COPY_CONV:
+ {
+ zend_llist_add_element(&HTTP_G(request).copies.convs, &data);
+ return data;
+ }
+
+ default:
+ {
+ return data;
+ }
+ }
+}
+/* }}} */
+
+/* {{{ void http_request_data_free_string(char **) */
+void _http_request_data_free_string(void *string)
+{
+ efree(*((char **)string));
+}
+/* }}} */
+
+/* {{{ void http_request_data_free_slist(struct curl_slist **) */
+void _http_request_data_free_slist(void *list)
+{
+ curl_slist_free_all(*((struct curl_slist **) list));
+}
+/* }}} */
+
+/* {{{ _http_request_data_free_context(http_curl_callback_ctx **) */
+void _http_request_data_free_context(void *context)
+{
+ efree(*((http_curl_callback_ctx **) context));
+}
+/* }}} */