Improved www.ttss.krakow.pl
Jacek Kowalski
2020-05-29 60b09020e8d9359c07e45a3404d42172cd46d4e4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
if(!isset($base_proxy)) {
    echo 'This script is for inclusion only.';
    die();
}
 
function is_number($str) {
    $str = (string)$str;
 
    return
        ctype_digit($str)
        OR
        (
            substr($str, 0, 1) == '-'
            AND
            ctype_digit(substr($str, 1))
        );
}
 
$method = [
    '/services/lookup/autocomplete/json' => [
        'query' => function() { return TRUE; },
    ],
    '/services/passageInfo/stopPassages/stop' => [
        'stop' => 'ctype_alnum',
        'mode' => function($mode) { return in_array($mode, ['arrival', 'departure']); },
        #'startTime' => 'ctype_digit',
        #'timeFrame' => 'ctype_digit',
    ],
    '/services/passageInfo/stopPassages/stopPoint' => [
        'stopPoint' => 'is_number',
        'mode' => function($mode) { return in_array($mode, ['arrival', 'departure']); },
        #'startTime' => 'ctype_digit',
        #'timeFrame' => 'ctype_digit',
    ],
    '/services/tripInfo/tripPassages' => [
        'tripId' => 'ctype_digit',
        'mode' => function($mode) { return in_array($mode, ['arrival', 'departure']); },
        #'vehicleId' => 'ctype_digit',
    ],
    '/services/routeInfo/routeStops' => [
        'routeId' => 'ctype_alnum',
    ],
    '/services/stopInfo/stop' => [
        'stop' => 'is_number',
    ],
    '/services/stopInfo/stopPoint' => [
        'stopPoint' => 'is_number',
    ],
    
    '/geoserviceDispatcher/services/stopinfo/stops' => [
        'left' => 'is_number',
        'bottom' => 'is_number',
        'right' => 'is_number',
        'top' => 'is_number',
    ],
    '/geoserviceDispatcher/services/stopinfo/stopPoints' => [
        'left' => 'is_number',
        'bottom' => 'is_number',
        'right' => 'is_number',
        'top' => 'is_number',
    ],
    '/geoserviceDispatcher/services/pathinfo/route' => [
        'id' => 'is_number',
        'direction' => 'is_number',
    ],
    '/geoserviceDispatcher/services/pathinfo/vehicle' => [
        'id' => 'is_number',
    ],
    '/geoserviceDispatcher/services/vehicleinfo/vehicles' => [
        'lastUpdate' => 'ctype_digit',
        'positionType' => function($type) { return in_array($type, ['CORRECTED', 'RAW']); },
        'colorType' => function($type) { return in_array($type, ['ROUTE_BASED']); },
    ],
];
$rewrite = [
    '/lookup/autocomplete/json' => '/services/lookup/autocomplete/json',
    '/passageInfo/stopPassages/stop' => '/services/passageInfo/stopPassages/stop',
    '/routeInfo/routeStops' => '/services/routeInfo/routeStops',
    '/internetservice/geoserviceDispatcher/services/pathinfo/vehicle' => '/geoserviceDispatcher/services/pathinfo/vehicle',
];
 
$path = $_SERVER['PATH_INFO'];
 
if(isset($rewrite[$path])) {
    $path = $rewrite[$path];
}
 
if(!isset($method[$path])) {
    header('HTTP/1.1 403 Forbidden');
    die('Forbidden');
}
 
$parameters = [];
 
foreach($method[$path] as $name => $filter) {
    if(!isset($_GET[$name])) {
        header('HTTP/1.1 403 Forbidden');
        die('Parameter '.$name.' is required');
    }
    
    if(!$filter($_GET[$name])) {
        header('HTTP/1.1 403 Forbidden');
        die('Parameter '.$name.' has invalid value');
    }
    
    $parameters[$name] = $_GET[$name];
}
 
$result = @file_get_contents($base_proxy . $path . '?' . http_build_query($parameters));
if(!$result OR $http_response_header[0] != 'HTTP/1.1 200 OK') {
    header('HTTP/1.1 503 Service Unavailable');
    if(isset($http_response_header[0])) {
        die($http_response_header[0]);
    } else {
        die('Unknown error');
    }
}
 
header('Content-Type: application/json');
echo $result;