Reason::Login, 403 => Reason::Forbidden, 404 => Reason::NotFound, 410 => Reason::Gone, 429 => Reason::RateLimited, ); public function __construct( private HostLookup $host_lookup ) { } public function judge( string $requested_url, HttpAnswer $answer ): Judgement { $status_code = $answer->status_code; if ( null === $status_code ) { return new Judgement( $this->reason_for_error( $requested_url, $answer->error_message ), null, null ); } $is_success = $this->is_between( $status_code, self::FIRST_SUCCESS_CODE, self::LAST_SUCCESS_CODE ); if ( $is_success ) { return $this->success_judgement( $requested_url, $answer, $status_code ); } return new Judgement( $this->reason_for_failure( $status_code ), $status_code, null ); } private function success_judgement( string $requested_url, HttpAnswer $answer, int $status_code ): Judgement { if ( $requested_url === $answer->final_url ) { return new Judgement( Reason::Ok, $status_code, null ); } return new Judgement( Reason::Redirect, $answer->first_status_code, $answer->final_url ); } private function reason_for_failure( int $status_code ): Reason { if ( isset( self::STATUS_REASONS[ $status_code ] ) ) { return self::STATUS_REASONS[ $status_code ]; } $is_server_error = $this->is_between( $status_code, self::FIRST_SERVER_ERROR_CODE, self::LAST_SERVER_ERROR_CODE ); return $is_server_error ? Reason::ServerError : Reason::Forbidden; } private function reason_for_error( string $requested_url, string $error_message ): Reason { if ( 1 === preg_match( self::NO_HOST_PATTERN, $error_message ) ) { return Reason::NoHost; } $host = (string) wp_parse_url( $requested_url, PHP_URL_HOST ); if ( ! $this->host_lookup->exists( $host ) ) { return Reason::NoHost; } return 1 === preg_match( self::SSL_PATTERN, $error_message ) ? Reason::Ssl : Reason::Timeout; } private function is_between( int $value, int $lowest, int $highest ): bool { return $value >= $lowest && $value <= $highest; } }