Status codes are broken out to a separate file for better handling, search logic moved to separate file, CSS style improvements
This commit is contained in:
parent
8f3f4e65e1
commit
01d01483d0
40
class.php
40
class.php
@ -1,5 +1,5 @@
|
||||
<?php
|
||||
class RedirectCheck
|
||||
class Follow
|
||||
{
|
||||
// constants
|
||||
const USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36";
|
||||
@ -141,42 +141,4 @@ class RedirectCheck
|
||||
return $last['url'];
|
||||
}
|
||||
}
|
||||
|
||||
// handle form submissions
|
||||
if (isset($_POST['url']))
|
||||
{
|
||||
// check that we got a valid URL
|
||||
$url = (filter_var(trim($_POST['url']), FILTER_VALIDATE_URL))
|
||||
? trim($_POST['url'])
|
||||
: false;
|
||||
|
||||
// if so, start up the redirect checks
|
||||
if ($url)
|
||||
{
|
||||
// make a request for this url and add to the path
|
||||
$request = new RedirectCheck($url);
|
||||
$code = '';
|
||||
|
||||
do {
|
||||
// set the URL
|
||||
$request->url = $url;
|
||||
|
||||
// make the curl request and update the path
|
||||
$request->getHttpCode();
|
||||
|
||||
// end on an error
|
||||
if ($request->error)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// if we have a redirect to follow, update our working $url
|
||||
$url = ($request->next) ? $request->next : false;
|
||||
|
||||
// update our code
|
||||
$code = ($request->code) ? $request->code : false;
|
||||
|
||||
} while ($code != 200);
|
||||
}
|
||||
}
|
||||
?>
|
291
codes.php
Normal file
291
codes.php
Normal file
@ -0,0 +1,291 @@
|
||||
<?php
|
||||
$codes = [
|
||||
100 => [
|
||||
'label' => 'Informational',
|
||||
'start' => '1XX',
|
||||
'range' => '199',
|
||||
'codes' => [
|
||||
100 => [
|
||||
'name' => 'Continue',
|
||||
'desc' => 'Continue the request or ignore the response if the request is already finished.'
|
||||
],
|
||||
101 => [
|
||||
'name' => 'Switching Protocols',
|
||||
'desc' => 'Sent in response to a client\'s <code>Upgrade</code> request header and indicates the protocol the server is switching to.'
|
||||
],
|
||||
102 => [
|
||||
'name' => 'Processing',
|
||||
'desc' => 'Server has received and is processing the request, but no response is available yet.'
|
||||
],
|
||||
103 => [
|
||||
'name' => 'Early Hints',
|
||||
'desc' => 'Intended alongside <code>Link</code> header to let the user agent preconnect or start preloading resources while the server prepares a response.'
|
||||
]
|
||||
]
|
||||
],
|
||||
200 => [
|
||||
'label' => 'Successful',
|
||||
'start' => '2XX',
|
||||
'range' => '299',
|
||||
'codes' => [
|
||||
200 => [
|
||||
'name' => 'OK',
|
||||
'desc' => 'The request succeeded.'
|
||||
],
|
||||
201 => [
|
||||
'name' => 'Created',
|
||||
'desc' => 'The request succeeded, and a new resource was created as a result.'
|
||||
],
|
||||
202 => [
|
||||
'name' => 'Accepted',
|
||||
'desc' => 'The request has been received but not yet acted upon.'
|
||||
],
|
||||
203 => [
|
||||
'name' => 'Non-Authoritative Information',
|
||||
'desc' => 'Typically for mirrors of original resources, the returned metadata is not exactly the same as is available from the origin server but is collected from a local or a third-party copy.'
|
||||
],
|
||||
204 => [
|
||||
'name' => 'No Content',
|
||||
'desc' => 'There is no content to send for this request, but the headers may be useful.'
|
||||
],
|
||||
205 => [
|
||||
'name' => 'Reset Content',
|
||||
'desc' => 'Tells the user agent to reset the document which sent this request.'
|
||||
],
|
||||
206 => [
|
||||
'name' => 'Partial Content',
|
||||
'desc' => 'Only part of a resource is sent in response to the <code>Range</code> header.'
|
||||
],
|
||||
207 => [
|
||||
'name' => 'Multi-Status',
|
||||
'desc' => 'Conveys information about multiple resources, for situations where multiple status codes might be appropriate.'
|
||||
],
|
||||
208 => [
|
||||
'name' => 'Already Reported (WebDAV)',
|
||||
'desc' => 'Used inside a <code><dav:propstat></code> response element to limit repetition.'
|
||||
],
|
||||
226 => [
|
||||
'name' => 'IM Used',
|
||||
'desc' => 'For <code>HTTP Delta encoding</code> when the server has fullfilled a <code>GET</code> request and the response is from 1+ instance manipulations.'
|
||||
]
|
||||
]
|
||||
],
|
||||
300 => [
|
||||
'label' => 'Redirection',
|
||||
'start' => '3XX',
|
||||
'range' => '399',
|
||||
'codes' => [
|
||||
300 => [
|
||||
'name' => 'Multiple Choices',
|
||||
'desc' => 'The request has more than one possible response and the user agent or user should choose one of them.'
|
||||
],
|
||||
301 => [
|
||||
'name' => 'Moved Permanently',
|
||||
'desc' => 'The URL of the requested resource has been changed permanently. The new URL is given in the response.'
|
||||
],
|
||||
302 => [
|
||||
'name' => 'Found',
|
||||
'desc' => 'URI of the requested resource has been changed temporarily and may change in the future.'
|
||||
],
|
||||
303 => [
|
||||
'name' => 'See Other',
|
||||
'desc' => 'Client should get the requested resource at another URI with a GET request.'
|
||||
],
|
||||
304 => [
|
||||
'name' => 'Not Modified',
|
||||
'desc' => 'For caching purposes, indicating the response has not been modified so the client can use the cached version.'
|
||||
],
|
||||
305 => [
|
||||
'name' => '<del>Use Proxy</del>',
|
||||
'desc' => 'Deprecated. Indicates the requested response must be accessed via proxy.'
|
||||
],
|
||||
306 => [
|
||||
'name' => '(Reserved)',
|
||||
'desc' => 'Unused and now reserved. Previously in the HTTP/1.1 spec.'
|
||||
],
|
||||
307 => [
|
||||
'name' => 'Temporary Redirect',
|
||||
'desc' => 'Client should get the requested resource at another URI via the same method. Similar to <code>302</code> but the request method must stay the same.'
|
||||
],
|
||||
308 => [
|
||||
'name' => 'Permanent Redirect',
|
||||
'desc' => 'Response is now permanently located at a new URI included in the <code>Location:</code> header. Similar to <code>301</code> but the request method must stay the same.'
|
||||
]
|
||||
]
|
||||
],
|
||||
400 => [
|
||||
'label' => 'Client Error',
|
||||
'start' => '4XX',
|
||||
'range' => '499',
|
||||
'codes' => [
|
||||
400 => [
|
||||
'name' => 'Bad Request',
|
||||
'desc' => 'Server will not process the request due to an unspecified error by the client.'
|
||||
],
|
||||
401 => [
|
||||
'name' => 'Unauthorized',
|
||||
'desc' => 'More accurately, "unauthenticated."'
|
||||
],
|
||||
402 => [
|
||||
'name' => '<var>Payment Required</var>',
|
||||
'desc' => 'Reserved for future use in digital payment systems.'
|
||||
],
|
||||
403 => [
|
||||
'name' => 'Forbidden',
|
||||
'desc' => 'Client is unauthorized and does not have access rights to the resource.'
|
||||
],
|
||||
404 => [
|
||||
'name' => 'Not Found',
|
||||
'desc' => 'Server cannot find the requested resource. One of the most common response headers after <code>200</code>.'
|
||||
],
|
||||
405 => [
|
||||
'name' => 'Method Not Allowed',
|
||||
'desc' => 'Request method is known by the server but is not supported by the target resource. Common in APIs.'
|
||||
],
|
||||
406 => [
|
||||
'name' => 'Not Acceptable',
|
||||
'desc' => 'Server performs content negotiation with the client and does not find content that meets the user agent\'s criteria.'
|
||||
],
|
||||
407 => [
|
||||
'name' => 'Proxy Authentication Required',
|
||||
'desc' => 'Similar to <code>401 Unauthorized</code> but authentication is needed to be done by a proxy.'
|
||||
],
|
||||
408 => [
|
||||
'name' => 'Request Timeout',
|
||||
'desc' => 'Server shuts down an unnused connection by the client.'
|
||||
],
|
||||
409 => [
|
||||
'name' => 'Conflict',
|
||||
'desc' => 'Request conflicts with the current state of the server.'
|
||||
],
|
||||
410 => [
|
||||
'name' => 'Gone',
|
||||
'desc' => 'Requested resource has been permanently deleted from server, with no forwarding address.'
|
||||
],
|
||||
411 => [
|
||||
'name' => 'Length Required',
|
||||
'desc' => 'Server rejected the request because the <code>Content-Length</code> header field is not defined and the server requires it.'
|
||||
],
|
||||
412 => [
|
||||
'name' => 'Precondition Failed',
|
||||
'desc' => 'Client has indicated preconditions in its headers which the server does not meet.'
|
||||
],
|
||||
413 => [
|
||||
'name' => 'Payload Too Large',
|
||||
'desc' => 'Request entity is larger than limits defined by server.'
|
||||
],
|
||||
414 => [
|
||||
'name' => 'URI Too Long',
|
||||
'desc' => 'URI requested by the client is longer than the server is willing to interpret.'
|
||||
],
|
||||
415 => [
|
||||
'name' => 'Unsupported Media Type',
|
||||
'desc' => 'Media format of the requested data is not supported by the server.'
|
||||
],
|
||||
416 => [
|
||||
'name' => 'Range Not Satisfiable',
|
||||
'desc' => 'Size specified by the <code>Range</code> header field in the request cannot be fulfilled.'
|
||||
],
|
||||
417 => [
|
||||
'name' => 'Expectation Failed',
|
||||
'desc' => 'Expectation indicated by the <code>Expect</code> request header field cannot be met by the server.'
|
||||
],
|
||||
418 => [
|
||||
'name' => 'I\'m a teapot',
|
||||
'desc' => 'Server refuses the attempt to brew coffee with a teapot. Reference to Hyper Text Coffee Pot Control Protocol defined in April Fools\' jokes in 1998 and 2014!'
|
||||
],
|
||||
421 => [
|
||||
'name' => 'Misdirected Request',
|
||||
'desc' => 'Request was directed at a server that is not able to produce a response.'
|
||||
],
|
||||
422 => [
|
||||
'name' => 'Unprocessable Content (WebDAV)',
|
||||
'desc' => 'Request was well-formed but was unable to be followed due to semantic errors.'
|
||||
],
|
||||
423 => [
|
||||
'name' => 'Locked (WebDAV)',
|
||||
'desc' => 'Resource that is being accessed is locked.'
|
||||
],
|
||||
424 => [
|
||||
'name' => 'Failed Dependency (WebDAV)',
|
||||
'desc' => 'Request failed due to failure of a previous request.'
|
||||
],
|
||||
425 => [
|
||||
'name' => '<var>Too Early</var>',
|
||||
'desc' => 'Reserved for future use. Server is unwilling to risk processing a request that might be replayed.'
|
||||
],
|
||||
426 => [
|
||||
'name' => 'Upgrade Required',
|
||||
'desc' => 'Request currently refused over the current protocol but the server may provide a reponse should the client use a different protocol.'
|
||||
],
|
||||
428 => [
|
||||
'name' => 'Precondition Required',
|
||||
'desc' => 'Origin server requires the request to be conditional.'
|
||||
],
|
||||
429 => [
|
||||
'name' => 'Too Many Requests',
|
||||
'desc' => 'User agent has sent too many requests in a given amount of time (i.e., it\'s rate limited).'
|
||||
],
|
||||
431 => [
|
||||
'name' => 'Request Header Fields Too Large',
|
||||
'desc' => 'Server is unwilling to process the request because its header fields are too large.'
|
||||
],
|
||||
451 => [
|
||||
'name' => 'Unavailable For Legal Reasons',
|
||||
'desc' => 'User agent requested a resource that cannot legally be provided (e.g., web page censored by a government).'
|
||||
]
|
||||
]
|
||||
],
|
||||
500 => [
|
||||
'label' => 'Server Error',
|
||||
'start' => '5XX',
|
||||
'range' => '599',
|
||||
'codes' => [
|
||||
500 => [
|
||||
'name' => 'Internal Server Error',
|
||||
'desc' => 'Server has encountered a situation it does not know how to handle. One of the most common response codes.'
|
||||
],
|
||||
501 => [
|
||||
'name' => 'Not Implemented',
|
||||
'desc' => 'Request method is not supported by the server and cannot be handled.'
|
||||
],
|
||||
502 => [
|
||||
'name' => 'Bad Gateway',
|
||||
'desc' => 'Server recieved an invalid response while acting as a gateway.'
|
||||
],
|
||||
503 => [
|
||||
'name' => 'Service Unavailable',
|
||||
'desc' => 'Server is not ready to handle the request, commonly due to maintenance downtime or overload.'
|
||||
],
|
||||
504 => [
|
||||
'name' => 'Gateway Timeout',
|
||||
'desc' => 'Server cannot get a response in time while acting as a gateway.'
|
||||
],
|
||||
505 => [
|
||||
'name' => 'HTTP Version Not Supported',
|
||||
'desc' => 'HTTP version used in the request is not supported by the server.'
|
||||
],
|
||||
506 => [
|
||||
'name' => 'Variant Also Negotiates',
|
||||
'desc' => 'Only in Transparent Content Negotiation contexts; server has an internal configuration error where the user agent\'s chosen variant is not available.'
|
||||
],
|
||||
507 => [
|
||||
'name' => 'Insufficient Storage (WebDAV)',
|
||||
'desc' => 'Server is unable to store the representation needed to successfully complete the request.'
|
||||
],
|
||||
508 => [
|
||||
'name' => 'Loop Detected (WebDAV)',
|
||||
'desc' => 'Server detected an infinite loop while processing the request.'
|
||||
],
|
||||
509 => [
|
||||
'name' => 'Not Extended',
|
||||
'desc' => 'Further extensions to the request are required for the server to fulfill it.'
|
||||
],
|
||||
510 => [
|
||||
'name' => 'Network Authentication Required',
|
||||
'desc' => 'Client needs to authenticate to gain network access.'
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
?>
|
184
index.php
184
index.php
@ -1,5 +1,7 @@
|
||||
<?php
|
||||
include('class.php');
|
||||
include('search.php');
|
||||
include('codes.php');
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@ -16,40 +18,41 @@ include('class.php');
|
||||
<a href="/"><span>Check a new URL</span></a>
|
||||
</nav>
|
||||
</menu>
|
||||
<form method="post" action="index.php" type="application/x-www-form-urlencoded">
|
||||
<input type="search" value="" placeholder="URL to check..." name="url">
|
||||
<form method="post" action="/" type="application/x-www-form-urlencoded">
|
||||
<input type="url" value="" placeholder="URL to check..." name="url">
|
||||
<button type="submit">Check</button>
|
||||
</form>
|
||||
</header>
|
||||
<main>
|
||||
|
||||
<?php
|
||||
// error message display
|
||||
if (isset($error))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// if we have a valid request object
|
||||
if (isset($request) && count($request->path) > 0)
|
||||
{
|
||||
$steps = count($request->path) - 1;
|
||||
$count = ($steps == 1) ? '1 redirect' : $steps.' redirects';
|
||||
echo "
|
||||
<article>
|
||||
<h2>
|
||||
Final destination
|
||||
</h2>
|
||||
<p>
|
||||
The URL you traced had ".$count." and ended here:
|
||||
</p>
|
||||
<h2>Final destination</h2>
|
||||
<p>The URL you traced had ".$count." and ended here:</p>
|
||||
<p class=\"final\">
|
||||
<a href=\"".$request->getFinalRedirect()."\" target=\"blank\">
|
||||
".$request->getFinalRedirect()."
|
||||
</a>
|
||||
</p>
|
||||
<h3>
|
||||
Redirect trace
|
||||
</h3>
|
||||
<h3>Redirect trace</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Step</th>
|
||||
<th>Request</th>
|
||||
<th>Code</th>
|
||||
<th>Redirect</th>
|
||||
<th colspan=\"2\">Code</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>";
|
||||
@ -58,11 +61,11 @@ if (isset($request) && count($request->path) > 0)
|
||||
$item = $step['step'];
|
||||
$url = $step['url'];
|
||||
$code = $step['code'];
|
||||
$next = ($step['next']) ? 'Yes' : '--';
|
||||
$next = ($step['next']) ? '⥂⇄↩︎' : '✓';
|
||||
echo "
|
||||
<tr>
|
||||
<td>".$item."</td>
|
||||
<td>".$url."</td>
|
||||
<td>".$url." <a href=\"".$url."\" target=\"blank\"><b>↗︎</b></a></td>
|
||||
<td><code>".$code."</code></td>
|
||||
<td>".$next."</td>
|
||||
</tr>";
|
||||
@ -105,142 +108,33 @@ else
|
||||
<h3>
|
||||
HTTP response status codes
|
||||
</h3>
|
||||
<?php
|
||||
if (isset($codes) && is_array($codes) && !empty($codes))
|
||||
{
|
||||
foreach ($codes as $group)
|
||||
{
|
||||
echo "
|
||||
<details>
|
||||
<summary>
|
||||
Informational (<code>1XX</code>–<code>199</code>)
|
||||
".$group['label']." (<code>".$group['start']."</code>–<code>".$group['range']."</code>)
|
||||
</summary>
|
||||
<dl>
|
||||
<dl>";
|
||||
foreach ($group['codes'] as $code => $prop)
|
||||
{
|
||||
echo "
|
||||
<!-- ".$code." -->
|
||||
<dt>
|
||||
<label for="100">
|
||||
<code>100</code> Continue
|
||||
</label>
|
||||
<label for=\"".$code."\"><code>".$code."</code> ".$prop['name']."</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="100">
|
||||
<dd>Continue the request or ignore the response if the request is already finished.</dd>
|
||||
<dt>
|
||||
<label for="101">
|
||||
<code>101</code> Switching Protocols
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="101">
|
||||
<dd>Sent in response to a client's <code>Upgrade</code> request header and indicates the protocol the server is switching to.</dd>
|
||||
<dt>
|
||||
<label for="102">
|
||||
<code>102</code> Processing
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="102">
|
||||
<dd>Server has received and is processing the request, but no response is available yet.</dd>
|
||||
<dt>
|
||||
<label for="103">
|
||||
<code>103</code> Early Hints
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="103">
|
||||
<dd>Intended alongside <code>Link</code> header to let the user agent preconnect or start preloading resources while the server prepares a response.</dd>
|
||||
<input type=\"checkbox\" id=\"".$code."\">
|
||||
<dd>".$prop['desc']."</dd>";
|
||||
}
|
||||
echo "
|
||||
</dl>
|
||||
</details>
|
||||
<details>
|
||||
<summary>
|
||||
Successful (<code>2XX</code>–<code>299</code>)
|
||||
</summary>
|
||||
<dl>
|
||||
<dt>
|
||||
<label for="200">
|
||||
<code>200</code> OK
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="200">
|
||||
<dd>The request succeeded.</dd>
|
||||
<dt>
|
||||
<label for="201">
|
||||
<code>201</code> Created
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="201">
|
||||
<dd>The request succeeded, and a new resource was created as a result.</dd>
|
||||
<dt>
|
||||
<label for="202">
|
||||
<code>202</code> Accepted
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="202">
|
||||
<dd>The request has been received but not yet acted upon.</dd>
|
||||
<dt>
|
||||
<label for="203">
|
||||
<code>203</code> Non-Authoritative Information
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="203">
|
||||
<dd>Typically for mirrors of original resources, the returned metadata is not exactly the same as is available from the origin server but is collected from a local or a third-party copy.</dd>
|
||||
<dt>
|
||||
<label for="204">
|
||||
<code>204</code> No Content
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="204">
|
||||
<dd>There is no content to send for this request, but the headers may be useful.</dd>
|
||||
<dt>
|
||||
<label for="205">
|
||||
<code>205</code> Reset Content
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="205">
|
||||
<dd>Tells the user agent to reset the document which sent this request.</dd>
|
||||
<dt>
|
||||
<label for="206">
|
||||
<code>206</code> Partial Content
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="206">
|
||||
<dd>Only part of a resource is sent in response to the <code>Range</code> header.</dd>
|
||||
<dt>
|
||||
<label for="207">
|
||||
<code>207</code> Multi-Status
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="207">
|
||||
<dd>Conveys information about multiple resources, for situations where multiple status codes might be appropriate.</dd>
|
||||
<dt>
|
||||
<label for="208">
|
||||
<code>208</code> Already Reported (WebDAV)
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="208">
|
||||
<dd>Used inside a <code><dav:propstat></code> response element to limit repetition.</dd>
|
||||
<dt>
|
||||
<label for="226">
|
||||
<code>226</code> IM Used
|
||||
</label>
|
||||
</dt>
|
||||
<input type="checkbox" id="226">
|
||||
<dd>For <code>HTTP Delta encoding</code> when the server has fullfilled a <code>GET</code> request and the response is from 1+ instance manipulations.</dd>
|
||||
</dl>
|
||||
</details>
|
||||
<details>
|
||||
<summary>
|
||||
Redirects (<code>3XX</code>–<code>399</code>)
|
||||
</summary>
|
||||
<p>
|
||||
300
|
||||
</p>
|
||||
</details>
|
||||
<details>
|
||||
<summary>
|
||||
Client error (<code>4XX</code>–<code>499</code>)
|
||||
</summary>
|
||||
<p>
|
||||
100
|
||||
</p>
|
||||
</details>
|
||||
<details>
|
||||
<summary>
|
||||
Server error (<code>5XX</code>–<code>599</code>)
|
||||
</summary>
|
||||
<p>
|
||||
500
|
||||
</p>
|
||||
</details>
|
||||
</details>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
<p>
|
||||
See <a href="https://httpwg.org/specs/rfc9110.html#overview.of.status.codes">RFC 9110</a> for official documentation on each status code.
|
||||
</p>
|
||||
|
46
search.php
Normal file
46
search.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
// handle form submissions
|
||||
if (isset($_POST['url']))
|
||||
{
|
||||
// check that we got a valid URL
|
||||
$url = (filter_var(trim($_POST['url']), FILTER_VALIDATE_URL))
|
||||
? trim($_POST['url'])
|
||||
: false;
|
||||
|
||||
// if so, start up the redirect checks
|
||||
if ($url)
|
||||
{
|
||||
// make a request for this url and add to the path
|
||||
$request = new Follow($url);
|
||||
$code = '';
|
||||
|
||||
do {
|
||||
// set the URL
|
||||
$request->url = $url;
|
||||
|
||||
// make the curl request and update the path
|
||||
$request->getHttpCode();
|
||||
|
||||
// end on an error
|
||||
if ($request->error)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// if we have a redirect to follow, update our working $url
|
||||
$url = ($request->next) ? $request->next : false;
|
||||
|
||||
// update our code
|
||||
$code = ($request->code) ? $request->code : false;
|
||||
|
||||
} while ($code != 200);
|
||||
}
|
||||
else
|
||||
{
|
||||
$error = [
|
||||
'type' => 'search',
|
||||
'message' => 'There was an issue with URL you searched. Make sure it\'s a well-formed URL.'
|
||||
];
|
||||
}
|
||||
}
|
||||
?>
|
63
style.css
63
style.css
@ -23,7 +23,7 @@ header {
|
||||
background: #fff;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-bottom: 3rem;
|
||||
height: 14rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@ form {
|
||||
position: relative;
|
||||
width: 90%;
|
||||
}
|
||||
input[type="search"] {
|
||||
input[type="url"] {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
|
||||
background-repeat: no-repeat;
|
||||
background-position: 1.25rem 50%;
|
||||
@ -93,7 +93,7 @@ input[type="search"] {
|
||||
transition: box-shadow 150ms ease-in-out;
|
||||
width: 100%;
|
||||
}
|
||||
input[type="search"]:focus {
|
||||
input[type="url"]:focus {
|
||||
outline: none;
|
||||
box-shadow: inset 0 0.25rem 0 0 #f0eded, 0 0 0 1px #fff, 0 0 0 0.25rem #39b9e4;
|
||||
}
|
||||
@ -132,6 +132,8 @@ article {
|
||||
}
|
||||
|
||||
aside {
|
||||
max-height: calc(100vh - 16.5rem);
|
||||
overflow: auto;
|
||||
width: 86%;
|
||||
}
|
||||
details {
|
||||
@ -151,6 +153,30 @@ details dl {
|
||||
details dl dt {
|
||||
margin: 0 0 0.5rem;
|
||||
}
|
||||
details dl dt del,
|
||||
details dl dt var {
|
||||
align-items: center;
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
font-style: normal;
|
||||
}
|
||||
details dl dt del::after,
|
||||
details dl dt var::after {
|
||||
background-repeat: no-repeat;
|
||||
background-size: 1rem 1rem;
|
||||
background-position: 100% 50%;
|
||||
content: '';
|
||||
display: block;
|
||||
height: 1rem;
|
||||
margin-left: 0.5rem;
|
||||
width: 1rem;
|
||||
}
|
||||
details dl dt del::after {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 6h18'/%3E%3Cpath d='M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6'/%3E%3Cpath d='M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2'/%3E%3Cline x1='10' x2='10' y1='11' y2='17'/%3E%3Cline x1='14' x2='14' y1='11' y2='17'/%3E%3C/svg%3E");
|
||||
}
|
||||
details dl dt var::after {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 2v7.527a2 2 0 0 1-.211.896L4.72 20.55a1 1 0 0 0 .9 1.45h12.76a1 1 0 0 0 .9-1.45l-5.069-10.127A2 2 0 0 1 14 9.527V2'/%3E%3Cpath d='M8.5 2h7'/%3E%3Cpath d='M7 16h10'/%3E%3C/svg%3E");
|
||||
}
|
||||
details dl dd {
|
||||
display: none;
|
||||
font-size: 0.875rem;
|
||||
@ -158,6 +184,9 @@ details dl dd {
|
||||
margin-left: 0;
|
||||
padding: 0 0 1rem 0.1rem;
|
||||
}
|
||||
details dl dd code {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
details dl input[type="checkbox"] {
|
||||
display: none;
|
||||
}
|
||||
@ -174,6 +203,7 @@ code {
|
||||
background: #fff;
|
||||
padding: 0.1rem 0.2rem;
|
||||
border-radius: 0.25rem;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
h2 {
|
||||
@ -222,9 +252,36 @@ td {
|
||||
vertical-align: top;
|
||||
word-wrap: anywhere;
|
||||
}
|
||||
td:nth-child(2) {
|
||||
line-height: 1.5rem;
|
||||
padding: 0.8rem 1rem;
|
||||
}
|
||||
td:nth-child(2) a:hover {
|
||||
text-decoration-color: transparent;
|
||||
}
|
||||
td b {
|
||||
border: 1px solid #aaa;
|
||||
border-right-width: 2px;
|
||||
border-bottom-width: 2px;
|
||||
border-radius: 0.25rem;
|
||||
color: #555;
|
||||
font-weight: 500;
|
||||
line-height: 1;
|
||||
margin-left: 0.5rem;
|
||||
padding: 0 0.25rem;
|
||||
transition: border-color 150ms ease-in-out, color 150ms ease-in-out;
|
||||
}
|
||||
td:nth-child(2) a:hover b {
|
||||
border-color: #1a1a1a;
|
||||
color: #1a1a1a;
|
||||
}
|
||||
tbody tr:nth-child(odd) td {
|
||||
background-color: #fff;
|
||||
}
|
||||
tbody td:last-child {
|
||||
padding-left: 0;
|
||||
width: 1rem;
|
||||
}
|
||||
caption {
|
||||
caption-side: bottom;
|
||||
line-height: 1.5rem;
|
||||
|
Loading…
Reference in New Issue
Block a user