Content-Length Plugin

The ContentLengthPlugin sets the correct Content-Length header value based on the size of the body stream of the request. This helps HTTP servers to handle the request:

use Http\Discovery\HttpClientDiscovery;
use Http\Client\Common\PluginClient;
use Http\Client\Common\Plugin\ContentLengthPlugin;

$contentLengthPlugin = new ContentLengthPlugin();

$pluginClient = new PluginClient(
    HttpClientDiscovery::find(),
    [$contentLengthPlugin]
);

If the size of the stream can not be determined, the plugin sets the Encoding header to chunked, as defined in RFC 7230 Section 4.1

This is useful when you want to transfer data of unknown size to an HTTP application without consuming memory.

As an example, let’s say you want to send a tar archive of the current directory to an API. Normally you would end up doing this in 2 steps, first saving the result of the tar archive into a file or into the memory of PHP with a variable, then sending this content with an HTTP Request.

With this plugin you can achieve this behavior without doing the first step:

proc_open("/usr/bin/env tar c .", [["pipe", "r"], ["pipe", "w"], ["pipe", "w"]], $pipes, "/path/to/directory");
$tarResource  = $pipes[1];

$request = MessageFactoryDiscovery::find()->createRequest('POST', '/url/to/api/endpoint', [], $tarResource);
$response = $pluginClient->sendRequest($request);

In this case the tar output is directly streamed to the server without using memory on the PHP side.