Passed
Push — master ( 18eded...8ccda3 )
by Gaetano
12:44
created

HTTPTest::testTimeout()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 14
nc 1
nop 1
dl 0
loc 23
rs 9.7998
c 0
b 0
f 0
1
<?php
2
3
include_once __DIR__ . '/08ServerTest.php';
4
5
/**
6
 * Tests which stress http features of the library.
7
 * Each of these tests iterates over (almost) all the 'Server' tests
8
 */
9
class HTTPTest extends ServerTest
10
{
11
    protected $expectHttp2 = false;
12
13
    protected $unsafeMethods = array(
14
        'testCatchExceptions', 'testCatchErrors', 'testUtf8Method', 'testServerComments',
15
        'testExoticCharsetsRequests', 'testExoticCharsetsRequests2', 'testExoticCharsetsRequests3',
16
        'testWrapInexistentUrl', 'testNegativeDebug', 'testTimeout'
17
    );
18
19
    /**
20
     * Returns all test methods from the base class, except the ones which failed already and the ones which make no sense
21
     * to run with different HTTP options.
22
     *
23
     * @todo (re)introduce skipping of tests which failed when executed individually even if test runs happen as separate processes
24
     * @todo reintroduce skipping of tests within the loop
25
     * @todo testTimeout is actually good to be tested with proxies etc - but it slows down the testsuite a lot!
26
     */
27
    public function getSingleHttpTestMethods()
28
    {
29
        $methods = array();
30
        // as long as we are descendants, get_class_methods will list private/protected methods
31
        foreach(get_class_methods('ServerTest') as $method)
32
        {
33
            if (strpos($method, 'test') === 0 && !in_array($method, $this->unsafeMethods))
34
            {
35
                if (!isset(self::$failed_tests[$method])) {
36
                    $methods[$method] = array($method);
37
                }
38
            }
39
        }
40
41
        return $methods;
42
    }
43
44
    /**
45
     * @dataProvider getSingleHttpTestMethods
46
     * @param string $method
47
     */
48
    public function testDeflate($method)
49
    {
50
        if (!function_exists('gzdeflate'))
51
        {
52
            $this->markTestSkipped('Zlib missing: cannot test deflate functionality');
53
            return;
54
        }
55
56
        $this->client->accepted_compression = array('deflate');
0 ignored issues
show
Bug Best Practice introduced by
The property $accepted_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
57
        $this->client->request_compression = 'deflate';
0 ignored issues
show
Bug Best Practice introduced by
The property $request_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
58
59
        $this->$method();
60
    }
61
62
    /**
63
     * @dataProvider getSingleHttpTestMethods
64
     * @param string $method
65
     */
66
    public function testGzip($method)
67
    {
68
        if (!function_exists('gzdeflate'))
69
        {
70
            $this->markTestSkipped('Zlib missing: cannot test gzip functionality');
71
            return;
72
        }
73
74
        $this->client->accepted_compression = array('gzip');
0 ignored issues
show
Bug Best Practice introduced by
The property $accepted_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
75
        $this->client->request_compression = 'gzip';
0 ignored issues
show
Bug Best Practice introduced by
The property $request_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
76
77
        $this->$method();
78
    }
79
80
    public function testKeepAlives()
81
    {
82
        if (!function_exists('curl_init'))
83
        {
84
            $this->markTestSkipped('CURL missing: cannot test http 1.1');
85
            return;
86
        }
87
88
        $this->method = 'http11';
89
        $this->client->method = 'http11';
90
        $this->client->keepalive = true;
0 ignored issues
show
Bug Best Practice introduced by
The property $keepalive is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
91
92
        // to successfully test keepalive, we have to reuse the same client for all tests, we can not recreate one on setup/teardown...
93
        foreach ($this->getSingleHttpTestMethods() as $methods) {
94
            $method = $methods[0];
95
            $this->$method();
96
        }
97
    }
98
99
    /**
100
     * @dataProvider getSingleHttpTestMethods
101
     * @param string $method
102
     */
103
    public function testRedirects($method)
104
    {
105
        if (!function_exists('curl_init'))
106
        {
107
            $this->markTestSkipped('CURL missing: cannot test redirects');
108
            return;
109
        }
110
111
        /// @todo replace with setOption when dropping the BC layer
112
        $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_ALWAYS);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setUseCurl() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

112
        /** @scrutinizer ignore-deprecated */ $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_ALWAYS);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
113
        $this->client->setCurlOptions(array(CURLOPT_FOLLOWLOCATION => true, CURLOPT_POSTREDIR => 3));
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setCurlOptions() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

113
        /** @scrutinizer ignore-deprecated */ $this->client->setCurlOptions(array(CURLOPT_FOLLOWLOCATION => true, CURLOPT_POSTREDIR => 3));

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
114
115
        $this->$method();
116
    }
117
118
    public function testAcceptCharset()
119
    {
120
        if (version_compare(PHP_VERSION, '5.6.0', '<'))
121
        {
122
            $this->markTestSkipped('Cannot test accept-charset on php < 5.6');
123
            return;
124
        }
125
        if (!function_exists('mb_list_encodings'))
126
        {
127
            $this->markTestSkipped('mbstring missing: cannot test accept-charset');
128
            return;
129
        }
130
131
        $r = new \PhpXmlRpc\Request('examples.stringecho', array(new \PhpXmlRpc\Value('€')));
132
        //chr(164)
133
134
        \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding = 'UTF-8';
135
136
        $this->addQueryParams(array('RESPONSE_ENCODING' => 'auto'));
137
        $this->client->accepted_charset_encodings = array(
0 ignored issues
show
Bug Best Practice introduced by
The property $accepted_charset_encodings is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
138
            'utf-1234;q=0.1',
139
            'windows-1252;q=0.8'
140
        );
141
        $v = $this->send($r, 0, true);
142
        $h = $v->httpResponse();
143
        $this->assertEquals('text/xml; charset=Windows-1252', $h['headers']['content-type']);
144
        if ($v) {
145
            $this->assertEquals('€', $v->value()->scalarval());
146
        }
147
    }
148
149
    /**
150
     * @dataProvider getSingleHttpTestMethods
151
     * @param string $method
152
     */
153
    public function testProxy($method)
154
    {
155
        if ($this->args['PROXYSERVER'] == '')
156
        {
157
            $this->markTestSkipped('PROXYSERVER definition missing: cannot test proxy');
158
            return;
159
        }
160
161
        $this->client->setProxy($this->args['PROXYSERVER'], $this->args['PROXYPORT']);
162
163
        $this->$method();
164
    }
165
166
    /**
167
     * @dataProvider getSingleHttpTestMethods
168
     * @param string $method
169
     */
170
    public function testHttp11($method)
171
    {
172
        if (!function_exists('curl_init'))
173
        {
174
            $this->markTestSkipped('CURL missing: cannot test http 1.1');
175
            return;
176
        }
177
178
        $this->method = 'http11'; // not an error the double assignment!
179
        $this->client->method = 'http11';
180
        $this->client->keepalive = false;
0 ignored issues
show
Bug Best Practice introduced by
The property $keepalive is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
181
182
        $this->$method();
183
    }
184
185
    /**
186
     * @dataProvider getSingleHttpTestMethods
187
     * @param string $method
188
     */
189
    public function testHttp10Curl($method)
190
    {
191
        if (!function_exists('curl_init'))
192
        {
193
            $this->markTestSkipped('CURL missing: cannot test http 1.1');
194
            return;
195
        }
196
197
        $this->method = 'http10'; // not an error the double assignment!
198
        $this->client->method = 'http10';
199
        /// @todo replace with setOption when dropping the BC layer
200
        $this->client->keepalive = false;
0 ignored issues
show
Bug Best Practice introduced by
The property $keepalive is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
201
        $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_ALWAYS);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setUseCurl() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

201
        /** @scrutinizer ignore-deprecated */ $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_ALWAYS);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
202
203
        $this->$method();
204
    }
205
206
    /**
207
     * @dataProvider getSingleHttpTestMethods
208
     * @param string $method
209
     */
210
    public function testHttp11Gzip($method)
211
    {
212
        if (!function_exists('curl_init'))
213
        {
214
            $this->markTestSkipped('CURL missing: cannot test http 1.1');
215
            return;
216
        }
217
        $this->method = 'http11'; // not an error the double assignment!
218
        $this->client->method = 'http11';
219
        $this->client->keepalive = false;
0 ignored issues
show
Bug Best Practice introduced by
The property $keepalive is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
220
        $this->client->accepted_compression = array('gzip');
0 ignored issues
show
Bug Best Practice introduced by
The property $accepted_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
221
        $this->client->request_compression = 'gzip';
0 ignored issues
show
Bug Best Practice introduced by
The property $request_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
222
223
        $this->$method();
224
    }
225
226
    /**
227
     * @dataProvider getSingleHttpTestMethods
228
     * @param string $method
229
     */
230
    public function testHttp11Deflate($method)
231
    {
232
        if (!function_exists('curl_init'))
233
        {
234
            $this->markTestSkipped('CURL missing: cannot test http 1.1');
235
            return;
236
        }
237
        $this->method = 'http11'; // not an error the double assignment!
238
        $this->client->method = 'http11';
239
        $this->client->keepalive = false;
0 ignored issues
show
Bug Best Practice introduced by
The property $keepalive is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
240
        $this->client->accepted_compression = array('deflate');
0 ignored issues
show
Bug Best Practice introduced by
The property $accepted_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
241
        $this->client->request_compression = 'deflate';
0 ignored issues
show
Bug Best Practice introduced by
The property $request_compression is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
242
243
        $this->$method();
244
    }
245
246
    /**
247
     * @dataProvider getSingleHttpTestMethods
248
     * @param string $method
249
     */
250
    public function testHttp11Proxy($method)
251
    {
252
        if (!function_exists('curl_init'))
253
        {
254
            $this->markTestSkipped('CURL missing: cannot test http 1.1 w. proxy');
255
            return;
256
        }
257
        else if ($this->args['PROXYSERVER'] == '')
258
        {
259
            $this->markTestSkipped('PROXYSERVER definition missing: cannot test proxy w. http 1.1');
260
            return;
261
        }
262
263
        $this->method = 'http11'; // not an error the double assignment!
264
        $this->client->method = 'http11';
265
        $this->client->setProxy($this->args['PROXYSERVER'], $this->args['PROXYPORT']);
266
        $this->client->keepalive = false;
0 ignored issues
show
Bug Best Practice introduced by
The property $keepalive is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
267
268
        $this->$method();
269
    }
270
271
    /**
272
     * @dataProvider getSingleHttpTestMethods
273
     * @param string $method
274
     */
275
    public function testHttps($method)
276
    {
277
        if (!function_exists('curl_init'))
278
        {
279
            $this->markTestSkipped('CURL missing: cannot test https functionality');
280
            return;
281
        }
282
        else if ($this->args['HTTPSSERVER'] == '')
283
        {
284
            $this->markTestSkipped('HTTPS SERVER definition missing: cannot test https');
285
            return;
286
        }
287
288
        $this->client->server = $this->args['HTTPSSERVER'];
289
        $this->method = 'https';
290
        $this->client->method = 'https';
291
        $this->client->path = $this->args['HTTPSURI'];
292
        /// @todo replace with setOptions when dropping the BC layer
293
        $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyPeer() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

293
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
294
        $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyHost() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

294
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
295
        $this->client->setSSLVersion($this->args['SSLVERSION']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVersion() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

295
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVersion($this->args['SSLVERSION']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
296
        if (version_compare(PHP_VERSION, '8.0', '>=') && $this->args['SSLVERSION'] == 0)
297
        {
298
            $version = explode('.', PHP_VERSION);
299
            $this->client->setSSLVersion(min(4 + $version[1], 7));
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVersion() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

299
            /** @scrutinizer ignore-deprecated */ $this->client->setSSLVersion(min(4 + $version[1], 7));

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
300
        }
301
302
        $this->$method();
303
    }
304
305
    /**
306
     * @dataProvider getSingleHttpTestMethods
307
     * @param string $method
308
     */
309
    public function testHttpsSocket($method)
310
    {
311
        if ($this->args['HTTPSSERVER'] == '')
312
        {
313
            $this->markTestSkipped('HTTPS SERVER definition missing: cannot test https');
314
            return;
315
        }
316
317
        /// @todo investigate: can we make this work?
318
        if (version_compare(PHP_VERSION, '7.2', '<'))
319
        {
320
            if (is_readable('/etc/os-release')) {
321
                $output = file_get_contents('/etc/os-release');
322
                preg_match('/VERSION="?([0-9]+)/', $output, $matches);
323
                $ubuntuVersion = @$matches[1];
324
            } else {
325
                exec('uname -a', $output, $retval);
326
                preg_match('/ubunutu([0-9]+)/', $output[0], $matches);
327
                $ubuntuVersion = @$matches[1];
328
            }
329
            if ($ubuntuVersion >= 20) {
330
                $this->markTestSkipped('HTTPS via Socket known to fail on php less than 7.2 on Ubuntu 20 and higher');
331
                return;
332
            }
333
        }
334
335
        $this->client->server = $this->args['HTTPSSERVER'];
336
        $this->method = 'https';
337
        $this->client->method = 'https';
338
        $this->client->path = $this->args['HTTPSURI'];
339
        /// @todo replace with setOptions when dropping the BC layer
340
        $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyPeer() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

340
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
341
        $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyHost() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

341
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
342
        $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_NEVER);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setUseCurl() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

342
        /** @scrutinizer ignore-deprecated */ $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_NEVER);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
343
        $this->client->setSSLVersion($this->args['SSLVERSION']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVersion() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

343
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVersion($this->args['SSLVERSION']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
344
345
        if (version_compare(PHP_VERSION, '8.1', '>='))
346
        {
347
            $version = explode('.', PHP_VERSION);
348
            $this->client->setOption(\PhpXmlRpc\Client::OPT_EXTRA_SOCKET_OPTS,
349
                array('ssl' => array('security_level' => 2 + $version[1])));
350
            /// @todo we should probably look deeper into the Apache config / ssl version in use to find out why this
351
            ///       does not work well with TLS < 1.2
352
            if ($this->args['SSLVERSION'] == 0) {
353
                $this->client->setSSLVersion(min(5 + $version[1], 7));
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVersion() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

353
                /** @scrutinizer ignore-deprecated */ $this->client->setSSLVersion(min(5 + $version[1], 7));

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
354
            }
355
        }
356
        $this->$method();
357
    }
358
359
    /**
360
     * @dataProvider getSingleHttpTestMethods
361
     * @param string $method
362
     */
363
    public function testHttpsProxy($method)
364
    {
365
        if (!function_exists('curl_init'))
366
        {
367
            $this->markTestSkipped('CURL missing: cannot test https w. proxy');
368
            return;
369
        }
370
        else if ($this->args['PROXYSERVER'] == '')
371
        {
372
            $this->markTestSkipped('PROXYSERVER definition missing: cannot test proxy w. https');
373
            return;
374
        }
375
        else if ($this->args['HTTPSSERVER'] == '')
376
        {
377
            $this->markTestSkipped('HTTPS SERVER definition missing: cannot test https w. proxy');
378
            return;
379
        }
380
381
        $this->method = 'https';
382
        $this->client->method = 'https';
383
        $this->client->server = $this->args['HTTPSSERVER'];
384
        $this->client->path = $this->args['HTTPSURI'];
385
        /// @todo replace with setOptions when dropping the BC layer
386
        $this->client->setProxy($this->args['PROXYSERVER'], $this->args['PROXYPORT']);
387
        $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyPeer() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

387
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
388
        $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyHost() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

388
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
389
        $this->client->setSSLVersion($this->args['SSLVERSION']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVersion() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

389
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVersion($this->args['SSLVERSION']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
390
        if (version_compare(PHP_VERSION, '8.0', '>=') && $this->args['SSLVERSION'] == 0)
391
        {
392
            $version = explode('.', PHP_VERSION);
393
            $this->client->setSSLVersion(min(4 + $version[1], 7));
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVersion() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

393
            /** @scrutinizer ignore-deprecated */ $this->client->setSSLVersion(min(4 + $version[1], 7));

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
394
        }
395
396
        $this->$method();
397
    }
398
399
    /**
400
     * @dataProvider getSingleHttpTestMethods
401
     * @param string $method
402
     */
403
    public function testHttp2NoTls($method)
404
    {
405
        if (!function_exists('curl_init'))
406
        {
407
            $this->markTestSkipped('CURL missing: cannot test http/2');
408
            return;
409
        } else if (!defined('CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE'))
410
        {
411
            $this->markTestSkipped('CURL http/2 support missing: cannot test http/2');
412
            return;
413
        }
414
415
        $this->method = 'h2c'; // not an error the double assignment!
416
        $this->client->method = 'h2c';
417
        //$this->client->keepalive = false; // q: is this a good idea?
418
419
        $this->expectHttp2 = true;
420
        $this->$method();
421
        $this->expectHttp2 = false;
422
    }
423
424
    /**
425
     * @dataProvider getSingleHttpTestMethods
426
     * @param string $method
427
     */
428
    public function testHttp2tls($method)
429
    {
430
        if (!function_exists('curl_init'))
431
        {
432
            $this->markTestSkipped('CURL missing: cannot test http/2 tls');
433
            return;
434
        } else if ($this->args['HTTPSSERVER'] == '')
435
        {
436
            $this->markTestSkipped('HTTPS SERVER definition missing: cannot test http/2 tls');
437
            return;
438
        } else if (!defined('CURL_HTTP_VERSION_2_0'))
439
        {
440
            $this->markTestSkipped('CURL http/2 support missing: cannot test http/2 tls');
441
            return;
442
        }
443
444
        $this->method = 'h2';
445
        $this->client->method = 'h2';
446
        $this->client->server = $this->args['HTTPSSERVER'];
447
        $this->client->path = $this->args['HTTPSURI'];
448
        /// @todo replace with setOptions when dropping the BC layer
449
        $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyPeer() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

449
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
450
        $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVerifyHost() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

450
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
451
        $this->client->setSSLVersion($this->args['SSLVERSION']);
0 ignored issues
show
Deprecated Code introduced by
The function PhpXmlRpc\Client::setSSLVersion() has been deprecated: use setOption ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

451
        /** @scrutinizer ignore-deprecated */ $this->client->setSSLVersion($this->args['SSLVERSION']);

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
452
453
        $this->expectHttp2 = true;
454
        $this->$method();
455
        $this->expectHttp2 = false;
456
    }
457
458
    /**
459
     * @dataProvider getSingleHttpTestMethods
460
     * @param string $method
461
     */
462
    public function testUTF8Responses($method)
463
    {
464
        $this->addQueryParams(array('RESPONSE_ENCODING' => 'UTF-8'));
465
466
        $this->$method();
467
    }
468
469
    /**
470
     * @dataProvider getSingleHttpTestMethods
471
     * @param string $method
472
     */
473
    public function testUTF8Requests($method)
474
    {
475
        $this->client->request_charset_encoding = 'UTF-8';
0 ignored issues
show
Bug Best Practice introduced by
The property $request_charset_encoding is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
476
477
        $this->$method();
478
    }
479
480
    /**
481
     * @dataProvider getSingleHttpTestMethods
482
     * @param string $method
483
     */
484
    public function testISOResponses($method)
485
    {
486
        $this->addQueryParams(array('RESPONSE_ENCODING' => 'ISO-8859-1'));
487
488
        $this->$method();
489
    }
490
491
    /**
492
     * @dataProvider getSingleHttpTestMethods
493
     * @param string $method
494
     */
495
    public function testISORequests($method)
496
    {
497
        $this->client->request_charset_encoding = 'ISO-8859-1';
0 ignored issues
show
Bug Best Practice introduced by
The property $request_charset_encoding is declared protected in PhpXmlRpc\Client. Since you implement __set, consider adding a @property or @property-write.
Loading history...
498
499
        $this->$method();
500
    }
501
502
    /**
503
     * @dataProvider getSingleHttpTestMethods
504
     * @param string $method
505
     */
506
    public function testBasicAuth($method)
507
    {
508
        $this->client->setCredentials('test', 'test');
509
        $this->addQueryParams(array('FORCE_AUTH' => 'Basic'));
510
511
        $this->$method();
512
    }
513
514
    /**
515
     * @dataProvider getSingleHttpTestMethods
516
     * @param string $method
517
     */
518
    public function testDigestAuth($method)
519
    {
520
        if (!function_exists('curl_init'))
521
        {
522
            $this->markTestSkipped('CURL missing: cannot test digest auth functionality');
523
            return;
524
        }
525
526
        $this->client->setCredentials('test', 'test', CURLAUTH_DIGEST);
527
        $this->addQueryParams(array('FORCE_AUTH' => 'Digest'));
528
        $this->method = 'http11';
529
        $this->client->method = 'http11';
530
531
        $this->$method();
532
    }
533
534
    /**
535
     * @dataProvider getAvailableUseCurlOptions
536
     */
537
    public function testTimeout($curlOpt)
538
    {
539
        $this->client->setOption(\PhpXmlRpc\Client::OPT_USE_CURL, $curlOpt);
540
541
        // decrease the timeout to avoid slowing down the testsuite too much
542
        $this->timeout = 3;
543
544
        // the server will wait for 1 second before sending back the response - should pass
545
        $m = new xmlrpcmsg('tests.sleep', array(new xmlrpcval(1, 'int')));
546
        // this checks for a non-failed call
547
        $time = microtime(true);
548
        $this->send($m);
549
        $time = microtime(true) - $time;
550
        $this->assertGreaterThan(1.0, $time);
551
        $this->assertLessThan(2.0, $time);
552
553
        // the server will wait for 5 seconds before sending back the response - fail
554
        $m = new xmlrpcmsg('tests.sleep', array(new xmlrpcval(5, 'int')));
555
        $time = microtime(true);
556
        $r = $this->send($m, array(0, PhpXmlRpc\PhpXmlRpc::$xmlrpcerr['http_error'], PhpXmlRpc\PhpXmlRpc::$xmlrpcerr['curl_fail']));
0 ignored issues
show
Unused Code introduced by
The assignment to $r is dead and can be removed.
Loading history...
557
        $time = microtime(true) - $time;
558
        $this->assertGreaterThan(2.0, $time);
559
        $this->assertLessThan(4.0, $time);
560
561
        /*
562
                // the server will send back the response one chunk per second, waiting 5 seconds in between chunks
563
                // This atm gives different behaviour when in curl (will fail) or socket mode (will pass) ???
564
                $m = new xmlrpcmsg('examples.addtwo', array(new xmlrpcval(1, 'int'), new xmlrpcval(2, 'int')));
565
                $this->addQueryParams(array('SLOW_LORIS' => 5));
566
                $time = microtime(true);
567
                $this->send($m, array(PhpXmlRpc\PhpXmlRpc::$xmlrpcerr['http_error'], PhpXmlRpc\PhpXmlRpc::$xmlrpcerr['curl_fail']));
568
                $time = microtime(true) - $time;
569
        echo "SL 5: ";var_dump($time);
570
571
                // pesky case: the server will send back the response one char per second, taking 10 seconds in total
572
                // This atm gives different behaviour when in curl (will fail) or socket mode (will pass) !!!
573
                $m = new xmlrpcmsg('examples.addtwo', array(new xmlrpcval(1, 'int'), new xmlrpcval(2, 'int')));
574
                $this->addQueryParams(array('SLOW_LORIS' => 1));
575
                $time = microtime(true);
576
                $this->send($m, array(0, PhpXmlRpc\PhpXmlRpc::$xmlrpcerr['http_error'], PhpXmlRpc\PhpXmlRpc::$xmlrpcerr['curl_fail']));
577
                $time = microtime(true) - $time;
578
        echo "SL 1: ";var_dump($time);
579
        */
580
    }
581
582
    /**
583
     * @param \PhpXmlRpc\Response $r
584
     * @return void
585
     */
586
    protected function validateResponse($r)
587
    {
588
        if ($this->expectHttp2) {
589
            $hr = $r->httpResponse();
590
            $this->assertEquals("2", @$hr['protocol_version']);
591
        }
592
    }
593
}
594