From abf5876b9f3a19d437ceb95455c11f05a0e9cce3 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 12 Feb 2015 11:14:31 +0100 Subject: [PATCH] don't create persistent easy handles for non-persistent multi handles --- php_http_client_curl.c | 35 ++++++++++---- tests/client021.phpt | 105 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 10 deletions(-) create mode 100644 tests/client021.phpt diff --git a/php_http_client_curl.c b/php_http_client_curl.c index a41075c..e0994cf 100644 --- a/php_http_client_curl.c +++ b/php_http_client_curl.c @@ -1720,7 +1720,7 @@ static STATUS php_http_curlm_set_option(php_http_option_t *opt, zval *val, void if (!val) { val = &opt->defval; - } else if (Z_TYPE_P(val) != opt->type && !(Z_TYPE_P(val) == IS_NULL && opt->type == IS_ARRAY)) { + } else if (opt->type && Z_TYPE_P(val) != opt->type && !(Z_TYPE_P(val) == IS_NULL && opt->type == IS_ARRAY)) { val = php_http_ztyp(opt->type, val); } @@ -2061,29 +2061,44 @@ static void queue_dtor(php_http_client_enqueue_t *e) php_http_client_curl_handler_dtor(handler); } -static php_resource_factory_t *create_rf(php_http_url_t *url TSRMLS_DC) +static php_resource_factory_t *create_rf(php_http_client_t *h, php_http_client_enqueue_t *enqueue TSRMLS_DC) { - php_persistent_handle_factory_t *pf; + php_persistent_handle_factory_t *pf = NULL; php_resource_factory_t *rf = NULL; - char *id_str = NULL; - size_t id_len; + php_http_url_t *url = enqueue->request->http.info.request.url; if (!url || (!url->host && !url->path)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot request empty URL"); return NULL; } - id_len = spprintf(&id_str, 0, "%s:%d", STR_PTR(url->host), url->port ? url->port : 80); + /* only if the client itself is setup for persistence */ + if (h->rf->dtor == (void (*)(void*)) php_persistent_handle_abandon) { + char *id_str = NULL; + size_t id_len; + int port = url->port ? url->port : 80; + zval **zport; + + if (SUCCESS == zend_hash_find(enqueue->options, ZEND_STRS("port"), (void *) &zport)) { + zval *zcpy = php_http_ztyp(IS_LONG, *zport); + + if (Z_LVAL_P(zcpy)) { + port = Z_LVAL_P(zcpy); + } + zval_ptr_dtor(&zcpy); + } + + id_len = spprintf(&id_str, 0, "%s:%d", STR_PTR(url->host), port); + pf = php_persistent_handle_concede(NULL, ZEND_STRL("http\\Client\\Curl\\Request"), id_str, id_len, NULL, NULL TSRMLS_CC); + efree(id_str); + } - pf = php_persistent_handle_concede(NULL, ZEND_STRL("http\\Client\\Curl\\Request"), id_str, id_len, NULL, NULL TSRMLS_CC); if (pf) { rf = php_resource_factory_init(NULL, php_persistent_handle_get_resource_factory_ops(), pf, (void (*)(void*)) php_persistent_handle_abandon); } else { rf = php_resource_factory_init(NULL, &php_http_curle_resource_factory_ops, NULL, NULL); } - efree(id_str); - return rf; } @@ -2096,7 +2111,7 @@ static STATUS php_http_client_curl_enqueue(php_http_client_t *h, php_http_client php_resource_factory_t *rf; TSRMLS_FETCH_FROM_CTX(h->ts); - rf = create_rf(enqueue->request->http.info.request.url TSRMLS_CC); + rf = create_rf(h, enqueue TSRMLS_CC); if (!rf) { return FAILURE; } diff --git a/tests/client021.phpt b/tests/client021.phpt new file mode 100644 index 0000000..41a220a --- /dev/null +++ b/tests/client021.phpt @@ -0,0 +1,105 @@ +--TEST-- +client cookies +--SKIPIF-- + +--FILE-- +setOptions(["cookiestore" => $tmpfile]); + +server("cookie.inc", function($port) use($request) { + $request->setOptions(["port" => $port]); + $client = new http\Client; + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); +}); + +server("cookie.inc", function($port) use($request) { + $request->setOptions(["port" => $port]); + $client = new http\Client; + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); +}); + +server("cookie.inc", function($port) use($request) { + $request->setOptions(["port" => $port, "cookiesession" => true]); + $client = new http\Client; + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); +}); + +server("cookie.inc", function($port) use($request) { + $request->setOptions(["port" => $port, "cookiesession" => false]); + $client = new http\Client; + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); + echo $client->requeue($request)->send()->getResponse(); +}); + +unlink($tmpfile); + +?> +===DONE=== +--EXPECT-- +Test +HTTP/1.1 200 OK +Set-Cookie: counter=1; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=2; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=3; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=4; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=5; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=6; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=1; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=1; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=1; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=2; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=3; +Etag: "" +X-Original-Transfer-Encoding: chunked +HTTP/1.1 200 OK +Set-Cookie: counter=4; +Etag: "" +X-Original-Transfer-Encoding: chunked +===DONE=== -- 2.30.2