3518555d1e
R2 S3 Signature V4 client in [src/R2/R2Client.php](/Users/tyemeclifford/Documents/GH/CloudflareR2-Manager/src/R2/R2Client.php) SQLite mirror, usage ledger, settings, local tags, permission labels, and signed URL history under [src/Repository](/Users/tyemeclifford/Documents/GH/CloudflareR2-Manager/src/Repository) Simple password auth and CSRF protection Uploads, folders, sync, copy/move/delete, downloads, presigned URLs, CORS JSON management, and usage/billing-style summaries Setup docs in [README.md](/Users/tyemeclifford/Documents/GH/CloudflareR2-Manager/README.md) and config template in [.env.example](/Users/tyemeclifford/Documents/GH/CloudflareR2-Manager/.env.example) Important R2 caveat: Cloudflare’s current R2 S3 compatibility docs say ACLs and object-tagging APIs are not implemented, so the app stores tags and permission labels locally in SQLite while keeping file bytes on R2. I used Cloudflare’s official docs for S3 compatibility, presigned URLs, and CORS.
30 lines
533 B
PHP
30 lines
533 B
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace R2Manager\R2;
|
|
|
|
use RuntimeException;
|
|
|
|
final class R2Exception extends RuntimeException
|
|
{
|
|
public function __construct(
|
|
string $message,
|
|
private readonly int $statusCode = 0,
|
|
private readonly string $responseBody = ''
|
|
) {
|
|
parent::__construct($message, $statusCode);
|
|
}
|
|
|
|
public function statusCode(): int
|
|
{
|
|
return $this->statusCode;
|
|
}
|
|
|
|
public function responseBody(): string
|
|
{
|
|
return $this->responseBody;
|
|
}
|
|
}
|
|
|