2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2011, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 #include "php_http_api.h"
15 #if PHP_HTTP_HAVE_CURL
17 typedef struct php_http_curl_client_datashare
{
19 } php_http_curl_client_datashare_t
;
22 static void *php_http_curlsh_ctor(void *opaque TSRMLS_DC
)
24 return curl_share_init();
27 static void php_http_curlsh_dtor(void *opaque
, void *handle TSRMLS_DC
)
29 curl_share_cleanup(handle
);
33 /* datashare handler ops */
35 static php_http_client_datashare_t
*php_http_curl_client_datashare_init(php_http_client_datashare_t
*h
, void *handle
)
37 php_http_curl_client_datashare_t
*curl
;
38 TSRMLS_FETCH_FROM_CTX(h
->ts
);
40 if (!handle
&& !(handle
= php_http_resource_factory_handle_ctor(h
->rf TSRMLS_CC
))) {
41 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "could not initialize curl share handle");
45 curl
= ecalloc(1, sizeof(*curl
));
46 curl
->handle
= handle
;
52 static void php_http_curl_client_datashare_dtor(php_http_client_datashare_t
*h
)
54 php_http_curl_client_datashare_t
*curl
= h
->ctx
;
55 TSRMLS_FETCH_FROM_CTX(h
->ts
);
57 php_http_resource_factory_handle_dtor(h
->rf
, curl
->handle TSRMLS_CC
);
63 static STATUS
php_http_curl_client_datashare_attach(php_http_client_datashare_t
*h
, php_http_client_t
*r
)
66 php_http_curl_client_datashare_t
*curl
= h
->ctx
;
67 php_http_curl_client_t
*recurl
= r
->ctx
;
68 TSRMLS_FETCH_FROM_CTX(h
->ts
);
70 if (r
->ops
!= php_http_curl_client_get_ops()) {
71 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "Cannot attach a non-curl client to this datashare");
75 if (CURLE_OK
!= (rc
= curl_easy_setopt(recurl
->handle
, CURLOPT_SHARE
, curl
->handle
))) {
76 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "Could not attach request to the datashare: %s", curl_easy_strerror(rc
));
82 static STATUS
php_http_curl_client_datashare_detach(php_http_client_datashare_t
*h
, php_http_client_t
*r
)
85 php_http_curl_client_t
*recurl
= r
->ctx
;
86 TSRMLS_FETCH_FROM_CTX(h
->ts
);
89 if (r
->ops
!= php_http_curl_client_get_ops()) {
90 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "Cannot attach a non-curl client to this datashare");
94 if (CURLE_OK
!= (rc
= curl_easy_setopt(recurl
->handle
, CURLOPT_SHARE
, NULL
))) {
95 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "Could not detach request from the datashare: %s", curl_share_strerror(rc
));
101 static STATUS
php_http_curl_client_datashare_setopt(php_http_client_datashare_t
*h
, php_http_client_datashare_setopt_opt_t opt
, void *arg
)
104 php_http_curl_client_datashare_t
*curl
= h
->ctx
;
107 case PHP_HTTP_CLIENT_DATASHARE_OPT_COOKIES
:
108 if (CURLSHE_OK
!= (rc
= curl_share_setopt(curl
->handle
, *((zend_bool
*) arg
) ? CURLSHOPT_SHARE
: CURLSHOPT_UNSHARE
, CURL_LOCK_DATA_COOKIE
))) {
109 TSRMLS_FETCH_FROM_CTX(h
->ts
);
111 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "Could not %s sharing of cookie data: %s", *((zend_bool
*) arg
) ? "enable" : "disable", curl_share_strerror(rc
));
116 case PHP_HTTP_CLIENT_DATASHARE_OPT_RESOLVER
:
117 if (CURLSHE_OK
!= (rc
= curl_share_setopt(curl
->handle
, *((zend_bool
*) arg
) ? CURLSHOPT_SHARE
: CURLSHOPT_UNSHARE
, CURL_LOCK_DATA_DNS
))) {
118 TSRMLS_FETCH_FROM_CTX(h
->ts
);
120 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "Could not %s sharing of resolver data: %s", *((zend_bool
*) arg
) ? "enable" : "disable", curl_share_strerror(rc
));
125 #if PHP_HTTP_CURL_VERSION(7,23,0)
126 case PHP_HTTP_CLIENT_DATASHARE_OPT_SSLSESSIONS
:
127 if (CURLSHE_OK
!= (rc
= curl_share_setopt(curl
->handle
, *((zend_bool
*) arg
) ? CURLSHOPT_SHARE
: CURLSHOPT_UNSHARE
, CURL_LOCK_DATA_SSL_SESSION
))) {
128 TSRMLS_FETCH_FROM_CTX(h
->ts
);
130 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT_DATASHARE
, "Could not %s sharing of SSL session data: %s", *((zend_bool
*) arg
) ? "enable" : "disable", curl_share_strerror(rc
));
143 static php_http_resource_factory_ops_t php_http_curlsh_resource_factory_ops
= {
144 php_http_curlsh_ctor
,
149 static php_http_client_datashare_ops_t php_http_curl_client_datashare_ops
= {
150 &php_http_curlsh_resource_factory_ops
,
151 php_http_curl_client_datashare_init
,
153 php_http_curl_client_datashare_dtor
,
155 php_http_curl_client_datashare_attach
,
156 php_http_curl_client_datashare_detach
,
157 php_http_curl_client_datashare_setopt
,
158 (php_http_new_t
) php_http_curl_client_datashare_object_new_ex
,
159 php_http_curl_client_datashare_get_class_entry
162 PHP_HTTP_API php_http_client_datashare_ops_t
*php_http_curl_client_datashare_get_ops(void)
164 return &php_http_curl_client_datashare_ops
;
167 #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpClientDataShare, method, 0, req_args)
168 #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpClientDataShare, method, 0)
169 #define PHP_HTTP_RSHARE_ME(method, visibility) PHP_ME(HttpClientDataShare, method, PHP_HTTP_ARGS(HttpClientDataShare, method), visibility)
171 static zend_class_entry
*php_http_curl_client_datashare_class_entry
;
173 zend_class_entry
*php_http_curl_client_datashare_get_class_entry(void)
175 return php_http_curl_client_datashare_class_entry
;
178 static zend_function_entry php_http_curl_client_datashare_method_entry
[] = {
182 zend_object_value
php_http_curl_client_datashare_object_new(zend_class_entry
*ce TSRMLS_DC
)
184 return php_http_curl_client_datashare_object_new_ex(ce
, NULL
, NULL TSRMLS_CC
);
187 zend_object_value
php_http_curl_client_datashare_object_new_ex(zend_class_entry
*ce
, php_http_client_datashare_t
*share
, php_http_client_datashare_object_t
**ptr TSRMLS_DC
)
189 zend_object_value ov
;
190 php_http_client_datashare_object_t
*o
;
192 o
= ecalloc(1, sizeof(*o
));
193 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
194 object_properties_init((zend_object
*) o
, ce
);
199 o
->share
= php_http_client_datashare_init(NULL
, &php_http_curl_client_datashare_ops
, NULL
, NULL TSRMLS_CC
);
206 ov
.handle
= zend_objects_store_put(o
, NULL
, php_http_client_datashare_object_free
, NULL TSRMLS_CC
);
207 ov
.handlers
= php_http_client_datashare_get_object_handlers();
213 PHP_MINIT_FUNCTION(http_curl_client_datashare
)
215 if (SUCCESS
!= php_http_persistent_handle_provide(ZEND_STRL("http_client_datashare.curl"), &php_http_curlsh_resource_factory_ops
, NULL
, NULL
)) {
219 PHP_HTTP_REGISTER_CLASS(http
\\Curl
\\Client
, DataShare
, http_curl_client_datashare
, php_http_client_datashare_get_class_entry(), 0);
220 php_http_curl_client_datashare_class_entry
->create_object
= php_http_curl_client_datashare_object_new
;
224 #endif /* PHP_HTTP_HAVE_CURL */
231 * vim600: noet sw=4 ts=4 fdm=marker
232 * vim<600: noet sw=4 ts=4