Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
96.30% covered (success)
96.30%
26 / 27
66.67% covered (warning)
66.67%
14 / 21
46.67% covered (danger)
46.67%
7 / 15
14.29% covered (danger)
14.29%
1 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
Webservice
96.30% covered (success)
96.30%
26 / 27
66.67% covered (warning)
66.67%
14 / 21
46.67% covered (danger)
46.67%
7 / 15
85.71% covered (warning)
85.71%
6 / 7
43.73
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
5 / 5
66.67% covered (warning)
66.67%
2 / 3
50.00% covered (danger)
50.00%
1 / 2
100.00% covered (success)
100.00%
1 / 1
2.50
 fetch
n/a
0 / 0
n/a
0 / 0
n/a
0 / 0
n/a
0 / 0
0
 numRows
100.00% covered (success)
100.00%
1 / 1
66.67% covered (warning)
66.67%
2 / 3
50.00% covered (danger)
50.00%
1 / 2
100.00% covered (success)
100.00%
1 / 1
2.50
 version
100.00% covered (success)
100.00%
1 / 1
66.67% covered (warning)
66.67%
2 / 3
50.00% covered (danger)
50.00%
1 / 2
100.00% covered (success)
100.00%
1 / 1
2.50
 getIterator
100.00% covered (success)
100.00%
1 / 1
66.67% covered (warning)
66.67%
2 / 3
50.00% covered (danger)
50.00%
1 / 2
100.00% covered (success)
100.00%
1 / 1
2.50
 getFetch
93.33% covered (success)
93.33%
14 / 15
60.00% covered (warning)
60.00%
3 / 5
25.00% covered (danger)
25.00%
1 / 4
0.00% covered (danger)
0.00%
0 / 1
6.80
 fdsnSupportedVersion
100.00% covered (success)
100.00%
3 / 3
66.67% covered (warning)
66.67%
2 / 3
50.00% covered (danger)
50.00%
1 / 2
100.00% covered (success)
100.00%
1 / 1
2.50
 isCurlCloseSupported
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Fdsn\Webservices;
3
4use ArrayIterator;
5use IteratorAggregate;
6use Traversable;
7
8/**
9 * PHP library to access FDSN Webservices and request Catalogs
10 *
11 * @param string     $fdsn_server    Fdns webservice domain name (default: webservices.ms.ingv.it)
12 */
13abstract class Webservice implements IteratorAggregate {
14    /**
15     * @var Base URL to compile with FDSN server url 
16     */ 
17    public const basePath = 'https://%s/fdsnws/event/1';
18
19    /**
20     * @var Default server url
21     */ 
22    public const defaultFdsnServer  = 'webservices.ms.ingv.it';
23
24    /**
25     * @var Max supported version
26     */ 
27    public const fdsnSupportedVersion = '^1.';
28
29    /**
30     * @var Debug print access to each "[method] unixtimestamp"
31     */ 
32    public const debug = false;
33
34    /**
35     * 
36     *
37     */
38    private const curlCloceLatestPhpVersion = 7;
39
40    protected string $fdsnServer;
41    protected string $webserviceFullPath;
42
43    protected array $arrayOfResults = array();
44    protected string $version = '';
45
46    function __construct( string $fdsn_server = self::defaultFdsnServer ){
47        if( self::debug ) printf("[%s] %d \n", __METHOD__, time()); 
48
49        $this->fdsnServer =  $fdsn_server;
50
51        $this->webserviceFullPath = sprintf(self::basePath,
52            $this->fdsnServer
53            );
54    }
55
56    /**
57     * Fetch data from selected FDSN server
58     * 
59     * @return int number of data found
60     */
61    abstract public function fetch():int;
62
63    
64    /**
65     * Return the number of elems found
66     * @return int         The number of elems found
67     */
68    public function numRows():int { if( self::debug ) printf("[%s] %d \n", __METHOD__, time()); return count($this->arrayOfResults); }
69
70
71    /**
72     * Get FDSN running version
73     * @return string FDSN running version (trimmed by newline)
74     */
75    public function version():string{ if( self::debug ) printf("[%s] %d \n", __METHOD__, time()); return $this->version; }
76
77    /**
78     * Iterate over catalogis found
79     * @return array     array of \Fdsn\DataStructure\Catalog obj
80     */
81    public function getIterator():Traversable { if( self::debug ) printf("[%s] %d \n", __METHOD__, time()); return new ArrayIterator($this->arrayOfResults); }
82
83    /**
84     * Fetch data from selected FDSN server
85     * 
86     * @return string downloaded string
87     */
88    protected function getFetch(string $url):string{
89        if( self::debug ) printf("[%s] %d \n", __METHOD__, time()); 
90
91        $curlSession = curl_init();
92        curl_setopt_array($curlSession, array(
93            CURLOPT_URL         => $url,
94            CURLOPT_HEADER         => false,
95            CURLOPT_CUSTOMREQUEST    => 'GET',
96            CURLOPT_RETURNTRANSFER    => 1,
97            CURLOPT_TIMEOUT        => 60,
98            CURLOPT_SSL_VERIFYHOST  => 0
99            )
100        );
101        $response = trim(curl_exec($curlSession));
102        if ( $this->isCurlCloseSupported() )
103            curl_close($curlSession);
104
105        return $response;
106    }
107
108    /**
109     * Check if FDSN server version is supported
110     */
111    protected function fdsnSupportedVersion():bool{
112        if( self::debug ) printf("[%s] %d \n", __METHOD__, time()); 
113
114        $this->version = trim( $this->getFetch($this->webserviceFullPath . '/version') );
115
116                return preg_match('/' . self::fdsnSupportedVersion . '/', $this->version);
117
118    }
119
120    /**
121     * Check if curl_close is still supported
122     * @return bool true is supported, false otherwise
123     */
124    private function isCurlCloseSupported():bool{ return PHP_MAJOR_VERSION <= self::curlCloceLatestPhpVersion; }
125
126}