This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | /* |
||
4 | * (c) Mantas Varatiejus <[email protected]> |
||
5 | * |
||
6 | * For the full copyright and license information, please view the LICENSE |
||
7 | * file that was distributed with this source code. |
||
8 | */ |
||
9 | |||
10 | namespace MVar\Apache2LogParser\Tests; |
||
11 | |||
12 | use MVar\Apache2LogParser\AccessLogParser; |
||
13 | |||
14 | /** |
||
15 | * @covers \MVar\Apache2LogParser\AccessLogParser |
||
16 | */ |
||
17 | class AccessLogParserTest extends \PHPUnit_Framework_TestCase |
||
18 | { |
||
19 | /** |
||
20 | * Test for parseLine(). |
||
21 | * |
||
22 | * @param string $format |
||
23 | * @param string $logLine |
||
24 | * @param array $expectedResult |
||
25 | * |
||
26 | * @dataProvider getTestParseLineData() |
||
27 | */ |
||
28 | public function testParseLine($format, $logLine, $expectedResult) |
||
29 | { |
||
30 | $parser = new AccessLogParser($format); |
||
31 | $result = $parser->parseLine($logLine); |
||
32 | |||
33 | $this->assertEquals($expectedResult, $result); |
||
34 | } |
||
35 | |||
36 | /** |
||
37 | * Test for parseLine() if pattern is cached. |
||
38 | */ |
||
39 | public function testParseLineCachedPattern() |
||
40 | { |
||
41 | /** @var \PHPUnit_Framework_MockObject_MockObject|AccessLogParser $parser */ |
||
42 | $parser = $this->getMock( |
||
43 | '\\MVar\\Apache2LogParser\\AccessLogParser', |
||
44 | ['getCallbackPatterns'], |
||
45 | ['%%'] |
||
46 | ); |
||
47 | |||
48 | $parser->expects($this->once())->method('getCallbackPatterns'); |
||
0 ignored issues
–
show
|
|||
49 | |||
50 | $parser->parseLine('%'); |
||
0 ignored issues
–
show
The method
parseLine does only exist in MVar\Apache2LogParser\AccessLogParser , but not in PHPUnit_Framework_MockObject_MockObject .
It seems like the method you are trying to call exists only in some of the possible types. Let’s take a look at an example: class A
{
public function foo() { }
}
class B extends A
{
public function bar() { }
}
/**
* @param A|B $x
*/
function someFunction($x)
{
$x->foo(); // This call is fine as the method exists in A and B.
$x->bar(); // This method only exists in B and might cause an error.
}
Available Fixes
![]() |
|||
51 | |||
52 | // Pattern should be cached |
||
53 | $parser->parseLine('%'); |
||
54 | } |
||
55 | |||
56 | /** |
||
57 | * Test for parseLine() in case of invalid line. |
||
58 | * |
||
59 | * @param string $format |
||
60 | * @param string $logLine |
||
61 | * |
||
62 | * @dataProvider getTestParseLineNoMatchesData() |
||
63 | * @expectedException \MVar\Apache2LogParser\Exception\NoMatchesException |
||
64 | * @expectedExceptionMessage line does not match |
||
65 | */ |
||
66 | public function testParseLineNoMatches($format, $logLine) |
||
67 | { |
||
68 | $parser = new AccessLogParser($format); |
||
69 | $parser->parseLine($logLine); |
||
70 | } |
||
71 | |||
72 | /** |
||
73 | * Data provider for testParseLine(). |
||
74 | * |
||
75 | * @return array[] |
||
76 | */ |
||
77 | public function getTestParseLineData() |
||
78 | { |
||
79 | return [ |
||
80 | [ |
||
81 | AccessLogParser::FORMAT_COMMON, |
||
82 | '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326', |
||
83 | [ |
||
84 | 'remote_host' => '127.0.0.1', |
||
85 | 'identity' => '-', |
||
86 | 'remote_user' => 'frank', |
||
87 | 'time' => '10/Oct/2000:13:55:36 -0700', |
||
88 | 'request_line' => 'GET /apache_pb.gif HTTP/1.0', |
||
89 | 'request' => [ |
||
90 | 'method' => 'GET', |
||
91 | 'path' => '/apache_pb.gif', |
||
92 | 'protocol' => 'HTTP/1.0' |
||
93 | ], |
||
94 | 'response_code' => '200', |
||
95 | 'bytes_sent' => '2326', |
||
96 | ], |
||
97 | ], |
||
98 | [ |
||
99 | AccessLogParser::FORMAT_COMBINED, |
||
100 | '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 ' . |
||
101 | '"http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"', |
||
102 | [ |
||
103 | 'remote_host' => '127.0.0.1', |
||
104 | 'identity' => '-', |
||
105 | 'remote_user' => 'frank', |
||
106 | 'time' => '10/Oct/2000:13:55:36 -0700', |
||
107 | 'request_line' => 'GET /apache_pb.gif HTTP/1.0', |
||
108 | 'request' => [ |
||
109 | 'method' => 'GET', |
||
110 | 'path' => '/apache_pb.gif', |
||
111 | 'protocol' => 'HTTP/1.0', |
||
112 | ], |
||
113 | 'response_code' => '200', |
||
114 | 'bytes_sent' => '2326', |
||
115 | 'request_headers' => [ |
||
116 | 'Referer' => 'http://www.example.com/start.html', |
||
117 | 'User-Agent' => 'Mozilla/4.08 [en] (Win98; I ;Nav)', |
||
118 | ], |
||
119 | ], |
||
120 | ], |
||
121 | [ |
||
122 | AccessLogParser::FORMAT_COMBINED, |
||
123 | '127.0.0.1 - - [28/Dec/2013:19:03:49 +0200] "GET /test-page/ HTTP/1.1" ' . |
||
124 | '200 8359 "-" "Symfony2 BrowserKit"', |
||
125 | [ |
||
126 | 'remote_host' => '127.0.0.1', |
||
127 | 'identity' => '-', |
||
128 | 'remote_user' => '-', |
||
129 | 'time' => '28/Dec/2013:19:03:49 +0200', |
||
130 | 'request_line' => 'GET /test-page/ HTTP/1.1', |
||
131 | 'request' => [ |
||
132 | 'method' => 'GET', |
||
133 | 'path' => '/test-page/', |
||
134 | 'protocol' => 'HTTP/1.1', |
||
135 | ], |
||
136 | 'response_code' => '200', |
||
137 | 'bytes_sent' => '8359', |
||
138 | 'request_headers' => [ |
||
139 | 'Referer' => '-', |
||
140 | 'User-Agent' => 'Symfony2 BrowserKit', |
||
141 | ], |
||
142 | ], |
||
143 | ], |
||
144 | [ |
||
145 | AccessLogParser::FORMAT_COMBINED, |
||
146 | '66.249.78.230 - - [29/Dec/2013:16:07:58 +0200] "GET /robots.txt HTTP/1.1" ' . |
||
147 | '200 408 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"', |
||
148 | [ |
||
149 | 'remote_host' => '66.249.78.230', |
||
150 | 'identity' => '-', |
||
151 | 'remote_user' => '-', |
||
152 | 'time' => '29/Dec/2013:16:07:58 +0200', |
||
153 | 'request_line' => 'GET /robots.txt HTTP/1.1', |
||
154 | 'request' => [ |
||
155 | 'method' => 'GET', |
||
156 | 'path' => '/robots.txt', |
||
157 | 'protocol' => 'HTTP/1.1', |
||
158 | ], |
||
159 | 'response_code' => '200', |
||
160 | 'bytes_sent' => '408', |
||
161 | 'request_headers' => [ |
||
162 | 'Referer' => '-', |
||
163 | 'User-Agent' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', |
||
164 | ], |
||
165 | ], |
||
166 | ], |
||
167 | [ |
||
168 | AccessLogParser::FORMAT_COMBINED, |
||
169 | '71.82.1.1 - - [29/Dec/2013:17:37:40 +0200] "GET / HTTP/1.1" 200 2577 "http://example.com/test/" ' . |
||
170 | '"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"', |
||
171 | [ |
||
172 | 'remote_host' => '71.82.1.1', |
||
173 | 'identity' => '-', |
||
174 | 'remote_user' => '-', |
||
175 | 'time' => '29/Dec/2013:17:37:40 +0200', |
||
176 | 'request_line' => 'GET / HTTP/1.1', |
||
177 | 'request' => [ |
||
178 | 'method' => 'GET', |
||
179 | 'path' => '/', |
||
180 | 'protocol' => 'HTTP/1.1', |
||
181 | ], |
||
182 | 'response_code' => '200', |
||
183 | 'bytes_sent' => '2577', |
||
184 | 'request_headers' => [ |
||
185 | 'Referer' => 'http://example.com/test/', |
||
186 | 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko', |
||
187 | ], |
||
188 | ], |
||
189 | ], |
||
190 | [ |
||
191 | AccessLogParser::FORMAT_COMBINED, |
||
192 | // HTTP error 408 "Request Timeout" |
||
193 | '192.168.25.1 - - [25/Jun/2012:14:00:14 -0700] "-" 408 0 "-" "-"', |
||
194 | [ |
||
195 | 'remote_host' => '192.168.25.1', |
||
196 | 'identity' => '-', |
||
197 | 'remote_user' => '-', |
||
198 | 'time' => '25/Jun/2012:14:00:14 -0700', |
||
199 | 'request_line' => '-', |
||
200 | 'response_code' => '408', |
||
201 | 'request_headers' => [ |
||
202 | 'Referer' => '-', |
||
203 | 'User-Agent' => '-', |
||
204 | ], |
||
205 | ] |
||
206 | ], |
||
207 | [ |
||
208 | AccessLogParser::FORMAT_COMBINED, |
||
209 | // HTTP error 414 "Request URI too long" |
||
210 | '192.168.139.1 - - [10/Oct/2013:00:26:32 +0300] "GET /' . str_repeat('a', 7995) . '" 414 540 "-" "-"', |
||
211 | [ |
||
212 | 'remote_host' => '192.168.139.1', |
||
213 | 'identity' => '-', |
||
214 | 'remote_user' => '-', |
||
215 | 'time' => '10/Oct/2013:00:26:32 +0300', |
||
216 | 'request_line' => 'GET /' . str_repeat('a', 7995), |
||
217 | 'request' => [ |
||
218 | 'method' => 'GET', |
||
219 | 'path' => '/' . str_repeat('a', 7995), |
||
220 | ], |
||
221 | 'response_code' => '414', |
||
222 | 'bytes_sent' => '540', |
||
223 | 'request_headers' => [ |
||
224 | 'Referer' => '-', |
||
225 | 'User-Agent' => '-', |
||
226 | ], |
||
227 | ] |
||
228 | ], |
||
229 | [ |
||
230 | AccessLogParser::FORMAT_COMBINED, |
||
231 | // When no bytes were sent |
||
232 | '74.86.158.106 - - [09/Jan/2014:04:11:40 -0800] "HEAD / HTTP/1.1" 200 - "-" ' . |
||
233 | '"Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)"', |
||
234 | [ |
||
235 | 'remote_host' => '74.86.158.106', |
||
236 | 'identity' => '-', |
||
237 | 'remote_user' => '-', |
||
238 | 'time' => '09/Jan/2014:04:11:40 -0800', |
||
239 | 'request_line' => 'HEAD / HTTP/1.1', |
||
240 | 'request' => [ |
||
241 | 'method' => 'HEAD', |
||
242 | 'path' => '/', |
||
243 | 'protocol' => 'HTTP/1.1', |
||
244 | ], |
||
245 | 'response_code' => '200', |
||
246 | 'bytes_sent' => '-', |
||
247 | 'request_headers' => [ |
||
248 | 'Referer' => '-', |
||
249 | 'User-Agent' => 'Mozilla/5.0+(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)', |
||
250 | ], |
||
251 | ], |
||
252 | ], |
||
253 | [ |
||
254 | AccessLogParser::FORMAT_COMBINED, |
||
255 | '12.34.56.78 - - [06/Feb/2014:02:00:18 -0800] "GET / HTTP/1.1" 200 2151 "" "-"', |
||
256 | [ |
||
257 | 'remote_host' => '12.34.56.78', |
||
258 | 'identity' => '-', |
||
259 | 'remote_user' => '-', |
||
260 | 'time' => '06/Feb/2014:02:00:18 -0800', |
||
261 | 'request_line' => 'GET / HTTP/1.1', |
||
262 | 'request' => [ |
||
263 | 'method' => 'GET', |
||
264 | 'path' => '/', |
||
265 | 'protocol' => 'HTTP/1.1', |
||
266 | ], |
||
267 | 'response_code' => '200', |
||
268 | 'bytes_sent' => '2151', |
||
269 | 'request_headers' => [ |
||
270 | 'User-Agent' => '-', |
||
271 | ], |
||
272 | ], |
||
273 | ], |
||
274 | [ |
||
275 | AccessLogParser::FORMAT_COMBINED, |
||
276 | '12.34.56.78 - - [20/May/2014:17:21:57 -0700] "GET /test/ HTTP/1.1" 200 1680 ' . |
||
277 | '"http://search.yahoo.com/search?p=what color" "Mozilla/5.0"', |
||
278 | [ |
||
279 | 'remote_host' => '12.34.56.78', |
||
280 | 'identity' => '-', |
||
281 | 'remote_user' => '-', |
||
282 | 'time' => '20/May/2014:17:21:57 -0700', |
||
283 | 'request_line' => 'GET /test/ HTTP/1.1', |
||
284 | 'request' => [ |
||
285 | 'method' => 'GET', |
||
286 | 'path' => '/test/', |
||
287 | 'protocol' => 'HTTP/1.1', |
||
288 | ], |
||
289 | 'response_code' => '200', |
||
290 | 'bytes_sent' => '1680', |
||
291 | 'request_headers' => [ |
||
292 | 'User-Agent' => 'Mozilla/5.0', |
||
293 | 'Referer' => 'http://search.yahoo.com/search?p=what color', |
||
294 | ], |
||
295 | ], |
||
296 | ], |
||
297 | [ |
||
298 | AccessLogParser::FORMAT_VHOST_COMBINED, |
||
299 | '127.0.1.1:80 127.0.0.1 - - [26/Jun/2012:10:41:10 -0700] "OPTIONS * HTTP/1.0" 200 126 "-" ' . |
||
300 | '"Apache/2.2.22 (Ubuntu) (internal dummy connection)"', |
||
301 | [ |
||
302 | 'canonical_server_name' => '127.0.1.1', |
||
303 | 'server_port' => '80', |
||
304 | 'remote_host' => '127.0.0.1', |
||
305 | 'identity' => '-', |
||
306 | 'remote_user' => '-', |
||
307 | 'time' => '26/Jun/2012:10:41:10 -0700', |
||
308 | 'request_line' => 'OPTIONS * HTTP/1.0', |
||
309 | 'request' => [ |
||
310 | 'method' => 'OPTIONS', |
||
311 | 'path' => '*', |
||
312 | 'protocol' => 'HTTP/1.0', |
||
313 | ], |
||
314 | 'response_code' => '200', |
||
315 | 'bytes_sent' => '126', |
||
316 | 'request_headers' => [ |
||
317 | 'Referer' => '-', |
||
318 | 'User-Agent' => 'Apache/2.2.22 (Ubuntu) (internal dummy connection)', |
||
319 | ], |
||
320 | ], |
||
321 | ], |
||
322 | [ |
||
323 | // Test for percent sign |
||
324 | '%% test', |
||
325 | '% test', |
||
326 | [], |
||
327 | ], |
||
328 | [ |
||
329 | // Test for full port support |
||
330 | '%{canonical}p %{local}p %{remote}p test', |
||
331 | '123 456 789 test', |
||
332 | [ |
||
333 | 'canonical_port' => 123, |
||
334 | 'local_port' => 456, |
||
335 | 'remote_port' => 789, |
||
336 | ], |
||
337 | ], |
||
338 | [ |
||
339 | // Test for status code of the original request |
||
340 | '%s', |
||
341 | '201', |
||
342 | [ |
||
343 | 'original_status_code' => 201, |
||
344 | ], |
||
345 | ], |
||
346 | [ |
||
347 | // Test for Size of response in bytes, excluding HTTP headers. In CLF format |
||
348 | '%b', |
||
349 | '-', |
||
350 | [ |
||
351 | 'response_body_size' => 0, |
||
352 | ], |
||
353 | ], |
||
354 | [ |
||
355 | // Test for predefined User-Agent format |
||
356 | AccessLogParser::FORMAT_AGENT, |
||
357 | 'Symfony2 BrowserKit', |
||
358 | [ |
||
359 | 'request_headers' => [ |
||
360 | 'User-Agent' => 'Symfony2 BrowserKit', |
||
361 | ], |
||
362 | ], |
||
363 | ], |
||
364 | [ |
||
365 | // Test for request method |
||
366 | '%m', |
||
367 | 'POST', |
||
368 | [ |
||
369 | 'request_method' => 'POST', |
||
370 | ], |
||
371 | ], |
||
372 | [ |
||
373 | // Test for request serve time |
||
374 | '%D %T', |
||
375 | '123 456', |
||
376 | [ |
||
377 | 'request_time_us' => '123', |
||
378 | 'request_time_s' => '456', |
||
379 | ], |
||
380 | ], |
||
381 | [ |
||
382 | // Test for URL path |
||
383 | '%U', |
||
384 | '/path', |
||
385 | [ |
||
386 | 'request_path' => '/path', |
||
387 | ], |
||
388 | ], |
||
389 | [ |
||
390 | // Test for URL path and query string |
||
391 | '%U%q', |
||
392 | '/path?googleguy=googley', |
||
393 | [ |
||
394 | 'request_path' => '/path', |
||
395 | 'query_string' => '?googleguy=googley', |
||
396 | ], |
||
397 | ], |
||
398 | [ |
||
399 | // Test for bytes received and transferred |
||
400 | '%I %S', |
||
401 | '123 456', |
||
402 | [ |
||
403 | 'bytes_received' => '123', |
||
404 | 'bytes_transferred' => '456', |
||
405 | ], |
||
406 | ], |
||
407 | [ |
||
408 | // Test for predefined referer log format |
||
409 | AccessLogParser::FORMAT_REFERER, |
||
410 | 'http://www.example.com/ -> /my-page/', |
||
411 | [ |
||
412 | 'request_headers' => [ |
||
413 | 'Referer' => 'http://www.example.com/', |
||
414 | ], |
||
415 | 'request_path' => '/my-page/', |
||
416 | ], |
||
417 | ], |
||
418 | [ |
||
419 | // Test for request protocol |
||
420 | '%H', |
||
421 | 'HTTP/1.0', |
||
422 | [ |
||
423 | 'request_protocol' => 'HTTP/1.0', |
||
424 | ], |
||
425 | ], |
||
426 | [ |
||
427 | // Test for local IP address |
||
428 | '%A', |
||
429 | '192.168.5.128', |
||
430 | [ |
||
431 | 'local_ip' => '192.168.5.128', |
||
432 | ], |
||
433 | ], |
||
434 | [ |
||
435 | // Test for client IP address |
||
436 | '%a', |
||
437 | '192.168.5.1', |
||
438 | [ |
||
439 | 'client_ip' => '192.168.5.1', |
||
440 | ], |
||
441 | ], |
||
442 | [ |
||
443 | // Test for real client IP address (e.g. when proxy is used) |
||
444 | '%{c}a', |
||
445 | '192.168.5.55', |
||
446 | [ |
||
447 | 'peer_ip' => '192.168.5.55', |
||
448 | ], |
||
449 | ], |
||
450 | [ |
||
451 | // Test for cookies |
||
452 | '"%{cookie1}C" "%{cookie_2}C"', |
||
453 | '"cookie1 contents" "cookie_2 contents"', |
||
454 | [ |
||
455 | 'cookies' => [ |
||
456 | 'cookie1' => 'cookie1 contents', |
||
457 | 'cookie_2' => 'cookie_2 contents', |
||
458 | ], |
||
459 | ], |
||
460 | ], |
||
461 | [ |
||
462 | // Test for filename |
||
463 | '"%f"', |
||
464 | '"/home/user/public_html/favicon.ico"', |
||
465 | [ |
||
466 | 'filename' => '/home/user/public_html/favicon.ico', |
||
467 | ], |
||
468 | ], |
||
469 | [ |
||
470 | // Test for connection status |
||
471 | '%X', |
||
472 | '+', |
||
473 | [ |
||
474 | 'connection_status' => '+', |
||
475 | ], |
||
476 | ], |
||
477 | [ |
||
478 | // Test for environment variables |
||
479 | '"%{CUSTOM_VARIABLE}e"', |
||
480 | '"custom variable contents"', |
||
481 | [ |
||
482 | 'env_vars' => [ |
||
483 | 'CUSTOM_VARIABLE' => 'custom variable contents', |
||
484 | ], |
||
485 | ], |
||
486 | ], |
||
487 | [ |
||
488 | // Test for response headers |
||
489 | '%{Content-Length}o', |
||
490 | '1553', |
||
491 | [ |
||
492 | 'response_headers' => [ |
||
493 | 'Content-Length' => '1553', |
||
494 | ], |
||
495 | ], |
||
496 | ], |
||
497 | [ |
||
498 | // Test for response headers |
||
499 | '%{Content-Length}o "%{Content-Encoding}o"', |
||
500 | '1553 "gzip"', |
||
501 | [ |
||
502 | 'response_headers' => [ |
||
503 | 'Content-Length' => '1553', |
||
504 | 'Content-Encoding' => 'gzip', |
||
505 | ], |
||
506 | ], |
||
507 | ], |
||
508 | [ |
||
509 | // Test for module notes |
||
510 | '%{outstream}n/%{instream}n (%{ratio}n%%)', |
||
511 | '512/1024 (50%)', |
||
512 | [ |
||
513 | 'mod_vars' => [ |
||
514 | 'outstream' => '512', |
||
515 | 'instream' => '1024', |
||
516 | 'ratio' => '50', |
||
517 | ], |
||
518 | ], |
||
519 | ], |
||
520 | [ |
||
521 | // Test for the server name |
||
522 | '%V', |
||
523 | 'www.domain.tld', |
||
524 | [ |
||
525 | 'server_name' => 'www.domain.tld', |
||
526 | ], |
||
527 | ], |
||
528 | [ |
||
529 | // Test for number of keep-alive requests handled on this connection |
||
530 | '%k', |
||
531 | '2', |
||
532 | [ |
||
533 | 'keepalive_requests' => '2', |
||
534 | ], |
||
535 | ], |
||
536 | [ |
||
537 | // Test for process and thread ID |
||
538 | '%P %{pid}P %{tid}P %{hextid}P', |
||
539 | '229 12 34 56', |
||
540 | [ |
||
541 | 'process_id' => '229', |
||
542 | 'pid' => '12', |
||
543 | 'tid' => '34', |
||
544 | 'hextid' => '56', |
||
545 | ], |
||
546 | ], |
||
547 | [ |
||
548 | // Test for the request log ID |
||
549 | '%L', |
||
550 | '55', |
||
551 | [ |
||
552 | 'log_id' => '55', |
||
553 | ], |
||
554 | ], |
||
555 | [ |
||
556 | // Test for the handler generating the response |
||
557 | '%R', |
||
558 | 'application/x-httpd-php', |
||
559 | [ |
||
560 | 'response_handler' => 'application/x-httpd-php', |
||
561 | ], |
||
562 | ], |
||
563 | // Check if format string quoting works correctly |
||
564 | ['%z/%z', '%z/%z', []], |
||
565 | ['{%{test}z}', '{%{test}z}', []], |
||
566 | ['{%{test}z}*', '{%{test}z}*', []], |
||
567 | ['{%{test}z}/%z', '{%{test}z}/%z', []], |
||
568 | ['{%{test}z}/%z-%>z', '{%{test}z}/%z-%>z', []], |
||
569 | ['{%{test}z}/%z-(%>z)', '{%{test}z}/%z-(%>z)', []], |
||
570 | // Also do not quote directives with modifiers |
||
571 | ['%>{test}z', '%>{test}z', []], |
||
572 | ['%<{test}z', '%<{test}z', []], |
||
573 | ['%200{test}z', '%200{test}z', []], |
||
574 | ['%!200{test}z', '%!200{test}z', []], |
||
575 | ['%200,201{test}z', '%200,201{test}z', []], |
||
576 | ['%!200,201{test}z', '%!200,201{test}z', []], |
||
577 | ]; |
||
578 | } |
||
579 | |||
580 | /** |
||
581 | * Data provider for testParseLineNoMatches(). |
||
582 | * |
||
583 | * @return array[] |
||
584 | */ |
||
585 | public function getTestParseLineNoMatchesData() |
||
586 | { |
||
587 | return [ |
||
588 | ['%b', 'abc'], |
||
589 | ['%B', '-'], |
||
590 | ]; |
||
591 | } |
||
592 | } |
||
593 |
It seems like the method you are trying to call exists only in some of the possible types.
Let’s take a look at an example:
Available Fixes
Add an additional type-check:
Only allow a single type to be passed if the variable comes from a parameter: