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
 | 
					<?php
 | 
				
			||||||
class RedirectCheck
 | 
					class Follow
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // constants
 | 
					    // 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";
 | 
					    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'];
 | 
					        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
 | 
					<?php
 | 
				
			||||||
include('class.php');
 | 
					include('class.php');
 | 
				
			||||||
 | 
					include('search.php');
 | 
				
			||||||
 | 
					include('codes.php');
 | 
				
			||||||
?>
 | 
					?>
 | 
				
			||||||
<!DOCTYPE html>
 | 
					<!DOCTYPE html>
 | 
				
			||||||
<html>
 | 
					<html>
 | 
				
			||||||
@ -16,40 +18,41 @@ include('class.php');
 | 
				
			|||||||
                <a href="/"><span>Check a new URL</span></a>
 | 
					                <a href="/"><span>Check a new URL</span></a>
 | 
				
			||||||
            </nav>
 | 
					            </nav>
 | 
				
			||||||
        </menu>
 | 
					        </menu>
 | 
				
			||||||
    <form method="post" action="index.php" type="application/x-www-form-urlencoded">
 | 
					        <form method="post" action="/" type="application/x-www-form-urlencoded">
 | 
				
			||||||
      <input type="search" value="" placeholder="URL to check..." name="url">
 | 
					            <input type="url" value="" placeholder="URL to check..." name="url">
 | 
				
			||||||
            <button type="submit">Check</button>
 | 
					            <button type="submit">Check</button>
 | 
				
			||||||
        </form>
 | 
					        </form>
 | 
				
			||||||
    </header>
 | 
					    </header>
 | 
				
			||||||
    <main>
 | 
					    <main>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<?php
 | 
					<?php
 | 
				
			||||||
 | 
					// error message display
 | 
				
			||||||
 | 
					if (isset($error))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// if we have a valid request object
 | 
				
			||||||
if (isset($request) && count($request->path) > 0)
 | 
					if (isset($request) && count($request->path) > 0)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    $steps = count($request->path) - 1;
 | 
					    $steps = count($request->path) - 1;
 | 
				
			||||||
    $count = ($steps == 1) ? '1 redirect' : $steps.' redirects';
 | 
					    $count = ($steps == 1) ? '1 redirect' : $steps.' redirects';
 | 
				
			||||||
    echo "
 | 
					    echo "
 | 
				
			||||||
    <article>
 | 
					    <article>
 | 
				
			||||||
      <h2>
 | 
					        <h2>Final destination</h2>
 | 
				
			||||||
        Final destination
 | 
					        <p>The URL you traced had ".$count." and ended here:</p>
 | 
				
			||||||
      </h2>
 | 
					 | 
				
			||||||
      <p>
 | 
					 | 
				
			||||||
        The URL you traced had ".$count." and ended here:
 | 
					 | 
				
			||||||
      </p>
 | 
					 | 
				
			||||||
        <p class=\"final\">
 | 
					        <p class=\"final\">
 | 
				
			||||||
            <a href=\"".$request->getFinalRedirect()."\" target=\"blank\">
 | 
					            <a href=\"".$request->getFinalRedirect()."\" target=\"blank\">
 | 
				
			||||||
                ".$request->getFinalRedirect()."
 | 
					                ".$request->getFinalRedirect()."
 | 
				
			||||||
            </a>
 | 
					            </a>
 | 
				
			||||||
        </p>
 | 
					        </p>
 | 
				
			||||||
      <h3>
 | 
					        <h3>Redirect trace</h3>
 | 
				
			||||||
        Redirect trace
 | 
					 | 
				
			||||||
      </h3>
 | 
					 | 
				
			||||||
        <table>
 | 
					        <table>
 | 
				
			||||||
            <thead>
 | 
					            <thead>
 | 
				
			||||||
                <tr>
 | 
					                <tr>
 | 
				
			||||||
                    <th>Step</th>
 | 
					                    <th>Step</th>
 | 
				
			||||||
                    <th>Request</th>
 | 
					                    <th>Request</th>
 | 
				
			||||||
            <th>Code</th>
 | 
					                    <th colspan=\"2\">Code</th>
 | 
				
			||||||
            <th>Redirect</th>
 | 
					 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
            </thead>
 | 
					            </thead>
 | 
				
			||||||
            <tbody>";
 | 
					            <tbody>";
 | 
				
			||||||
@ -58,11 +61,11 @@ if (isset($request) && count($request->path) > 0)
 | 
				
			|||||||
      $item = $step['step'];
 | 
					      $item = $step['step'];
 | 
				
			||||||
      $url =  $step['url'];
 | 
					      $url =  $step['url'];
 | 
				
			||||||
      $code = $step['code'];
 | 
					      $code = $step['code'];
 | 
				
			||||||
      $next = ($step['next']) ? 'Yes' : '--';
 | 
					      $next = ($step['next']) ? '⥂⇄↩︎' : '✓';
 | 
				
			||||||
      echo "
 | 
					      echo "
 | 
				
			||||||
                <tr>
 | 
					                <tr>
 | 
				
			||||||
                    <td>".$item."</td>
 | 
					                    <td>".$item."</td>
 | 
				
			||||||
            <td>".$url."</td>
 | 
					                    <td>".$url." <a href=\"".$url."\" target=\"blank\"><b>↗︎</b></a></td>
 | 
				
			||||||
                    <td><code>".$code."</code></td>
 | 
					                    <td><code>".$code."</code></td>
 | 
				
			||||||
                    <td>".$next."</td>
 | 
					                    <td>".$next."</td>
 | 
				
			||||||
                </tr>";
 | 
					                </tr>";
 | 
				
			||||||
@ -105,142 +108,33 @@ else
 | 
				
			|||||||
        <h3>
 | 
					        <h3>
 | 
				
			||||||
            HTTP response status codes
 | 
					            HTTP response status codes
 | 
				
			||||||
        </h3>
 | 
					        </h3>
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					if (isset($codes) && is_array($codes) && !empty($codes))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    foreach ($codes as $group)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        echo "
 | 
				
			||||||
        <details>
 | 
					        <details>
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
          Informational (<code>1XX</code>–<code>199</code>)
 | 
					                ".$group['label']." (<code>".$group['start']."</code>–<code>".$group['range']."</code>)
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        <dl>
 | 
					            <dl>";
 | 
				
			||||||
 | 
					        foreach ($group['codes'] as $code => $prop)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            echo "
 | 
				
			||||||
 | 
					                <!-- ".$code." -->
 | 
				
			||||||
                <dt>
 | 
					                <dt>
 | 
				
			||||||
            <label for="100">
 | 
					                    <label for=\"".$code."\"><code>".$code."</code> ".$prop['name']."</label>
 | 
				
			||||||
              <code>100</code> Continue
 | 
					 | 
				
			||||||
            </label>
 | 
					 | 
				
			||||||
                </dt>
 | 
					                </dt>
 | 
				
			||||||
          <input type="checkbox" id="100">
 | 
					                <input type=\"checkbox\" id=\"".$code."\">
 | 
				
			||||||
          <dd>Continue the request or ignore the response if the request is already finished.</dd>
 | 
					                <dd>".$prop['desc']."</dd>";
 | 
				
			||||||
          <dt>
 | 
					        }
 | 
				
			||||||
            <label for="101">
 | 
					        echo "
 | 
				
			||||||
              <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>
 | 
					 | 
				
			||||||
            </dl>
 | 
					            </dl>
 | 
				
			||||||
      </details>
 | 
					        </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>
 | 
					 | 
				
			||||||
      <p>
 | 
					      <p>
 | 
				
			||||||
        See <a href="https://httpwg.org/specs/rfc9110.html#overview.of.status.codes">RFC 9110</a> for official documentation on each status code.
 | 
					        See <a href="https://httpwg.org/specs/rfc9110.html#overview.of.status.codes">RFC 9110</a> for official documentation on each status code.
 | 
				
			||||||
      </p>
 | 
					      </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;
 | 
					  background: #fff;
 | 
				
			||||||
  display: flex;
 | 
					  display: flex;
 | 
				
			||||||
  flex-direction: column;
 | 
					  flex-direction: column;
 | 
				
			||||||
  padding-bottom: 3rem;
 | 
					  height: 14rem;
 | 
				
			||||||
  width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -79,7 +79,7 @@ form {
 | 
				
			|||||||
  position: relative;
 | 
					  position: relative;
 | 
				
			||||||
  width: 90%;
 | 
					  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-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-repeat: no-repeat;
 | 
				
			||||||
  background-position: 1.25rem 50%;
 | 
					  background-position: 1.25rem 50%;
 | 
				
			||||||
@ -93,7 +93,7 @@ input[type="search"] {
 | 
				
			|||||||
  transition: box-shadow 150ms ease-in-out;
 | 
					  transition: box-shadow 150ms ease-in-out;
 | 
				
			||||||
  width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
input[type="search"]:focus {
 | 
					input[type="url"]:focus {
 | 
				
			||||||
  outline: none;
 | 
					  outline: none;
 | 
				
			||||||
  box-shadow: inset 0 0.25rem 0 0 #f0eded, 0 0 0 1px #fff, 0 0 0 0.25rem #39b9e4;
 | 
					  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 {
 | 
					aside {
 | 
				
			||||||
 | 
					    max-height: calc(100vh - 16.5rem);
 | 
				
			||||||
 | 
					    overflow: auto;
 | 
				
			||||||
    width: 86%;
 | 
					    width: 86%;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
details {
 | 
					details {
 | 
				
			||||||
@ -151,6 +153,30 @@ details dl {
 | 
				
			|||||||
details dl dt {
 | 
					details dl dt {
 | 
				
			||||||
    margin: 0 0 0.5rem;
 | 
					    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 {
 | 
					details dl dd {
 | 
				
			||||||
    display: none;
 | 
					    display: none;
 | 
				
			||||||
    font-size: 0.875rem;
 | 
					    font-size: 0.875rem;
 | 
				
			||||||
@ -158,6 +184,9 @@ details dl dd {
 | 
				
			|||||||
    margin-left: 0;
 | 
					    margin-left: 0;
 | 
				
			||||||
    padding: 0 0 1rem 0.1rem;
 | 
					    padding: 0 0 1rem 0.1rem;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					details dl dd code {
 | 
				
			||||||
 | 
					    font-size: 0.8rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
details dl input[type="checkbox"] {
 | 
					details dl input[type="checkbox"] {
 | 
				
			||||||
    display: none;
 | 
					    display: none;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -174,6 +203,7 @@ code {
 | 
				
			|||||||
    background: #fff;
 | 
					    background: #fff;
 | 
				
			||||||
    padding: 0.1rem 0.2rem;
 | 
					    padding: 0.1rem 0.2rem;
 | 
				
			||||||
    border-radius: 0.25rem;
 | 
					    border-radius: 0.25rem;
 | 
				
			||||||
 | 
					    white-space: nowrap;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
h2 {
 | 
					h2 {
 | 
				
			||||||
@ -222,9 +252,36 @@ td {
 | 
				
			|||||||
  vertical-align: top;
 | 
					  vertical-align: top;
 | 
				
			||||||
  word-wrap: anywhere;
 | 
					  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 {
 | 
					tbody tr:nth-child(odd) td {
 | 
				
			||||||
  background-color: #fff;
 | 
					  background-color: #fff;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					tbody td:last-child {
 | 
				
			||||||
 | 
					    padding-left: 0;
 | 
				
			||||||
 | 
					    width: 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
caption {
 | 
					caption {
 | 
				
			||||||
  caption-side: bottom;
 | 
					  caption-side: bottom;
 | 
				
			||||||
  line-height: 1.5rem;
 | 
					  line-height: 1.5rem;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user