esp32-nmea2000-obp60/webinstall/functions.php

152 lines
4.5 KiB
PHP

<?php
function safeName($name)
{
return preg_replace('[^0-9_a-zA-Z.-]', '', $name);
}
function replaceVars($str, $vars)
{
foreach ($vars as $n => &$v) {
$str = str_replace("#" . $n . "#", $v, $str);
}
return $str;
}
if (!function_exists('getallheaders')) {
function getallheaders()
{
$headers = [];
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
function addVars(&$vars,$names,$defaults=null){
foreach ($names as $n){
$v=null;
if (! isset($_REQUEST[$n])){
if ($defaults == null || ! isset($defaults[$n])) die("missing parameter $n");
$v=$defaults[$n];
}
else{
$v=safeName($_REQUEST[$n]);
}
$vars[$n]=$v;
}
return $vars;
}
function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
$mr = $maxredirect === null ? 5 : intval($maxredirect);
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off') && false) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
} else {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
if ($mr > 0) {
$newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$rch = curl_copy_handle($ch);
curl_setopt($rch, CURLOPT_HEADER, true);
curl_setopt($rch, CURLOPT_NOBODY, true);
curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
do {
curl_setopt($rch, CURLOPT_URL, $newurl);
$header = curl_exec($rch);
if (curl_errno($rch)) {
$code = 0;
} else {
$code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newurl = trim(array_pop($matches));
} else {
$code = 0;
}
}
} while ($code && --$mr);
curl_close($rch);
if (!$mr) {
if ($maxredirect === null) {
trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
} else {
$maxredirect = 0;
}
return false;
}
curl_setopt($ch, CURLOPT_URL, $newurl);
}
}
curl_setopt(
$ch,
CURLOPT_HEADERFUNCTION,
function ($curl, $header) {
header($header);
return strlen($header);
}
);
curl_setopt(
$ch,
CURLOPT_WRITEFUNCTION,
function ($curl, $body) {
echo $body;
return strlen($body);
}
);
header('Access-Control-Allow-Origin:*');
return curl_exec($ch);
}
function setFw($curl,$aheaders=null){
$headers=getallheaders();
$FWHDR = ['User-Agent'];
$outHeaders = array();
foreach ($FWHDR as $k) {
if (isset($headers[$k])) {
array_push($outHeaders, "$k: $headers[$k]");
}
}
if ($aheaders != null){
foreach ($aheaders as $hk => $hv){
array_push($outHeaders,"$hk: $hv");
}
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $outHeaders);
}
function getJson($url,$headers=null){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
setFw($curl,$headers);
$response = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
#echo("curl exec for $url:$response:$httpcode\n");
if($e = curl_error($curl)) {
curl_close($curl);
return array('error'=>$e);
} else {
if ($httpcode >= 300){
curl_close($curl);
return array('error'=>"HTTP code ".$httpcode);
}
curl_close($curl);
return json_decode($response, true);
}
}
function proxy($url)
{
$ch = curl_init($url);
curl_setopt_array(
$ch,
[
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 30,
]
);
setFw($ch);
$response = curl_exec_follow($ch);
curl_close($ch);
}
?>