feat: add S3-compatible storage provider (MinIO, Ceph, R2, etc.)
Adds a new 'S3-Compatible Storage' provider that works with any
S3-API-compatible object storage service, including MinIO, Ceph,
Cloudflare R2, Backblaze B2, and others.
Changes:
- New provider class: classes/providers/storage/s3-compatible-provider.php
- Provider key: s3compatible
- Reads user-configured endpoint URL from settings
- Uses path-style URL access (required by most S3-compatible services)
- Supports credentials via AS3CF_S3COMPAT_ACCESS_KEY_ID /
AS3CF_S3COMPAT_SECRET_ACCESS_KEY wp-config.php constants
- Disables AWS-specific features (Block Public Access, Object Ownership)
- New provider SVG icons (s3compatible.svg, -link.svg, -round.svg)
- Registered provider in main plugin class with endpoint setting support
- Updated StorageProviderSubPage to show endpoint URL input for S3-compatible
- Built pro settings bundle with rollup (Svelte 4.2.19)
- Added package.json and updated rollup.config.mjs for pro-only builds
This commit is contained in:
116
vendor/Gcp/google/gax/src/AgentHeader.php
vendored
Normal file
116
vendor/Gcp/google/gax/src/AgentHeader.php
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2016 Google LLC
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
namespace DeliciousBrains\WP_Offload_Media\Gcp\Google\ApiCore;
|
||||
|
||||
/**
|
||||
* Class containing functions used to build the Agent header.
|
||||
*/
|
||||
class AgentHeader
|
||||
{
|
||||
const AGENT_HEADER_KEY = 'x-goog-api-client';
|
||||
const UNKNOWN_VERSION = '';
|
||||
/**
|
||||
* @param array $headerInfo {
|
||||
* Optional.
|
||||
*
|
||||
* @type string $phpVersion the PHP version.
|
||||
* @type string $libName the name of the client application.
|
||||
* @type string $libVersion the version of the client application.
|
||||
* @type string $gapicVersion the code generator version of the GAPIC library.
|
||||
* @type string $apiCoreVersion the ApiCore version.
|
||||
* @type string $grpcVersion the gRPC version.
|
||||
* @type string $restVersion the REST transport version (typically same as the
|
||||
* ApiCore version).
|
||||
* @type string $protobufVersion the protobuf version in format 'x.y.z+a' where both 'x.y.z'
|
||||
* and '+a' are optional, and where 'a' is a single letter representing the
|
||||
* implementation type of the protobuf runtime. It is recommended to use 'c' for a C
|
||||
* implementation, and 'n' for the native language implementation (PHP).
|
||||
* }
|
||||
* @return array Agent header array
|
||||
*/
|
||||
public static function buildAgentHeader(array $headerInfo)
|
||||
{
|
||||
$metricsHeaders = [];
|
||||
// The ordering of the headers is important. We use the fact that $metricsHeaders is an
|
||||
// ordered dict. The desired ordering is:
|
||||
// - phpVersion (gl-php/)
|
||||
// - clientName (e.g. gccl/)
|
||||
// - gapicVersion (gapic/)
|
||||
// - apiCoreVersion (gax/)
|
||||
// - grpcVersion (grpc/)
|
||||
// - restVersion (rest/)
|
||||
// - protobufVersion (pb/)
|
||||
$metricsHeaders['gl-php'] = $headerInfo['phpVersion'] ?? \phpversion();
|
||||
if (isset($headerInfo['libName'])) {
|
||||
$metricsHeaders[$headerInfo['libName']] = $headerInfo['libVersion'] ?? self::UNKNOWN_VERSION;
|
||||
}
|
||||
$apiCoreVersion = $headerInfo['apiCoreVersion'] ?? Version::getApiCoreVersion();
|
||||
$metricsHeaders['gapic'] = $headerInfo['gapicVersion'] ?? self::UNKNOWN_VERSION;
|
||||
$metricsHeaders['gax'] = $apiCoreVersion;
|
||||
// Context on library type identification (between gRPC+REST and REST-only):
|
||||
// This uses the gRPC extension's version if 'grpcVersion' is not set, so we
|
||||
// cannot use the presence of 'grpcVersion' to determine whether or not a library
|
||||
// is gRPC+REST or REST-only. However, we cannot use the extension's presence
|
||||
// either, since some clients may have the extension installed but opt to use a
|
||||
// REST-only library (e.g. GCE).
|
||||
// TODO: Should we stop sending empty gRPC headers?
|
||||
$metricsHeaders['grpc'] = $headerInfo['grpcVersion'] ?? \phpversion('grpc');
|
||||
$metricsHeaders['rest'] = $headerInfo['restVersion'] ?? $apiCoreVersion;
|
||||
// The native version is not set by default because it is complex and costly to retrieve.
|
||||
// Users can override this default behavior if needed.
|
||||
$metricsHeaders['pb'] = $headerInfo['protobufVersion'] ?? (\phpversion('protobuf') ? \phpversion('protobuf') . '+c' : '+n');
|
||||
$metricsList = [];
|
||||
foreach ($metricsHeaders as $key => $value) {
|
||||
$metricsList[] = $key . "/" . $value;
|
||||
}
|
||||
return [self::AGENT_HEADER_KEY => [\implode(" ", $metricsList)]];
|
||||
}
|
||||
/**
|
||||
* Reads the gapic version string from a VERSION file. In order to determine the file
|
||||
* location, this method follows this procedure:
|
||||
* - accepts a class name $callingClass
|
||||
* - identifies the file defining that class
|
||||
* - searches up the directory structure for the 'src' directory
|
||||
* - looks in the directory above 'src' for a file named VERSION
|
||||
*
|
||||
* @param string $callingClass
|
||||
* @return string the gapic version
|
||||
* @throws \ReflectionException
|
||||
*/
|
||||
public static function readGapicVersionFromFile(string $callingClass)
|
||||
{
|
||||
$callingClassFile = (new \ReflectionClass($callingClass))->getFileName();
|
||||
$versionFile = \substr($callingClassFile, 0, \strrpos($callingClassFile, \DIRECTORY_SEPARATOR . 'src' . \DIRECTORY_SEPARATOR)) . \DIRECTORY_SEPARATOR . 'VERSION';
|
||||
return Version::readVersionFile($versionFile);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user