diff --git a/public_html/admin/index.php b/public_html/admin/index.php index 9076f48593a47863e6a2d8983bebb6e7ae7585d9..7518eeda8b26c1d87941a5fd8eb003691e4555fc 100644 --- a/public_html/admin/index.php +++ b/public_html/admin/index.php @@ -144,7 +144,15 @@ if (!$oR->isEnabled()) { if (count($aCfg['redirects'][$sType])) { foreach ($aCfg['redirects'][$sType] as $sFrom => $aTo) { $iCount++; - $sRelFrom = $sType == 'direct' ? $sFrom : ($aTo['link'] ?? false ); + switch ($sType) { + case 'direct': + $sRelFrom = $sFrom; + break; + case 'regex': + $sRelFrom = $aTo['link'] ?? false; + break; + } + $sTable .= $sTdFirst . '<td class="type-' . $sType . '">' . $sType . '</td>' . '<td class="type-' . $sType . '">' @@ -268,7 +276,7 @@ if (!$oR->isEnabled()) { </head> <body> - <h1><a href="?"> Redirects :: admin</a></h1> + <h1><a href="?"><?php echo $oR->getTitle(); ?></a></h1> <main> <?php echo $sErrors . $sHtml; ?> diff --git a/public_html/admin/main.css b/public_html/admin/main.css index b326d597a268f3c6ae4a075e3387ec96b44cbc2b..68f2c94b6e7c059416c8f616858135cff64a289c 100644 --- a/public_html/admin/main.css +++ b/public_html/admin/main.css @@ -7,6 +7,7 @@ --top-bg: linear-gradient(0deg, #000, #234, #222); --top-color: #e55; + --top-version-color: #488; --top-bottom: var(--col-border-1); --link-color: #46d; @@ -70,11 +71,12 @@ body { h1{margin: 0 0 0.5em;; padding: 0;} h1 a{background: var(--top-bg); color: var(--top-color); text-decoration: none;border-bottom: 5px solid var(--top-bottom); display: block; padding: 0.5em;} +h1 a small{color: var(--top-version-color);} h2{background: var(--h2-bg); color: var('--h2-color'); margin: 1em 0 0.5em; border-top: 2px solid var(--h2-border); border-left: 5px solid var(--h2-border); border-top-left-radius: 0.5em; padding: 0.5em; margin: 0;} h3{color:var('--h3-color'); font-size: 250%} -pre{background: rgba(0,0,0,0.02);padding: 0.3em 1em; border: 1px solid rgba(0,0,0,0.1); margin: 2em 0 3em;; border-bottom: 2px solid rgba(0,0,0,0.2); border-bottom-right-radius: 1em;} +pre{background: rgba(0,0,0,0.02);padding: 0.3em 1em; border: 1px solid rgba(0,0,0,0.1); margin: 1em 0 3em;; border-bottom: 2px solid rgba(0,0,0,0.2); border-bottom-right-radius: 1em;} .dataTable tr:hover{background: #f4f0f8 !important;} footer{background: var(--footer-bg); margin-top: 4em; text-align: right; padding: 1em;} @@ -96,7 +98,7 @@ ol.error{padding-left: 2em;} .type-direct{color: var(--type-direct-color); } .type-regex{color: var(--type-regex-color); } -.status{padding: 0.5em 1em; position: relative; top: -1.4em; left: -0.9em; border-left: 5px solid; font-size: 125%; border-bottom-right-radius: 0.7em;} +.status{padding: 0.5em 1em; border-left: 5px solid; font-size: 125%; border-top-right-radius: 0.7em;} .status-ok{background: var(--txt-ok-bg); color: var(--txt-ok-color);} .status-redirect{background: var(--txt-warning-bg); color: var(--txt-warning-color);} .status-error{background: var(--txt-error-bg); color: var(--txt-error-color);} @@ -106,6 +108,8 @@ ol.error{padding-left: 2em;} .location::before{content:' 🌐 '; background-color: var(--txt-location-before-bg);} .debug{color:var(--txt-debug-color);} +.box{display: inline-block; border: 1px solid rgba(0,0,0,0.1); padding: 0.3em; margin: 0em; text-align: center; border-radius: 0.25em;} + .overlay{position: fixed; margin: 0; width: 100%; height: 100%; top: 0; left: 0; background: var(--overlay-bg); overflow: scroll; display: none;} .overlay>div{margin: 3% 10%; background: var(--overlay-box-bg); padding: 1em;box-shadow: var(--overlay-box-shadow); } diff --git a/public_html/classes/redirect.admin.class.php b/public_html/classes/redirect.admin.class.php index 92979e10f6a319328bbbfd887c700c8c05d94e02..a2779a2027376a9e86db8d114851df6c863cfedf 100644 --- a/public_html/classes/redirect.admin.class.php +++ b/public_html/classes/redirect.admin.class.php @@ -40,7 +40,7 @@ class redirectadmin extends redirect CURLOPT_HEADER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, - CURLOPT_USERAGENT => strip_tags($this->sAbout), + CURLOPT_USERAGENT => strip_tags($this->_app . ' ' . $this->_version), CURLOPT_VERBOSE => false, CURLOPT_ENCODING => 'gzip, deflate', // to fetch encoding CURLOPT_HTTPHEADER => [ @@ -112,41 +112,80 @@ class redirectadmin extends redirect public function renderHttpResponseHeader(array $aResponse): string { $sHeader=$aResponse['response_header']."\r\n\r\n".$aResponse['response_body']; - $sReturn = $sHeader; + // $sReturn.="<pre>".print_r($aResponse, 1)."</pre>"; + $iJump = 0; + $sBox = ''; + $sReturn = ''; if ($aResponse['curlerrorcode']) { - $sReturn = '<pre><br>' - .'<span class="status status-error">Request failed.<br></span>' + $sReturn .= '<br>' + .'<span class="status status-error">Request failed.</span>' + .'<pre>' .'Curl error #'.$aResponse['curlerrorcode'] .':<br>' . '<strong>'.$aResponse['curlerrormsg'].'</strong><br><br>' .'</pre>' .'🌐 <a href="https://curl.se/libcurl/c/libcurl-errors.html" target="_blank">Curl error codes</a>' ; - } else { + } - $sReturn = preg_replace('/(HTTP.*)\\r/', '</pre><pre><strong>$1</strong>', $sReturn); - $sReturn = preg_replace('/(HTTP.*200.*)/', '<span class="status status-ok">$1</span>', $sReturn); - $sReturn = preg_replace('/(HTTP.*30.*)/', '<span class="status status-redirect">$1</span>', $sReturn); - $sReturn = preg_replace('/(HTTP.*40.*)/', '<span class="status status-error">$1</span>', $sReturn); - $sReturn = preg_replace('/(HTTP.*50.*)/', '<span class="status status-error">$1</span>', $sReturn); - $sReturn = preg_replace('/\ ([1-5][0-9][0-9])\ /', ' <span class="statuscode">$1</span> ', $sReturn); - - $sReturn = preg_replace('/(x-debug-.*)\\r/i', '<span class="debug">$1</span>', $sReturn); - $sReturn = preg_replace('/(location:.*)\\r/i', '<span class="location">$1</span>', $sReturn); - $sReturn .= '</pre>'; - - preg_match_all('/(HTTP\/.*)/i', $sReturn, $aTmp); - // $sReturn.=print_r($aTmp, 1); - $iHops = (count($aTmp[0]) - 1); - - $sReturn = ($iHops > 0 - ? '<br>Found hops: <strong>' . $iHops . '</strong>' - . ($iHops > 1 ? ' <br><span class="warning"> ⚠️ Verify your redirect to skip unneeded hops.</span>' : '') . '<br><br>' - : '' - ) . $sReturn - ; + $sUrl=$aResponse['url']; + foreach(explode("\r\n\r\n", $aResponse['response_header']."\r\n\r\n".$aResponse['response_body'] ) as $sBlock){ + if(strlen($sBlock)){ + $iJump++; + + // find http status + preg_match('/HTTP\/.* ([0-9]*) /', $sBlock, $aTmp); + // $sReturn.='<pre>'.print_r($aTmp, 1).'</pre>'; + $iStatus=$aTmp[1] ?? '0'; + + $sStatus=''; + if($iStatus>=200 && $iStatus<300){ + $sStatus='status-ok'; + } elseif($iStatus>=300 && $iStatus<400){ + $sStatus='status-redirect'; + } elseif($iStatus>=400 && $iStatus<500){ + $sStatus='status-error'; + } elseif($iStatus>=500 && $iStatus<600){ + $sStatus='status-error'; + } + + // find location + preg_match('/Location: (.*)/i', $sBlock, $aTmp); + $sNextUrl=$aTmp[1] ?? ''; + + + // modify lines in block + $sBlock = preg_replace('/(x-debug-.*)\\r/i', '<span class="debug">$1</span>', $sBlock); + $sBlock = preg_replace('/(location:.*)\\r/i', '<span class="location">$1</span>', $sBlock); + + + $sReturn.="<span class=\"status $sStatus\">$sUrl ($iStatus) </span><pre>$sBlock</pre>"; + // $sReturn .= '<strong>'.$iJump.') HTTP status: '.$iStatus.' - '.$sUrl.'</strong><pre>'.$sBlock.'</pre>'; + + + $sWebhost=parse_url($sUrl, PHP_URL_HOST); + $sBox.="<div class=\"box $sStatus\">" + .$sWebhost.'<br>' + . $this->_getIp($sWebhost) + .'</div>'; + + if($sNextUrl){ + $sBox.= " --- $iStatus ---> "; + $sUrl=$sNextUrl; + } + + } } + $iHops = $iJump-1; + $sReturn = '<br>'.($iHops > 0 + ? 'Found hops: <strong>' . $iHops . '</strong>' + . ($iHops > 1 ? '<span class="warning"> ⚠️ Verify your redirect to skip unneeded hops.</span>' : '') . '<br><br>' + . '<div>'.$sBox.'</div><br><br><br>' + : '' + ) + + . $sReturn; return $sReturn; } @@ -222,5 +261,9 @@ class redirectadmin extends redirect return $aReturn; } + function getTitle(): string + { + return 'Redirect :: admin <small>'.$this->_version.'</small>'; + } } diff --git a/public_html/classes/redirect.class.php b/public_html/classes/redirect.class.php index ae8b2e9986a1f5654ead6b828176a298614eb538..d97865dd37d545e6bdf37dbad4c15a434c2ea3d4 100644 --- a/public_html/classes/redirect.class.php +++ b/public_html/classes/redirect.class.php @@ -39,6 +39,12 @@ class redirect // CONFIG // ---------------------------------------------------------------------- + /** + * About message + * @var string + */ + protected string $_version = '1.7'; + /** * Flag: debug is enabled? * @var bool @@ -55,7 +61,7 @@ class redirect * About message * @var string */ - protected string $sAbout = 'IML redirect <small>v1.6</small>'; + protected string $_app = 'IML redirect'; /** * Hostname @@ -417,7 +423,7 @@ class redirect . '</head>' . '<body>' . $sBody - . '<h2>' . $this->sAbout . '</h2>' + . '<h2>' . $this->_app . ' <small>'.$this->_version.'</small></h2>' . '<footer>© ' . date('Y') . ' ' . $this->sHostname . '</footer>' . '</body></html>' );