Fix bin/publish: use correct .env path for rspade_system Fix bin/publish script: prevent grep exit code 1 from terminating script 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
106 lines
3.0 KiB
PHP
Executable File
106 lines
3.0 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Spatie\Robots;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
class RobotsHeaders
|
|
{
|
|
protected array $robotHeadersProperties = [];
|
|
|
|
public static function readFrom(string $source): self
|
|
{
|
|
$content = @file_get_contents($source);
|
|
|
|
if ($content === false) {
|
|
throw new InvalidArgumentException("Could not read from source `{$source}`");
|
|
}
|
|
|
|
return new self($http_response_header ?? []);
|
|
}
|
|
|
|
public static function create(array $headers): self
|
|
{
|
|
return new self($headers);
|
|
}
|
|
|
|
public function __construct(array $headers)
|
|
{
|
|
$this->robotHeadersProperties = $this->parseHeaders($headers);
|
|
}
|
|
|
|
public function mayIndex(string $userAgent = '*'): bool
|
|
{
|
|
return $this->none($userAgent) ? false : ! $this->noindex($userAgent);
|
|
}
|
|
|
|
public function mayFollow(string $userAgent = '*'): bool
|
|
{
|
|
return $this->none($userAgent) ? false : ! $this->nofollow($userAgent);
|
|
}
|
|
|
|
public function noindex(string $userAgent = '*'): bool
|
|
{
|
|
return
|
|
$this->robotHeadersProperties[$userAgent]['noindex']
|
|
?? $this->robotHeadersProperties['*']['noindex']
|
|
?? false;
|
|
}
|
|
|
|
public function nofollow(string $userAgent = '*'): bool
|
|
{
|
|
return
|
|
$this->robotHeadersProperties[$userAgent]['nofollow']
|
|
?? $this->robotHeadersProperties['*']['nofollow']
|
|
?? false;
|
|
}
|
|
|
|
public function none(string $userAgent = '*'): bool
|
|
{
|
|
return
|
|
$this->robotHeadersProperties[$userAgent]['none']
|
|
?? $this->robotHeadersProperties['*']['none']
|
|
?? false;
|
|
}
|
|
|
|
protected function parseHeaders(array $headers): array
|
|
{
|
|
$robotHeaders = $this->filterRobotHeaders($headers);
|
|
|
|
return array_reduce($robotHeaders, function (array $parsedHeaders, $header) {
|
|
$header = $this->normalizeHeaders($header);
|
|
|
|
$headerParts = explode(':', $header);
|
|
|
|
$userAgent = count($headerParts) === 3
|
|
? trim($headerParts[1])
|
|
: '*';
|
|
|
|
$options = end($headerParts);
|
|
|
|
$parsedHeaders[$userAgent] = [
|
|
'noindex' => strpos(strtolower($options), 'noindex') !== false,
|
|
'nofollow' => strpos(strtolower($options), 'nofollow') !== false,
|
|
'none' => strpos(strtolower($options), 'none') !== false,
|
|
];
|
|
|
|
return $parsedHeaders;
|
|
}, []);
|
|
}
|
|
|
|
protected function filterRobotHeaders(array $headers): array
|
|
{
|
|
return array_filter($headers, function ($header) use ($headers) {
|
|
$headerContent = $this->normalizeHeaders($headers[$header] ?? []);
|
|
|
|
return strpos(strtolower($header), 'x-robots-tag') === 0
|
|
|| strpos(strtolower($headerContent), 'x-robots-tag') === 0;
|
|
}, ARRAY_FILTER_USE_KEY);
|
|
}
|
|
|
|
protected function normalizeHeaders($headers): string
|
|
{
|
|
return implode(',', (array) $headers);
|
|
}
|
|
}
|