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 #include <ext/spl/spl_observer.h>
17 PHP_HTTP_API php_http_client_t
*php_http_client_init(php_http_client_t
*h
, php_http_client_ops_t
*ops
, php_http_resource_factory_t
*rf
, void *init_arg TSRMLS_DC
)
19 php_http_client_t
*free_h
= NULL
;
22 free_h
= h
= emalloc(sizeof(*h
));
24 memset(h
, 0, sizeof(*h
));
27 h
->rf
= rf
? rf
: php_http_resource_factory_init(NULL
, h
->ops
->rsrc
, h
, NULL
);
28 h
->buffer
= php_http_buffer_init(NULL
);
29 h
->parser
= php_http_message_parser_init(NULL TSRMLS_CC
);
30 h
->message
= php_http_message_init(NULL
, 0 TSRMLS_CC
);
32 TSRMLS_SET_CTX(h
->ts
);
35 if (!(h
= h
->ops
->init(h
, init_arg
))) {
36 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT
, "Could not initialize request");
39 php_http_client_free(&free_h
);
47 PHP_HTTP_API
void php_http_client_dtor(php_http_client_t
*h
)
53 php_http_resource_factory_free(&h
->rf
);
55 php_http_message_parser_free(&h
->parser
);
56 php_http_message_free(&h
->message
);
57 php_http_buffer_free(&h
->buffer
);
60 PHP_HTTP_API
void php_http_client_free(php_http_client_t
**h
)
63 php_http_client_dtor(*h
);
69 PHP_HTTP_API php_http_client_t
*php_http_client_copy(php_http_client_t
*from
, php_http_client_t
*to
)
71 if (!from
->ops
->copy
) {
74 TSRMLS_FETCH_FROM_CTX(from
->ts
);
77 to
= ecalloc(1, sizeof(*to
));
82 php_http_resource_factory_addref(from
->rf
);
85 to
->rf
= php_http_resource_factory_init(NULL
, to
->ops
->rsrc
, to
, NULL
);
87 to
->buffer
= php_http_buffer_init(NULL
);
88 to
->parser
= php_http_message_parser_init(NULL TSRMLS_CC
);
89 to
->message
= php_http_message_init(NULL
, 0 TSRMLS_CC
);
91 TSRMLS_SET_CTX(to
->ts
);
93 return to
->ops
->copy(from
, to
);
97 PHP_HTTP_API STATUS
php_http_client_exec(php_http_client_t
*h
, php_http_message_t
*msg
)
100 return h
->ops
->exec(h
, msg
);
105 PHP_HTTP_API STATUS
php_http_client_reset(php_http_client_t
*h
)
108 return h
->ops
->reset(h
);
113 PHP_HTTP_API STATUS
php_http_client_setopt(php_http_client_t
*h
, php_http_client_setopt_opt_t opt
, void *arg
)
115 if (h
->ops
->setopt
) {
116 return h
->ops
->setopt(h
, opt
, arg
);
121 PHP_HTTP_API STATUS
php_http_client_getopt(php_http_client_t
*h
, php_http_client_getopt_opt_t opt
, void *arg
)
123 if (h
->ops
->getopt
) {
124 return h
->ops
->getopt(h
, opt
, arg
);
129 #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpClient, method, 0, req_args)
130 #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpClient, method, 0)
131 #define PHP_HTTP_CLIENT_ME(method, visibility) PHP_ME(HttpClient, method, PHP_HTTP_ARGS(HttpClient, method), visibility)
132 #define PHP_HTTP_CLIENT_ALIAS(method, func) PHP_HTTP_STATIC_ME_ALIAS(method, func, PHP_HTTP_ARGS(HttpClient, method))
133 #define PHP_HTTP_CLIENT_MALIAS(me, al, vis) ZEND_FENTRY(me, ZEND_MN(HttpClient_##al), PHP_HTTP_ARGS(HttpClient, al), vis)
135 PHP_HTTP_BEGIN_ARGS(__construct
, 0)
136 PHP_HTTP_ARG_ARR(options
, 1, 0)
139 PHP_HTTP_EMPTY_ARGS(getOptions
);
140 PHP_HTTP_BEGIN_ARGS(setOptions
, 0)
141 PHP_HTTP_ARG_ARR(options
, 1, 0)
144 PHP_HTTP_EMPTY_ARGS(getSslOptions
);
145 PHP_HTTP_BEGIN_ARGS(setSslOptions
, 0)
146 PHP_HTTP_ARG_ARR(ssl_options
, 1, 0)
149 PHP_HTTP_BEGIN_ARGS(addSslOptions
, 0)
150 PHP_HTTP_ARG_ARR(ssl_options
, 1, 0)
153 PHP_HTTP_EMPTY_ARGS(getCookies
);
154 PHP_HTTP_BEGIN_ARGS(setCookies
, 0)
155 PHP_HTTP_ARG_VAL(cookies
, 0)
158 PHP_HTTP_BEGIN_ARGS(addCookies
, 1)
159 PHP_HTTP_ARG_VAL(cookies
, 0)
162 PHP_HTTP_EMPTY_ARGS(enableCookies
);
163 PHP_HTTP_BEGIN_ARGS(resetCookies
, 0)
164 PHP_HTTP_ARG_VAL(session_only
, 0)
166 PHP_HTTP_EMPTY_ARGS(flushCookies
);
168 PHP_HTTP_EMPTY_ARGS(getResponseMessageClass
);
169 PHP_HTTP_BEGIN_ARGS(setResponseMessageClass
, 1)
170 PHP_HTTP_ARG_VAL(message_class_name
, 0)
173 PHP_HTTP_EMPTY_ARGS(getResponseMessage
);
174 PHP_HTTP_EMPTY_ARGS(getRequestMessage
);
175 PHP_HTTP_EMPTY_ARGS(getHistory
);
176 PHP_HTTP_EMPTY_ARGS(clearHistory
);
178 PHP_HTTP_BEGIN_ARGS(setRequest
, 1)
179 PHP_HTTP_ARG_OBJ(http
\\Client
\\Request
, request
, 1)
181 PHP_HTTP_EMPTY_ARGS(getRequest
);
183 PHP_HTTP_BEGIN_ARGS(send
, 1)
184 PHP_HTTP_ARG_VAL(request
, 0)
187 PHP_HTTP_EMPTY_ARGS(getObservers
);
188 PHP_HTTP_BEGIN_ARGS(attach
, 1)
189 PHP_HTTP_ARG_OBJ(SplObserver
, observer
, 0)
191 PHP_HTTP_BEGIN_ARGS(detach
, 1)
192 PHP_HTTP_ARG_OBJ(SplObserver
, observer
, 0)
194 PHP_HTTP_EMPTY_ARGS(notify
);
195 PHP_HTTP_EMPTY_ARGS(getProgress
);
196 PHP_HTTP_BEGIN_ARGS(getTransferInfo
, 0)
197 PHP_HTTP_ARG_VAL(name
, 0)
201 zend_class_entry
*php_http_client_class_entry
;
202 zend_function_entry php_http_client_method_entry
[] = {
203 PHP_HTTP_CLIENT_ME(__construct
, ZEND_ACC_PUBLIC
|ZEND_ACC_CTOR
)
204 PHP_HTTP_CLIENT_ME(getObservers
, ZEND_ACC_PUBLIC
)
205 PHP_HTTP_CLIENT_ME(notify
, ZEND_ACC_PUBLIC
)
206 PHP_HTTP_CLIENT_ME(attach
, ZEND_ACC_PUBLIC
)
207 PHP_HTTP_CLIENT_ME(detach
, ZEND_ACC_PUBLIC
)
208 PHP_HTTP_CLIENT_ME(getProgress
, ZEND_ACC_PUBLIC
)
209 PHP_HTTP_CLIENT_ME(getTransferInfo
, ZEND_ACC_PUBLIC
)
211 PHP_HTTP_CLIENT_ME(setOptions
, ZEND_ACC_PUBLIC
)
212 PHP_HTTP_CLIENT_ME(getOptions
, ZEND_ACC_PUBLIC
)
213 PHP_HTTP_CLIENT_ME(setSslOptions
, ZEND_ACC_PUBLIC
)
214 PHP_HTTP_CLIENT_ME(getSslOptions
, ZEND_ACC_PUBLIC
)
215 PHP_HTTP_CLIENT_ME(addSslOptions
, ZEND_ACC_PUBLIC
)
217 PHP_HTTP_CLIENT_ME(addCookies
, ZEND_ACC_PUBLIC
)
218 PHP_HTTP_CLIENT_ME(getCookies
, ZEND_ACC_PUBLIC
)
219 PHP_HTTP_CLIENT_ME(setCookies
, ZEND_ACC_PUBLIC
)
221 PHP_HTTP_CLIENT_ME(enableCookies
, ZEND_ACC_PUBLIC
)
222 PHP_HTTP_CLIENT_ME(resetCookies
, ZEND_ACC_PUBLIC
)
223 PHP_HTTP_CLIENT_ME(flushCookies
, ZEND_ACC_PUBLIC
)
225 PHP_HTTP_CLIENT_ME(setRequest
, ZEND_ACC_PUBLIC
)
226 PHP_HTTP_CLIENT_ME(getRequest
, ZEND_ACC_PUBLIC
)
227 PHP_HTTP_CLIENT_ME(send
, ZEND_ACC_PUBLIC
)
229 PHP_HTTP_CLIENT_ME(getResponseMessage
, ZEND_ACC_PUBLIC
)
230 PHP_HTTP_CLIENT_ME(getRequestMessage
, ZEND_ACC_PUBLIC
)
231 PHP_HTTP_CLIENT_ME(getHistory
, ZEND_ACC_PUBLIC
)
232 PHP_HTTP_CLIENT_ME(clearHistory
, ZEND_ACC_PUBLIC
)
234 PHP_HTTP_CLIENT_ME(getResponseMessageClass
, ZEND_ACC_PUBLIC
)
235 PHP_HTTP_CLIENT_ME(setResponseMessageClass
, ZEND_ACC_PUBLIC
)
240 static zend_object_handlers php_http_client_object_handlers
;
242 zend_object_handlers
*php_http_client_get_object_handlers(void)
244 return &php_http_client_object_handlers
;
247 zend_object_value
php_http_client_object_new(zend_class_entry
*ce TSRMLS_DC
)
249 return php_http_client_object_new_ex(ce
, NULL
, NULL TSRMLS_CC
);
252 zend_object_value
php_http_client_object_new_ex(zend_class_entry
*ce
, php_http_client_t
*r
, php_http_client_object_t
**ptr TSRMLS_DC
)
254 zend_object_value ov
;
255 php_http_client_object_t
*o
;
257 o
= ecalloc(1, sizeof(php_http_client_object_t
));
258 zend_object_std_init((zend_object
*) o
, ce TSRMLS_CC
);
259 object_properties_init((zend_object
*) o
, ce
);
261 if (!(o
->client
= r
)) {
262 o
->client
= php_http_client_init(NULL
, NULL
, NULL
, NULL TSRMLS_CC
);
269 ov
.handle
= zend_objects_store_put(o
, NULL
, php_http_client_object_free
, NULL TSRMLS_CC
);
270 ov
.handlers
= &php_http_client_object_handlers
;
275 zend_object_value
php_http_client_object_clone(zval
*this_ptr TSRMLS_DC
)
277 zend_object_value new_ov
;
278 php_http_client_object_t
*new_obj
, *old_obj
= zend_object_store_get_object(this_ptr TSRMLS_CC
);
280 new_ov
= php_http_client_object_new_ex(old_obj
->zo
.ce
, php_http_client_copy(old_obj
->client
, NULL
), &new_obj TSRMLS_CC
);
281 zend_objects_clone_members(&new_obj
->zo
, new_ov
, &old_obj
->zo
, Z_OBJ_HANDLE_P(this_ptr
) TSRMLS_CC
);
286 void php_http_client_object_free(void *object TSRMLS_DC
)
288 php_http_client_object_t
*o
= (php_http_client_object_t
*) object
;
290 php_http_client_free(&o
->client
);
291 zend_object_std_dtor((zend_object
*) o TSRMLS_CC
);
295 static inline void php_http_client_object_check_request_content_type(zval
*this_ptr TSRMLS_DC
)
297 zval
*ctype
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("contentType"), 0 TSRMLS_CC
);
299 if (Z_STRLEN_P(ctype
)) {
300 zval
**headers
, *opts
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), 0 TSRMLS_CC
);
302 if ( (Z_TYPE_P(opts
) == IS_ARRAY
) &&
303 (SUCCESS
== zend_hash_find(Z_ARRVAL_P(opts
), ZEND_STRS("headers"), (void *) &headers
)) &&
304 (Z_TYPE_PP(headers
) == IS_ARRAY
)) {
307 /* only override if not already set */
308 if ((SUCCESS
!= zend_hash_find(Z_ARRVAL_PP(headers
), ZEND_STRS("Content-Type"), (void *) &ct_header
))) {
309 add_assoc_stringl(*headers
, "Content-Type", Z_STRVAL_P(ctype
), Z_STRLEN_P(ctype
), 1);
311 /* or not a string, zero length string or a string of spaces */
312 if ((Z_TYPE_PP(ct_header
) != IS_STRING
) || !Z_STRLEN_PP(ct_header
)) {
313 add_assoc_stringl(*headers
, "Content-Type", Z_STRVAL_P(ctype
), Z_STRLEN_P(ctype
), 1);
315 int i
, only_space
= 1;
317 /* check for spaces only */
318 for (i
= 0; i
< Z_STRLEN_PP(ct_header
); ++i
) {
319 if (!PHP_HTTP_IS_CTYPE(space
, Z_STRVAL_PP(ct_header
)[i
])) {
325 add_assoc_stringl(*headers
, "Content-Type", Z_STRVAL_P(ctype
), Z_STRLEN_P(ctype
), 1);
331 MAKE_STD_ZVAL(headers
);
333 add_assoc_stringl(headers
, "Content-Type", Z_STRVAL_P(ctype
), Z_STRLEN_P(ctype
), 1);
334 zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "addheaders", NULL
, headers
);
335 zval_ptr_dtor(&headers
);
340 static inline zend_object_value
php_http_client_object_message(zval
*this_ptr
, php_http_message_t
*msg TSRMLS_DC
)
342 zend_object_value ov
;
343 zval
*zcn
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("responseMessageClass"), 0 TSRMLS_CC
);
344 zend_class_entry
*class_entry
;
347 && (class_entry
= zend_fetch_class(Z_STRVAL_P(zcn
), Z_STRLEN_P(zcn
), 0 TSRMLS_CC
))
348 && (SUCCESS
== php_http_new(&ov
, class_entry
, (php_http_new_t
) php_http_message_object_new_ex
, php_http_client_response_class_entry
, msg
, NULL TSRMLS_CC
))) {
351 return php_http_message_object_new_ex(php_http_client_response_class_entry
, msg
, NULL TSRMLS_CC
);
355 STATUS
php_http_client_object_handle_request(zval
*zclient
, zval
**zreq TSRMLS_DC
)
357 php_http_client_object_t
*obj
= zend_object_store_get_object(zclient TSRMLS_CC
);
358 php_http_client_progress_t
*progress
;
361 /* do we have a valid request? */
363 /* remember the request */
364 zend_update_property(php_http_client_class_entry
, zclient
, ZEND_STRL("request"), *zreq TSRMLS_CC
);
366 /* maybe a request is already set */
367 *zreq
= zend_read_property(php_http_client_class_entry
, zclient
, ZEND_STRL("request"), 0 TSRMLS_CC
);
369 if (Z_TYPE_PP(zreq
) != IS_OBJECT
|| !instanceof_function(Z_OBJCE_PP(zreq
), php_http_client_request_class_entry TSRMLS_CC
)) {
370 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT
, "The client does not have a valid request set");
375 /* reset request handle */
376 php_http_client_reset(obj
->client
);
378 /* reset transfer info */
379 zend_update_property_null(php_http_client_class_entry
, zclient
, ZEND_STRL("info") TSRMLS_CC
);
381 /* set request options */
382 zoptions
= zend_read_property(php_http_client_class_entry
, zclient
, ZEND_STRL("options"), 0 TSRMLS_CC
);
383 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_SETTINGS
, Z_ARRVAL_P(zoptions
));
385 /* set progress callback */
386 if (SUCCESS
== php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_INFO
, &progress
)) {
387 if (!progress
->callback
) {
388 php_http_client_progress_callback_t
*callback
= emalloc(sizeof(*callback
));
390 callback
->type
= PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER
;
391 callback
->pass_state
= 0;
392 MAKE_STD_ZVAL(callback
->func
.user
);
393 array_init(callback
->func
.user
);
395 add_next_index_zval(callback
->func
.user
, zclient
);
396 add_next_index_stringl(callback
->func
.user
, ZEND_STRL("notify"), 1);
398 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_CALLBACK
, callback
);
400 progress
->state
.info
= "start";
401 php_http_client_progress_notify(progress TSRMLS_CC
);
402 progress
->state
.started
= 1;
408 STATUS
php_http_client_object_requesthandler(php_http_client_object_t
*obj
, zval
*this_ptr
, char **meth
, char **url
, php_http_message_body_t
**body TSRMLS_DC
)
411 php_http_client_progress_t
*progress
;
413 /* reset request handle */
414 php_http_client_reset(obj
->client
);
415 /* reset transfer info */
416 zend_update_property_null(php_http_client_class_entry
, getThis(), ZEND_STRL("info") TSRMLS_CC
);
419 *meth
= Z_STRVAL_P(zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("method"), 0 TSRMLS_CC
));
423 php_url
*tmp
, qdu
= {NULL
, NULL
, NULL
, NULL
, 0, NULL
, NULL
, NULL
};
424 zval
*zurl
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("url"), 0 TSRMLS_CC
);
425 zval
*zqdata
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("queryData"), 0 TSRMLS_CC
);
427 if (Z_STRLEN_P(zqdata
)) {
428 qdu
.query
= Z_STRVAL_P(zqdata
);
430 php_http_url(0, tmp
= php_url_parse(Z_STRVAL_P(zurl
)), &qdu
, NULL
, url
, NULL TSRMLS_CC
);
435 zval
*zbody
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("requestBody"), 0 TSRMLS_CC
);
437 if (Z_TYPE_P(zbody
) == IS_OBJECT
) {
438 *body
= ((php_http_message_body_object_t
*)zend_object_store_get_object(zbody TSRMLS_CC
))->body
;
440 php_stream_rewind(php_http_message_body_stream(*body
));
445 php_http_client_object_check_request_content_type(getThis() TSRMLS_CC
);
446 zoptions
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), 0 TSRMLS_CC
);
447 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_SETTINGS
, Z_ARRVAL_P(zoptions
));
449 if (SUCCESS
== php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_INFO
, &progress
)) {
450 if (!progress
->callback
) {
451 php_http_client_progress_callback_t
*callback
= emalloc(sizeof(*callback
));
453 callback
->type
= PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER
;
454 callback
->pass_state
= 0;
455 MAKE_STD_ZVAL(callback
->func
.user
);
456 array_init(callback
->func
.user
);
457 Z_ADDREF_P(getThis());
458 add_next_index_zval(callback
->func
.user
, getThis());
459 add_next_index_stringl(callback
->func
.user
, ZEND_STRL("notify"), 1);
461 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_CALLBACK
, callback
);
463 progress
->state
.info
= "start";
464 php_http_client_progress_notify(progress TSRMLS_CC
);
465 progress
->state
.started
= 1;
470 static inline void empty_response(zval
*this_ptr TSRMLS_DC
)
472 zend_update_property_null(php_http_client_class_entry
, getThis(), ZEND_STRL("responseMessage") TSRMLS_CC
);
475 STATUS
php_http_client_object_handle_response(zval
*zclient TSRMLS_DC
)
477 php_http_client_object_t
*obj
= zend_object_store_get_object(zclient TSRMLS_CC
);
478 php_http_client_progress_t
*progress
;
479 php_http_message_t
*msg
;
482 /* always fetch info */
485 php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_TRANSFER_INFO
, Z_ARRVAL_P(info
));
486 zend_update_property(php_http_client_class_entry
, zclient
, ZEND_STRL("transferInfo"), info TSRMLS_CC
);
487 zval_ptr_dtor(&info
);
489 if ((msg
= obj
->client
->message
)) {
491 if (i_zend_is_true(zend_read_property(php_http_client_class_entry
, zclient
, ZEND_STRL("recordHistory"), 0 TSRMLS_CC
))) {
492 zval
*new_hist
, *old_hist
= zend_read_property(php_http_client_class_entry
, zclient
, ZEND_STRL("history"), 0 TSRMLS_CC
);
493 zend_object_value ov
= php_http_client_object_message(zclient
, php_http_message_copy(msg
, NULL
) TSRMLS_CC
);
495 MAKE_STD_ZVAL(new_hist
);
496 ZVAL_OBJVAL(new_hist
, ov
, 0);
498 if (Z_TYPE_P(old_hist
) == IS_OBJECT
) {
499 php_http_message_object_prepend(new_hist
, old_hist
, 1 TSRMLS_CC
);
502 zend_update_property(php_http_client_class_entry
, zclient
, ZEND_STRL("history"), new_hist TSRMLS_CC
);
503 zval_ptr_dtor(&new_hist
);
506 /* update response info */
507 if (PHP_HTTP_MESSAGE_TYPE(RESPONSE
, msg
)) {
510 MAKE_STD_ZVAL(message
);
511 ZVAL_OBJVAL(message
, php_http_client_object_message(zclient
, msg TSRMLS_CC
), 0);
512 zend_update_property(php_http_client_class_entry
, zclient
, ZEND_STRL("responseMessage"), message TSRMLS_CC
);
513 zval_ptr_dtor(&message
);
515 obj
->client
->message
= php_http_message_init(NULL
, 0 TSRMLS_CC
);
518 zend_update_property_null(php_http_client_class_entry
, zclient
, ZEND_STRL("responseMessage") TSRMLS_CC
);
521 zend_update_property_null(php_http_client_class_entry
, zclient
, ZEND_STRL("responseMessage") TSRMLS_CC
);
524 /* there might be a 100-Continue response in between */
525 while (msg
&& !PHP_HTTP_MESSAGE_TYPE(REQUEST
, msg
)) {
529 if (PHP_HTTP_MESSAGE_TYPE(REQUEST
, msg
)) {
532 /* update the actual request message */
533 MAKE_STD_ZVAL(message
);
534 ZVAL_OBJVAL(message
, php_http_message_object_new_ex(php_http_message_class_entry
, php_http_message_copy_ex(msg
, NULL
, 0), NULL TSRMLS_CC
), 0);
535 zend_update_property(php_http_client_class_entry
, zclient
, ZEND_STRL("requestMessage"), message TSRMLS_CC
);
536 zval_ptr_dtor(&message
);
539 if (SUCCESS
== php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_INFO
, &progress
)) {
540 progress
->state
.info
= "finished";
541 progress
->state
.finished
= 1;
542 php_http_client_progress_notify(progress TSRMLS_CC
);
544 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_CALLBACK
, NULL
);
549 STATUS
php_http_client_object_responsehandler(php_http_client_object_t
*obj
, zval
*this_ptr TSRMLS_DC
)
551 STATUS ret
= SUCCESS
;
553 php_http_message_t
*msg
;
554 php_http_client_progress_t
*progress
;
556 /* always fetch info */
559 php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_TRANSFER_INFO
, Z_ARRVAL_P(info
));
560 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("transferInfo"), info TSRMLS_CC
);
561 zval_ptr_dtor(&info
);
563 if ((msg
= obj
->client
->message
)) {
565 if (i_zend_is_true(zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("recordHistory"), 0 TSRMLS_CC
))) {
566 zval
*new_hist
, *old_hist
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("history"), 0 TSRMLS_CC
);
567 zend_object_value ov
= php_http_client_object_message(getThis(), php_http_message_copy(msg
, NULL
) TSRMLS_CC
);
569 MAKE_STD_ZVAL(new_hist
);
570 ZVAL_OBJVAL(new_hist
, ov
, 0);
572 if (Z_TYPE_P(old_hist
) == IS_OBJECT
) {
573 php_http_message_object_prepend(new_hist
, old_hist
, 1 TSRMLS_CC
);
576 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("history"), new_hist TSRMLS_CC
);
577 zval_ptr_dtor(&new_hist
);
580 /* update response info */
581 if (PHP_HTTP_MESSAGE_TYPE(RESPONSE
, msg
)) {
584 MAKE_STD_ZVAL(message
);
585 ZVAL_OBJVAL(message
, php_http_client_object_message(getThis(), msg TSRMLS_CC
), 0);
586 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("responseMessage"), message TSRMLS_CC
);
587 zval_ptr_dtor(&message
);
589 obj
->client
->message
= php_http_message_init(NULL
, 0 TSRMLS_CC
);
592 empty_response(getThis() TSRMLS_CC
);
595 /* update properties with empty values */
596 empty_response(getThis() TSRMLS_CC
);
599 while (msg
&& !PHP_HTTP_MESSAGE_TYPE(REQUEST
, msg
)) {
602 if (PHP_HTTP_MESSAGE_TYPE(REQUEST
, msg
)) {
605 MAKE_STD_ZVAL(message
);
606 ZVAL_OBJVAL(message
, php_http_client_object_message(getThis(), php_http_message_copy_ex(msg
, NULL
, 0) TSRMLS_CC
), 0);
607 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("requestMessage"), message TSRMLS_CC
);
608 zval_ptr_dtor(&message
);
611 if (SUCCESS
== php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_INFO
, &progress
)) {
612 progress
->state
.info
= "finished";
613 progress
->state
.finished
= 1;
614 php_http_client_progress_notify(progress TSRMLS_CC
);
616 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_CALLBACK
, NULL
);
621 static int apply_pretty_key(void *pDest TSRMLS_DC
, int num_args
, va_list args
, zend_hash_key
*hash_key
)
623 zval
**zpp
= pDest
, *arr
= va_arg(args
, zval
*);
625 if (hash_key
->arKey
&& hash_key
->nKeyLength
> 1) {
626 char *tmp
= php_http_pretty_key(estrndup(hash_key
->arKey
, hash_key
->nKeyLength
- 1), hash_key
->nKeyLength
- 1, 1, 0);
629 add_assoc_zval_ex(arr
, tmp
, hash_key
->nKeyLength
, *zpp
);
632 return ZEND_HASH_APPLY_KEEP
;
635 static void php_http_client_object_set_options(INTERNAL_FUNCTION_PARAMETERS
)
637 php_http_array_hashkey_t key
= php_http_array_hashkey_init(0);
639 zval
*opts
= NULL
, *old_opts
, *new_opts
, *add_opts
, **opt
;
641 if (SUCCESS
!= zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a!/", &opts
)) {
645 MAKE_STD_ZVAL(new_opts
);
646 array_init(new_opts
);
648 if (!opts
|| !zend_hash_num_elements(Z_ARRVAL_P(opts
))) {
649 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), new_opts TSRMLS_CC
);
650 zval_ptr_dtor(&new_opts
);
652 MAKE_STD_ZVAL(add_opts
);
653 array_init(add_opts
);
654 /* some options need extra attention -- thus cannot use array_merge() directly */
655 FOREACH_KEYVAL(pos
, opts
, key
, opt
) {
656 if (key
.type
== HASH_KEY_IS_STRING
) {
657 #define KEYMATCH(k, s) ((sizeof(s)==k.len) && !strcasecmp(k.str, s))
658 if (KEYMATCH(key
, "ssl")) {
659 zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "addssloptions", NULL
, *opt
);
660 } else if (KEYMATCH(key
, "cookies")) {
661 zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "addcookies", NULL
, *opt
);
662 } else if (KEYMATCH(key
, "recordHistory")) {
663 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("recordHistory"), *opt TSRMLS_CC
);
664 } else if (KEYMATCH(key
, "responseMessageClass")) {
665 zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL
, "setmessageclass", NULL
, *opt
);
666 } else if (Z_TYPE_PP(opt
) == IS_NULL
) {
667 old_opts
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), 0 TSRMLS_CC
);
668 if (Z_TYPE_P(old_opts
) == IS_ARRAY
) {
669 zend_symtable_del(Z_ARRVAL_P(old_opts
), key
.str
, key
.len
);
673 add_assoc_zval_ex(add_opts
, key
.str
, key
.len
, *opt
);
678 old_opts
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), 0 TSRMLS_CC
);
679 if (Z_TYPE_P(old_opts
) == IS_ARRAY
) {
680 array_copy(Z_ARRVAL_P(old_opts
), Z_ARRVAL_P(new_opts
));
682 array_join(Z_ARRVAL_P(add_opts
), Z_ARRVAL_P(new_opts
), 0, 0);
683 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), new_opts TSRMLS_CC
);
684 zval_ptr_dtor(&new_opts
);
685 zval_ptr_dtor(&add_opts
);
688 RETVAL_ZVAL(getThis(), 1, 0);
691 static inline void php_http_client_object_set_options_subr(INTERNAL_FUNCTION_PARAMETERS
, char *key
, size_t len
, int overwrite
, int prettify_keys
)
693 zval
*old_opts
, *new_opts
, *opts
= NULL
, **entry
= NULL
;
695 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|a/!", &opts
)) {
696 MAKE_STD_ZVAL(new_opts
);
697 array_init(new_opts
);
698 old_opts
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), 0 TSRMLS_CC
);
699 if (Z_TYPE_P(old_opts
) == IS_ARRAY
) {
700 array_copy(Z_ARRVAL_P(old_opts
), Z_ARRVAL_P(new_opts
));
703 if (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(new_opts
), key
, len
, (void *) &entry
)) {
705 zend_hash_clean(Z_ARRVAL_PP(entry
));
707 if (opts
&& zend_hash_num_elements(Z_ARRVAL_P(opts
))) {
709 array_copy(Z_ARRVAL_P(opts
), Z_ARRVAL_PP(entry
));
711 array_join(Z_ARRVAL_P(opts
), Z_ARRVAL_PP(entry
), 0, prettify_keys
? ARRAY_JOIN_PRETTIFY
: 0);
719 array_init_size(tmp
, zend_hash_num_elements(Z_ARRVAL_P(opts
)));
720 zend_hash_apply_with_arguments(Z_ARRVAL_P(opts
) TSRMLS_CC
, apply_pretty_key
, 1, tmp
);
725 add_assoc_zval_ex(new_opts
, key
, len
, opts
);
727 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), new_opts TSRMLS_CC
);
728 zval_ptr_dtor(&new_opts
);
731 RETVAL_ZVAL(getThis(), 1, 0);
734 static inline void php_http_client_object_get_options_subr(INTERNAL_FUNCTION_PARAMETERS
, char *key
, size_t len
)
736 if (SUCCESS
== zend_parse_parameters_none()) {
737 zval
*opts
, **options
;
739 opts
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("options"), 0 TSRMLS_CC
);
740 array_init(return_value
);
742 if ( (Z_TYPE_P(opts
) == IS_ARRAY
) &&
743 (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(opts
), key
, len
, (void *) &options
))) {
744 convert_to_array(*options
);
745 array_copy(Z_ARRVAL_PP(options
), Z_ARRVAL_P(return_value
));
750 PHP_METHOD(HttpClient
, __construct
)
752 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
753 php_http_client_object_set_options(INTERNAL_FUNCTION_PARAM_PASSTHRU
);
754 } end_error_handling();
757 PHP_METHOD(HttpClient
, getObservers
)
759 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
760 if (SUCCESS
== zend_parse_parameters_none()) {
761 RETVAL_PROP(php_http_client_class_entry
, "observers");
763 } end_error_handling();
766 static int notify(zend_object_iterator
*iter
, void *puser TSRMLS_DC
)
768 zval
**observer
= NULL
;
770 iter
->funcs
->get_current_data(iter
, &observer TSRMLS_CC
);
774 zend_call_method_with_1_params(observer
, NULL
, NULL
, "update", &retval
, puser
);
775 zval_ptr_dtor(&retval
);
781 PHP_METHOD(HttpClient
, notify
)
783 if (SUCCESS
== zend_parse_parameters_none()) {
784 zval
*observers
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("observers"), 0 TSRMLS_CC
);
786 if (Z_TYPE_P(observers
) == IS_OBJECT
) {
787 Z_ADDREF_P(getThis());
788 spl_iterator_apply(observers
, notify
, getThis() TSRMLS_CC
);
789 zval_ptr_dtor(&getThis());
793 RETVAL_ZVAL(getThis(), 1, 0);
796 PHP_METHOD(HttpClient
, attach
)
800 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &observer
, spl_ce_SplObserver
)) {
801 zval
*retval
, *observers
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("observers"), 0 TSRMLS_CC
);
802 zend_call_method_with_1_params(&observers
, NULL
, NULL
, "attach", &retval
, observer
);
803 zval_ptr_dtor(&retval
);
806 RETVAL_ZVAL(getThis(), 1, 0);
809 PHP_METHOD(HttpClient
, detach
)
813 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &observer
, spl_ce_SplObserver
)) {
814 zval
*retval
, *observers
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("observers"), 0 TSRMLS_CC
);
815 zend_call_method_with_1_params(&observers
, NULL
, NULL
, "detach", &retval
, observer
);
816 zval_ptr_dtor(&retval
);
819 RETVAL_ZVAL(getThis(), 1, 0);
822 PHP_METHOD(HttpClient
, getProgress
)
824 if (SUCCESS
== zend_parse_parameters_none()) {
825 php_http_client_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
826 php_http_client_progress_t
*progress
;
828 php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_PROGRESS_INFO
, &progress
);
829 object_init(return_value
);
830 add_property_bool(return_value
, "started", progress
->state
.started
);
831 add_property_bool(return_value
, "finished", progress
->state
.finished
);
832 add_property_string(return_value
, "info", STR_PTR(progress
->state
.info
), 1);
833 add_property_double(return_value
, "dltotal", progress
->state
.dl
.total
);
834 add_property_double(return_value
, "dlnow", progress
->state
.dl
.now
);
835 add_property_double(return_value
, "ultotal", progress
->state
.ul
.total
);
836 add_property_double(return_value
, "ulnow", progress
->state
.ul
.now
);
840 PHP_METHOD(HttpClient
, getTransferInfo
)
842 char *info_name
= NULL
;
845 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|s", &info_name
, &info_len
)) {
846 zval
**infop
, *temp
= NULL
, *info
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("transferInfo"), 0 TSRMLS_CC
);
848 /* request completed? */
849 if (Z_TYPE_P(info
) != IS_ARRAY
) {
850 php_http_client_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
854 php_http_client_getopt(obj
->client
, PHP_HTTP_CLIENT_OPT_TRANSFER_INFO
, Z_ARRVAL_P(temp
));
858 if (info_len
&& info_name
) {
859 if (SUCCESS
== zend_symtable_find(Z_ARRVAL_P(info
), php_http_pretty_key(info_name
, info_len
, 0, 0), info_len
+ 1, (void *) &infop
)) {
860 RETVAL_ZVAL(*infop
, 1, 0);
862 php_http_error(HE_NOTICE
, PHP_HTTP_E_INVALID_PARAM
, "Could not find transfer info named %s", info_name
);
866 RETVAL_ZVAL(info
, 1, 0);
870 zval_ptr_dtor(&temp
);
877 PHP_METHOD(HttpClient
, setOptions
)
879 php_http_client_object_set_options(INTERNAL_FUNCTION_PARAM_PASSTHRU
);
882 PHP_METHOD(HttpClient
, getOptions
)
884 if (SUCCESS
== zend_parse_parameters_none()) {
885 RETURN_PROP(php_http_client_class_entry
, "options");
890 PHP_METHOD(HttpClient
, setSslOptions
)
892 php_http_client_object_set_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ZEND_STRS("ssl"), 1, 0);
895 PHP_METHOD(HttpClient
, addSslOptions
)
897 php_http_client_object_set_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ZEND_STRS("ssl"), 0, 0);
900 PHP_METHOD(HttpClient
, getSslOptions
)
902 php_http_client_object_get_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ZEND_STRS("ssl"));
905 PHP_METHOD(HttpClient
, setCookies
)
907 php_http_client_object_set_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ZEND_STRS("cookies"), 1, 0);
910 PHP_METHOD(HttpClient
, addCookies
)
912 php_http_client_object_set_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ZEND_STRS("cookies"), 0, 0);
915 PHP_METHOD(HttpClient
, getCookies
)
917 php_http_client_object_get_options_subr(INTERNAL_FUNCTION_PARAM_PASSTHRU
, ZEND_STRS("cookies"));
920 PHP_METHOD(HttpClient
, enableCookies
)
922 if (SUCCESS
== zend_parse_parameters_none()){
923 php_http_client_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
925 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_COOKIES_ENABLE
, NULL
);
927 RETVAL_ZVAL(getThis(), 1, 0);
930 PHP_METHOD(HttpClient
, resetCookies
)
932 zend_bool session_only
= 0;
934 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "|b", &session_only
)) {
935 php_http_client_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
937 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_COOKIES_RESET_SESSION
, NULL
);
939 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_COOKIES_RESET
, NULL
);
942 RETVAL_ZVAL(getThis(), 1, 0);
945 PHP_METHOD(HttpClient
, flushCookies
)
947 if (SUCCESS
== zend_parse_parameters_none()) {
948 php_http_client_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
950 php_http_client_setopt(obj
->client
, PHP_HTTP_CLIENT_OPT_COOKIES_FLUSH
, NULL
);
952 RETVAL_ZVAL(getThis(), 1, 0);
955 PHP_METHOD(HttpClient
, getResponseMessage
)
957 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
958 if (SUCCESS
== zend_parse_parameters_none()) {
959 zval
*message
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("responseMessage"), 0 TSRMLS_CC
);
961 if (Z_TYPE_P(message
) == IS_OBJECT
) {
962 RETVAL_OBJECT(message
, 1);
964 php_http_error(HE_WARNING
, PHP_HTTP_E_RUNTIME
, "HttpClient does not contain a response message");
967 } end_error_handling();
970 PHP_METHOD(HttpClient
, getRequestMessage
)
972 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
973 if (SUCCESS
== zend_parse_parameters_none()) {
974 zval
*message
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("requestMessage"), 0 TSRMLS_CC
);
976 if (Z_TYPE_P(message
) == IS_OBJECT
) {
977 RETVAL_OBJECT(message
, 1);
979 php_http_error(HE_WARNING
, PHP_HTTP_E_RUNTIME
, "HttpClient does not contain a request message");
982 } end_error_handling();
985 PHP_METHOD(HttpClient
, getHistory
)
987 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
988 if (SUCCESS
== zend_parse_parameters_none()) {
989 zval
*hist
= zend_read_property(php_http_client_class_entry
, getThis(), ZEND_STRL("history"), 0 TSRMLS_CC
);
991 if (Z_TYPE_P(hist
) == IS_OBJECT
) {
992 RETVAL_OBJECT(hist
, 1);
994 php_http_error(HE_WARNING
, PHP_HTTP_E_RUNTIME
, "The history is empty");
997 } end_error_handling();
1000 PHP_METHOD(HttpClient
, clearHistory
)
1002 if (SUCCESS
== zend_parse_parameters_none()) {
1003 zend_update_property_null(php_http_client_class_entry
, getThis(), ZEND_STRL("history") TSRMLS_CC
);
1005 RETVAL_ZVAL(getThis(), 1, 0);
1008 PHP_METHOD(HttpClient
, getResponseMessageClass
)
1010 if (SUCCESS
== zend_parse_parameters_none()) {
1011 RETURN_PROP(php_http_client_class_entry
, "responseMessageClass");
1016 PHP_METHOD(HttpClient
, setResponseMessageClass
)
1021 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &cn
, &cl
)) {
1022 zend_update_property_stringl(php_http_client_class_entry
, getThis(), ZEND_STRL("responseMessageClass"), cn
, cl TSRMLS_CC
);
1024 RETVAL_ZVAL(getThis(), 1, 0);
1027 PHP_METHOD(HttpClient
, setRequest
)
1031 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O", &zreq
, php_http_client_request_class_entry
)) {
1032 zend_update_property(php_http_client_class_entry
, getThis(), ZEND_STRL("request"), zreq TSRMLS_CC
);
1034 RETURN_ZVAL(getThis(), 1, 0);
1037 PHP_METHOD(HttpClient
, getRequest
)
1039 if (SUCCESS
== zend_parse_parameters_none()) {
1040 RETURN_PROP(php_http_client_class_entry
, "request");
1044 PHP_METHOD(HttpClient
, send
)
1050 with_error_handling(EH_THROW
, php_http_exception_class_entry
) {
1051 if (SUCCESS
== zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "O!", &zreq
, php_http_client_request_class_entry
)) {
1052 if (SUCCESS
== php_http_client_object_handle_request(getThis(), &zreq TSRMLS_CC
)) {
1053 php_http_client_object_t
*obj
= zend_object_store_get_object(getThis() TSRMLS_CC
);
1054 php_http_message_object_t
*req
= zend_object_store_get_object(zreq TSRMLS_CC
);
1056 php_http_client_exec(obj
->client
, req
->message
);
1058 if (SUCCESS
== php_http_client_object_handle_response(getThis() TSRMLS_CC
)) {
1059 RETVAL_PROP(php_http_client_class_entry
, "responseMessage");
1061 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT
, "Failed to handle response");
1064 php_http_error(HE_WARNING
, PHP_HTTP_E_CLIENT
, "Failed to handle request");
1067 } end_error_handling();
1070 PHP_MINIT_FUNCTION(http_client
)
1072 PHP_HTTP_REGISTER_CLASS(http
\\Client
, AbstractClient
, http_client
, php_http_object_class_entry
, ZEND_ACC_ABSTRACT
);
1073 php_http_client_class_entry
->create_object
= php_http_object_new
;//php_http_client_object_new;
1074 memcpy(&php_http_client_object_handlers
, zend_get_std_object_handlers(), sizeof(zend_object_handlers
));
1075 php_http_client_object_handlers
.clone_obj
= php_http_client_object_clone
;
1077 zend_class_implements(php_http_client_class_entry TSRMLS_CC
, 2, spl_ce_SplSubject
, php_http_client_interface_class_entry
);
1079 zend_declare_property_string(php_http_client_class_entry
, ZEND_STRL("responseMessageClass"), "", ZEND_ACC_PRIVATE TSRMLS_CC
);
1080 zend_declare_property_null(php_http_client_class_entry
, ZEND_STRL("observers"), ZEND_ACC_PRIVATE TSRMLS_CC
);
1081 zend_declare_property_null(php_http_client_class_entry
, ZEND_STRL("options"), ZEND_ACC_PRIVATE TSRMLS_CC
);
1082 zend_declare_property_null(php_http_client_class_entry
, ZEND_STRL("transferInfo"), ZEND_ACC_PRIVATE TSRMLS_CC
);
1083 zend_declare_property_null(php_http_client_class_entry
, ZEND_STRL("responseMessage"), ZEND_ACC_PRIVATE TSRMLS_CC
);
1084 zend_declare_property_null(php_http_client_class_entry
, ZEND_STRL("requestMessage"), ZEND_ACC_PRIVATE TSRMLS_CC
);
1085 zend_declare_property_null(php_http_client_class_entry
, ZEND_STRL("history"), ZEND_ACC_PRIVATE TSRMLS_CC
);
1087 zend_declare_property_null(php_http_client_class_entry
, ZEND_STRL("request"), ZEND_ACC_PROTECTED TSRMLS_CC
);
1089 zend_declare_property_bool(php_http_client_class_entry
, ZEND_STRL("recordHistory"), 0, ZEND_ACC_PUBLIC TSRMLS_CC
);
1099 * vim600: noet sw=4 ts=4 fdm=marker
1100 * vim<600: noet sw=4 ts=4