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.