Skip to content

Add Middleware/Interceptor System for Request/Response Transformation#71

Closed
Copilot wants to merge 37 commits intomainfrom
copilot/add-middleware-interceptor-system
Closed

Add Middleware/Interceptor System for Request/Response Transformation#71
Copilot wants to merge 37 commits intomainfrom
copilot/add-middleware-interceptor-system

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Nov 28, 2025

Pull Request

Description

What does this PR do?

Adds a middleware pipeline system for request/response transformation, enabling interceptor-like patterns similar to JavaScript fetch interceptors or Laravel HTTP middleware. This allows automatic authentication token management, logging, caching, rate limiting, and custom business logic injection without manually wrapping every call.

Fixes #(issue_number)

Type of Change

  • ✨ New feature (non-breaking change which adds functionality)

Changes Made

  • MiddlewareInterface - Contract for middleware implementations with handle(RequestInterface $request, callable $next) signature
  • MiddlewarePipeline - Priority-based middleware execution using chain-of-responsibility pattern with input validation
  • SupportsMiddleware trait - Adds middleware(), addMiddleware(), prependMiddleware(), when(), unless() methods to ClientHandler
  • Integrated middleware execution into PerformsHttpRequests::sendRequest() flow
  • Updated ClientHandler interface with middleware method signatures
  • Added __clone() method to ensure cloned handlers have independent middleware pipelines
  • Improved stream handling with seekability checks for non-seekable streams
  • Added constructor validation for middleware array format
  • No new dependencies - uses existing PSR-7/Promise interfaces

Usage:

// Custom middleware
class AuthMiddleware implements MiddlewareInterface {
    public function handle(RequestInterface $request, callable $next): Response|PromiseInterface {
        return $next($request->withHeader('Authorization', 'Bearer ' . $this->token));
    }
}

// Apply middleware
fetch_client()
    ->middleware([new AuthMiddleware(), new LoggingMiddleware()])
    ->get('/api/users');

// Conditional middleware
fetch_client()
    ->when($isProd, fn($c) => $c->addMiddleware(new SecurityMiddleware()))
    ->get('/api/data');

Testing

  • Unit tests added/updated
  • All existing tests pass

Test Environment:

  • PHP Version: 8.3
  • Operating System: Linux

32 new tests covering pipeline execution order, priority sorting, request/response modification, short-circuiting, conditional middleware, constructor validation, and clone independence.

Documentation

  • Code is self-documenting with clear variable names and logic
  • PHPDoc comments added for public methods with proper callable signatures (callable(static): void)

Checklist

  • My code follows the project's coding standards
  • I have performed a self-review of my code
  • My changes generate no new warnings or errors
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes

Additional Notes

  • Middleware executes in priority order (higher priority first), with response processing in reverse order (onion model)
  • Fully backward compatible - no performance impact when middleware is not used
  • Supports both sync responses and async promises
  • middleware() replaces existing middleware; use addMiddleware() to append without replacing
  • Cloned handlers have independent middleware pipelines to prevent shared state issues
  • Stream body handling includes seekability checks for compatibility with non-seekable streams
  • Constructor validates middleware format and throws InvalidArgumentException for invalid items
Original prompt

This section details on the original issue you should resolve

<issue_title>Middleware/Interceptor System</issue_title>
<issue_description>## Summary
Add a middleware pipeline system for request/response transformation, similar to JavaScript fetch interceptors or Laravel HTTP middleware.

Motivation

Currently, there's no way to globally modify requests or responses without manually wrapping every call. A middleware system would enable:

  • Automatic authentication token management and refresh
  • Comprehensive request/response logging with correlation IDs
  • Multi-layer caching strategies (memory, Redis, file-based)
  • Rate limiting with backoff strategies
  • Custom business logic injection (tenant isolation, feature flags)
  • Request/response transformation and normalization
  • Error handling and retry logic customization
  • API versioning and backward compatibility layers

Proposed API

// Middleware interface
interface MiddlewareInterface
{
    public function handle(RequestInterface $request, callable $next): ResponseInterface|PromiseInterface;
}

// Example: Authentication middleware with token refresh
class AuthMiddleware implements MiddlewareInterface
{
    public function __construct(
        private TokenManager $tokenManager,
        private array $excludedPaths = []
    ) {}

    public function handle(RequestInterface $request, callable $next): ResponseInterface|PromiseInterface
    {
        // Skip auth for excluded paths
        if ($this->shouldSkip($request)) {
            return $next($request);
        }

        // Add or refresh token
        $token = $this->tokenManager->getValidToken();
        $request = $request->withHeader('Authorization', 'Bearer ' . $token);
        
        $response = $next($request);
        
        // Handle token expiry
        if ($response->getStatusCode() === 401) {
            $newToken = $this->tokenManager->refreshToken();
            $request = $request->withHeader('Authorization', 'Bearer ' . $newToken);
            return $next($request);
        }
        
        return $response;
    }
}

// Example: Comprehensive logging middleware
class LoggingMiddleware implements MiddlewareInterface
{
    public function handle(RequestInterface $request, callable $next): ResponseInterface|PromiseInterface
    {
        $correlationId = $this->generateCorrelationId();
        $request = $request->withHeader('X-Correlation-ID', $correlationId);
        
        $startTime = microtime(true);
        
        $this->logger->info('HTTP Request Started', [
            'correlation_id' => $correlationId,
            'method' => $request->getMethod(),
            'uri' => (string) $request->getUri(),
            'headers' => $this->sanitizeHeaders($request->getHeaders()),
        ]);
        
        $response = $next($request);
        
        $duration = (microtime(true) - $startTime) * 1000;
        
        $this->logger->info('HTTP Request Completed', [
            'correlation_id' => $correlationId,
            'status_code' => $response->getStatusCode(),
            'duration_ms' => round($duration, 2),
            'response_size' => $response->getHeaderLine('Content-Length') ?: strlen($response->getBody()),
        ]);
        
        return $response;
    }
}

// Example: Intelligent caching middleware
class CacheMiddleware implements MiddlewareInterface
{
    public function __construct(
        private CacheInterface $cache,
        private array $cacheMethods = ['GET', 'HEAD'],
        private int $defaultTtl = 300
    ) {}

    public function handle(RequestInterface $request, callable $next): ResponseInterface|PromiseInterface
    {
        if (!in_array($request->getMethod(), $this->cacheMethods)) {
            return $next($request);
        }
        
        $cacheKey = $this->generateCacheKey($request);
        
        // Check cache first
        if ($cached = $this->cache->get($cacheKey)) {
            $this->addCacheHeaders($cached, 'HIT');
            return $cached;
        }
        
        $response = $next($request);
        
        // Cache successful responses
        if ($response->getStatusCode() >= 200 && $response->getStatusCode() < 300) {
            $ttl = $this->determineTtl($response);
            $this->cache->set($cacheKey, $response, $ttl);
            $this->addCacheHeaders($response, 'MISS');
        }
        
        return $response;
    }
}

// Usage examples
fetch_client()
    ->middleware([
        new AuthMiddleware($tokenManager, ['/health', '/metrics']),
        new LoggingMiddleware($logger),
        new CacheMiddleware($redisCache, ['GET'], 600),
        new RateLimitMiddleware($limiter, 100, 3600), // 100 requests per hour
        new RetryMiddleware([500, 502, 503], 3, 1000), // Retry server errors
    ])
    ->get('/api/users');

// Per-request middleware
fetch_client()
    ->addMiddleware(new TenantIsolationMiddleware($tenantId))
    ->addMiddleware(new FeatureFlagMiddleware($flags))
    -...

</details>

- Fixes Thavarshan/fetch-php#39

<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

@netlify
Copy link
Copy Markdown

netlify Bot commented Nov 28, 2025

Deploy Preview for fetch-php canceled.

Name Link
🔨 Latest commit d971e7b
🔍 Latest deploy log https://app.netlify.com/projects/fetch-php/deploys/692b01ef9cd03600088dac7d

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Nov 28, 2025

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

Copilot AI and others added 2 commits November 28, 2025 17:32
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Copilot AI changed the title [WIP] Add middleware/interceptor system for request/response handling Add Middleware/Interceptor System for Request/Response Transformation Nov 28, 2025
Copilot AI requested a review from Thavarshan November 28, 2025 17:37
@Thavarshan Thavarshan requested review from Copilot and removed request for Thavarshan November 28, 2025 17:47
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a comprehensive middleware/interceptor system for request/response transformation to the Fetch HTTP client library. The implementation follows the chain-of-responsibility pattern, enabling developers to inject custom logic for authentication, logging, caching, rate limiting, and other cross-cutting concerns without manually wrapping every HTTP call.

Key Changes:

  • Introduces a MiddlewareInterface contract for implementing custom middleware with handle(RequestInterface, callable) signature
  • Implements a priority-based MiddlewarePipeline class that executes middleware in order with support for request/response modification and short-circuiting
  • Adds SupportsMiddleware trait providing fluent methods (middleware(), addMiddleware(), prependMiddleware(), when(), unless()) for middleware management

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 13 comments.

Show a summary per file
File Description
src/Fetch/Interfaces/MiddlewareInterface.php Defines the contract for middleware implementations with request/response transformation capabilities
src/Fetch/Interfaces/ClientHandler.php Extends the client handler interface with middleware management method signatures
src/Fetch/Http/MiddlewarePipeline.php Core pipeline implementation managing middleware execution order with priority-based sorting
src/Fetch/Http/ClientHandler.php Integrates the SupportsMiddleware trait into the main client handler
src/Fetch/Concerns/SupportsMiddleware.php Provides middleware management methods with lazy initialization and conditional application support
src/Fetch/Concerns/PerformsHttpRequests.php Integrates middleware execution into the request flow with PSR-7 request conversion and body handling
tests/Unit/MiddlewarePipelineTest.php Comprehensive test coverage for pipeline behavior including execution order, modification, and short-circuiting
tests/Unit/SupportsMiddlewareTest.php Tests for middleware management methods including priority handling and conditional application

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/Fetch/Interfaces/ClientHandler.php Outdated
Comment on lines +250 to +252
$body->rewind();
$bodyContents = $body->getContents();
$body->rewind();
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code calls $body->rewind() multiple times (lines 250, 252) without checking if the stream is seekable. Non-seekable streams (like php://input in some contexts) will throw an exception when rewind() is called.

Consider checking if the stream is seekable before rewinding:

$body = $request->getBody();
if ($body->getSize() > 0) {
    if ($body->isSeekable()) {
        $body->rewind();
    }
    $bodyContents = $body->getContents();
    if ($body->isSeekable()) {
        $body->rewind();
    }
    
    // ... rest of the logic
}

Alternatively, since you're converting the body to a string anyway, you might not need to rewind it back after reading.

Suggested change
$body->rewind();
$bodyContents = $body->getContents();
$body->rewind();
if ($body->isSeekable()) {
$body->rewind();
}
$bodyContents = $body->getContents();
if ($body->isSeekable()) {
$body->rewind();
}

Copilot uses AI. Check for mistakes.
Comment thread src/Fetch/Concerns/SupportsMiddleware.php Outdated
Comment on lines +577 to +583
/**
* Set multiple middleware at once.
*
* @param array<MiddlewareInterface|array{middleware: MiddlewareInterface, priority: int}> $middleware
* @return $this
*/
public function middleware(array $middleware): self;
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to the trait, the interface documentation should clarify that middleware() replaces existing middleware:

/**
 * Set multiple middleware at once, replacing any existing middleware.
 *
 * Note: This replaces the entire middleware pipeline. Use addMiddleware() 
 * to add middleware without removing existing ones.
 *
 * @param  array<MiddlewareInterface|array{middleware: MiddlewareInterface, priority: int}>  $middleware
 * @return $this
 */

Copilot uses AI. Check for mistakes.
* @param callable $next The next middleware or final handler
* @return \Fetch\Interfaces\Response|PromiseInterface<\Fetch\Interfaces\Response> The response or promise
*/
public function handle(RequestInterface $request, callable $next): Response|PromiseInterface;
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing import statement for the Response interface. The return type uses Response but there's no corresponding use statement. Add this import at the top of the file:

use Fetch\Interfaces\Response;

Alternatively, use the fully qualified name in the type hint:

public function handle(RequestInterface $request, callable $next): \Fetch\Interfaces\Response|PromiseInterface;

Copilot uses AI. Check for mistakes.
/**
* The middleware pipeline instance.
*/
protected ?MiddlewarePipeline $middlewarePipeline = null;
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When the handler is cloned on line 159 of sendRequest(), the $middlewarePipeline property (which is an object reference) will be shallow-copied. This means both the original handler and the cloned handler will share the same middleware pipeline instance. If middleware is added to one handler, it will affect the other.

This could lead to unexpected behavior where middleware added to a cloned handler affects the original handler. Consider implementing a __clone() method in the ClientHandler class or the trait:

public function __clone(): void
{
    if ($this->middlewarePipeline !== null) {
        $middleware = $this->middlewarePipeline->getMiddleware();
        $this->middlewarePipeline = new MiddlewarePipeline($middleware);
    }
}

Copilot uses AI. Check for mistakes.
Comment thread src/Fetch/Concerns/SupportsMiddleware.php Outdated
Comment on lines +619 to +626
/**
* Conditionally add middleware.
*
* @param bool $condition The condition to check
* @param callable $callback Callback that receives $this and should add middleware
* @return $this
*/
public function when(bool $condition, callable $callback): self;
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Similar to the trait, the interface PHPDoc should clarify the callback signature for better type safety and IDE support:

/**
 * Conditionally add middleware.
 *
 * @param  bool  $condition  The condition to check
 * @param  callable(static): void  $callback  Callback that receives $this for adding middleware
 * @return $this
 */

Copilot uses AI. Check for mistakes.
Comment on lines +34 to +45
public function __construct(array $middleware = [])
{
foreach ($middleware as $item) {
if ($item instanceof MiddlewareInterface) {
$this->middleware[] = ['middleware' => $item, 'priority' => 0];
} else {
$this->middleware[] = $item;
}
}

$this->sortMiddleware();
}
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The constructor accepts arrays with ['middleware' => ..., 'priority' => ...] format but doesn't validate the structure. If an array is passed without the 'middleware' key, it will be added to the stack as-is, which will cause errors later when trying to access $item['middleware'] in the buildPipeline() method.

Consider adding validation:

public function __construct(array $middleware = [])
{
    foreach ($middleware as $item) {
        if ($item instanceof MiddlewareInterface) {
            $this->middleware[] = ['middleware' => $item, 'priority' => 0];
        } elseif (is_array($item) && isset($item['middleware']) && $item['middleware'] instanceof MiddlewareInterface) {
            $this->middleware[] = [
                'middleware' => $item['middleware'],
                'priority' => $item['priority'] ?? 0
            ];
        } else {
            throw new \InvalidArgumentException(
                'Middleware must be an instance of MiddlewareInterface or an array with "middleware" key'
            );
        }
    }

    $this->sortMiddleware();
}

Copilot uses AI. Check for mistakes.
Comment on lines +98 to +103
/**
* Conditionally add middleware.
*
* @param bool $condition The condition to check
* @param callable $callback Callback that receives $this and should add middleware
* @return $this
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The PHPDoc comment for the when() method states "Callback that receives $this and should add middleware", but it doesn't specify what the callback should return. The callback's return value is currently ignored. Consider clarifying this in the documentation:

/**
 * Conditionally add middleware.
 *
 * @param  bool  $condition  The condition to check
 * @param  callable(static): void  $callback  Callback that receives $this for adding middleware
 * @return $this
 */

This makes it clearer that the callback doesn't need to return anything and receives the handler instance as a parameter.

Copilot uses AI. Check for mistakes.
Thavarshan and others added 3 commits November 29, 2025 19:42
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@Thavarshan
Copy link
Copy Markdown
Owner

@copilot apply changes based on the comments in this thread

Copilot AI and others added 9 commits November 29, 2025 19:45
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
…tion, remove error_log

Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
…ering

Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Thavarshan and others added 22 commits November 29, 2025 19:45
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
…ed config

Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
…PHPDoc tags

Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
…n, null handling, and tests

Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
…t method; update response type hints in caching methods
…, fix cloning

Co-authored-by: Thavarshan <10804999+Thavarshan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Nov 29, 2025

@copilot apply changes based on the comments in this thread

Applied all changes from the code review in commit d971e7b:

  1. Stream handling - Added isSeekable() checks before rewind() and improved body size check for various stream types
  2. Options side effects - Now using a copy of the options array ($modifiedOptions) in the core handler
  3. Middleware validation - Constructor now validates middleware format and throws InvalidArgumentException for invalid items
  4. Clone handling - Added __clone() method and cloneMiddlewarePipeline() helper to ensure cloned handlers have independent middleware pipelines
  5. PHPDoc improvements - Updated callback signatures to callable(static): void for better type safety
  6. Documentation - Clarified that middleware() replaces existing middleware in both trait and interface

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/c4a25f20390337789c26b693ae46faa125040352
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/Thavarshan/matrix/zipball/17077b50c6ab2689847561752fae9940e49c10e8
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/laravel/pint/zipball/69dcca060ecb15e4b564af63d1f642c81a241d6f
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/console/zipball/0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/stopwatch/zipball/8a24af0a2e8a872fb745047180649b8418303084
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)
  • https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678
    • Triggering command: /usr/bin/php8.3 /usr/bin/php8.3 -n -c /tmp/oW1uf4 /usr/bin/composer install --no-progress (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants