Skip to content

Latest commit

 

History

History
35 lines (24 loc) · 1.53 KB

content-length.rst

File metadata and controls

35 lines (24 loc) · 1.53 KB

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

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.