Improved www.ttss.krakow.pl
Jacek Kowalski
2019-06-13 7698583a2b774b68ef1a24f87023c8385d671f9f
Factor out common section out of proxy_bus.php and proxy_tram.php
2 files modified
1 files renamed
240 ■■■■■ changed files
proxy_bus.php 116 ●●●●● patch | view | raw | blame | history
proxy_common.php 8 ●●●● patch | view | raw | blame | history
proxy_tram.php 116 ●●●●● patch | view | raw | blame | history
proxy_bus.php
@@ -1,117 +1,3 @@
<?php
function is_number($str) {
    $str = (string)$str;
    return
        ctype_digit($str)
        OR
        (
            substr($str, 0, 1) == '-'
            AND
            ctype_digit(substr($str, 1))
        );
}
$base_proxy = 'http://ttss.mpk.krakow.pl/internetservice';
$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;
require('proxy_common.php');
proxy_common.php
File was renamed from proxy.php
@@ -1,4 +1,9 @@
<?php
if(!isset($base_proxy)) {
    echo 'This script is for inclusion only.';
    die();
}
function is_number($str) {
    $str = (string)$str;
@@ -12,7 +17,6 @@
        );
}
$base_proxy = 'http://www.ttss.krakow.pl/internetservice';
$method = [
    '/services/lookup/autocomplete/json' => [
        'query' => function() { return TRUE; },
@@ -65,7 +69,7 @@
    ],
    '/geoserviceDispatcher/services/vehicleinfo/vehicles' => [
        'lastUpdate' => 'ctype_digit',
        'positionType' => function($type) { return in_array($type, ['RAW', 'CORRECTED']); },
        'positionType' => function($type) { return in_array($type, ['CORRECTED', 'RAW']); },
        'colorType' => function($type) { return in_array($type, ['ROUTE_BASED']); },
    ],
];
proxy_tram.php
@@ -1,117 +1,3 @@
<?php
function is_number($str) {
    $str = (string)$str;
    return
        ctype_digit($str)
        OR
        (
            substr($str, 0, 1) == '-'
            AND
            ctype_digit(substr($str, 1))
        );
}
$base_proxy = 'http://www.ttss.krakow.pl/internetservice';
$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;
require('proxy_common.php');