don't create persistent easy handles for non-persistent multi handles
authorMichael Wallner <mike@php.net>
Thu, 12 Feb 2015 10:14:31 +0000 (11:14 +0100)
committerMichael Wallner <mike@php.net>
Thu, 12 Feb 2015 10:14:31 +0000 (11:14 +0100)
php_http_client_curl.c
tests/client021.phpt [new file with mode: 0644]

index a41075c..e0994cf 100644 (file)
@@ -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 (file)
index 0000000..41a220a
--- /dev/null
@@ -0,0 +1,105 @@
+--TEST--
+client cookies
+--SKIPIF--
+<?php 
+include "skipif.inc";
+skip_client_test();
+?>
+--FILE--
+<?php 
+
+include "helper/server.inc";
+
+echo "Test\n";
+
+$tmpfile = tempnam(sys_get_temp_dir(), "cookie.");
+$request = new http\Client\Request("GET", "http://localhost");
+$request->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===