tourze / psr15-static-file-request-handler
PSR-15 Static File Request Handler
Installs: 8
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/tourze/psr15-static-file-request-handler
Requires
- php: ^8.1
- league/mime-type-detection: ^1.0
- nyholm/psr7: ^1.8.2
- psr/http-message: ^1.1 || ^2.0
- psr/http-server-handler: ^1.0
- symfony/filesystem: ^6.4
Requires (Dev)
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2025-10-31 05:38:14 UTC
README
A PSR-15 compatible request handler for serving static files efficiently in PHP applications. Supports cache headers, range requests, directory index, and MIME type detection.
Features
- PSR-15 compatible static file request handler
- Supports directory index (index.html, index.htm)
- MIME type auto-detection using league/mime-type-detection
- HTTP cache support (ETag, Last-Modified, 304 Not Modified)
- Range requests (partial content, 206)
- Prevents serving PHP files for security
- Easy integration with any PSR-15 middleware stack
Installation
Install via Composer:
composer require tourze/psr15-static-file-request-handler
Dependencies
Requirements:
- PHP >= 8.1
- Composer
Dependencies:
psr/http-message- PSR-7 HTTP message interfacespsr/http-server-handler- PSR-15 HTTP handlersleague/mime-type-detection- MIME type detectionnyholm/psr7- PSR-7 implementationsymfony/filesystem- File system operations
Quick Start
use Tourze\PSR15StaticFileRequestHandler\StaticFileRequestHandler; use Nyholm\Psr7\ServerRequest; $publicPath = __DIR__ . '/public'; $handler = new StaticFileRequestHandler($publicPath); $request = new ServerRequest('GET', '/test.txt'); $response = $handler->handle($request); // Output response body echo $response->getBody();
Example: Handling Range Requests
$request = $request->withHeader('Range', 'bytes=0-4'); $response = $handler->handle($request); // Will return partial content (206) with specified range
Documentation
Public API
- Constructor:
StaticFileRequestHandler::__construct(string $publicPath, ?Filesystem $filesystem = null) - Handler method:
handle(ServerRequestInterface $request): ResponseInterface
Response Codes
- 200 OK: File found and served successfully
- 206 Partial Content: Range request served successfully
- 304 Not Modified: File not modified (cache hit)
- 404 Not Found: File does not exist
- 416 Range Not Satisfiable: Invalid range request
- 500 Internal Server Error: File read error
Configuration
publicPath: The root directory for static files- Optionally pass a Symfony Filesystem instance
Advanced Usage
Custom Filesystem Integration
use Symfony\Component\Filesystem\Filesystem; $filesystem = new Filesystem(); $handler = new StaticFileRequestHandler($publicPath, $filesystem);
Middleware Integration
use Slim\App; $app = new App(); $app->add(function ($request, $handler) { $staticHandler = new StaticFileRequestHandler(__DIR__ . '/public'); return $staticHandler->handle($request); });
Cache Headers
The handler automatically sets cache headers:
ETagfor cache validationLast-Modifiedfor conditional requestsCache-Control: public, max-age=86400for browser caching
Range Request Support
Supports HTTP range requests for:
- Large file downloads
- Video streaming
- Progressive loading
Directory Index
Automatically serves index files:
index.html(preferred)index.htm(fallback)
Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/fooBar) - Commit your changes (
git commit -am 'Add some fooBar') - Push to the branch (
git push origin feature/fooBar) - Create a new Pull Request
Coding Style: PSR-12
Testing:
composer install vendor/bin/phpunit
License
MIT License. See LICENSE for details.
Changelog
See Releases for version history and upgrade notes.