amphp/hpack
Fast HPACK (HTTP/2 header compression) implementation for PHP by amphp. Provides efficient encoding/decoding of header blocks with dynamic tables, Huffman coding, and compliance-focused behavior, suitable for high-performance HTTP/2 clients and servers.
composer require amphp/hpack
use Amp\Hpack\Encoder;
use Amp\Hpack\Decoder;
$encoder = new Encoder();
$decoder = new Decoder();
$headers = [[':method', 'GET'], [':path', '/']];
$encoded = $encoder->encode($headers); // Binary string
$decoded = $decoder->decode($encoded); // Original headers array
Laravel HTTP/2 Proxy Middleware (if using a custom async server like Amp):
// In a custom HTTP/2 server middleware
public function handleRequest(array $headers) {
$encoder = new Encoder();
$compressed = $encoder->encode($headers);
// Send $compressed via HTTP/2 frame
}
Request/Response Compression:
// Compress outgoing headers (e.g., in a custom HTTP server)
$encoder = new Encoder();
$compressed = $encoder->encode($requestHeaders);
// Decompress incoming headers
$decoder = new Decoder();
$headers = $decoder->decode($compressedHeaders);
Dynamic Table Management:
$decoder = new Decoder(2048); // 2KB limit
SETTINGS_HEADER_TABLE_SIZE updates from peers (critical for HTTP/2 compliance).Integration with Async Frameworks:
use Amp\ByteStream\ReadableStream;
use Amp\Hpack\Decoder;
$decoder = new Decoder();
$stream = new ReadableStream(...);
$headers = $decoder->decodeStream($stream); // Decode headers incrementally
Streaming Decoding (for large headers):
$decoder = new Decoder();
$decoder->setStreamMode(true);
$headers = $decoder->decode($chunk1 . $chunk2); // Handles partial data
(Note: Direct Laravel integration is limited; use cases require custom async servers.)
Amp\Http\Server\Request to inject HPack encoding/decoding:
class HpackMiddleware {
public function __invoke(ServerRequestInterface $request, callable $next) {
$encoder = new Encoder();
$request = $request->withHeader(
'custom-header',
$encoder->encode([['x-custom', 'value']])
);
return $next($request);
}
}
$client = new Amp\Http\Client();
$encoder = new Encoder();
$response = $client->request('GET', 'https://example.com', [
'headers' => $encoder->encode([['custom', 'value']])
]);
Stateful Dynamic Table:
SETTINGS_HEADER_TABLE_SIZE frames causes corruption.$decoder->setTableSizeLimit($newSize);
Binary Safety:
decode() throws HttpException on malformed input (e.g., truncated Huffman data).try {
$headers = $decoder->decode($binaryData);
} catch (HttpException $e) {
// Log and handle (e.g., reset connection)
}
Header Name Case Sensitivity:
HeaderBag is case-preserving.$normalized = array_map('strtolower', $headers);
Memory Leaks:
$decoder = new Decoder(1024); // 1KB limit
$decoder = new Decoder();
$decoder->setDebug(true); // Logs Huffman/HPack internals
RfcTest to validate compliance with RFC 7541 test vectors.Encoder/Decoder to preprocess headers (e.g., redact sensitive data):
class CustomEncoder extends Encoder {
protected function encodeHeader(string $name, string $value): string {
if ($name === 'authorization') {
$value = '***';
}
return parent::encodeHeader($name, $value);
}
}
libnghttp2):
$decoder = new \Amp\Hpack\Decoder\FFI();
$decoder->setTableSizeLimit(
min(4096, $connection->getMemoryUsage() * 0.1)
);
Request/Response classes assume HTTP/1.1. HPack integration requires a custom async server (e.g., Amp).Symfony\Component\HttpFoundation headers—normalize formats first.Amp\Http\Server\Test\DecoderTest as a reference for writing unit tests. Example:
public function testHpackCompression() {
$encoder = new Encoder();
$decoder = new Decoder();
$headers = [[':method', 'POST'], ['content-type', 'application/json']];
$encoded = $encoder->encode($headers);
$this->assertEquals($headers, $decoder->decode($encoded));
}
How can I help you explore Laravel packages today?