Sometimes the cURL error 'cURL 18 transfer closed with outstanding read data remaining' occurs while retrieving data from a URL using a cURL.
Here at Ibmi Media, as part of our Server Management Services, we regularly help our Customers to fix cURL related errors.
In this context, we shall look into the causes of this error and how to resolve it.
Nature of cURL error 'cURL 18 transfer closed with outstanding read data remaining' ?
As previously stated, sometimes, the file we transfer will be smaller or larger than expected. Such cases arise when the server initially reports an expected transfer size, and then delivers data that doesn’t match the previously sent size.
Basically, this error is related to content-length.
cURL error 18 can be described as below:
It means a Partial file i.e. only a part of the file was transferred.
Different causes and fixes for cURL error 'cURL 18 transfer closed with outstanding read data remaining' ?
Now let's see the different causes for this error. Also, we shall see how to fix it.
1. An incorrect Content-Length header was sent by the peer.
If an incorrect Content-Length header is been sent then the best option is to allow the cURL to set the length by itself. This will avoid the issues that might arise after setting the wrong size.
Moreover, we can fix this by suppressing the ‘Expect: 100-continue’ header that cURL usually sends;
curl_setopt($curl, CURLOPT_HTTPHEADER, array(‘Expect:’));
2. The connection gets timed-out as keep-alives were not sent to keep the connection going on.
To fix this issue, add the –keepalive-time.
This option will set a time a connection will need to remain idle before sending the keepalive probes and the time between individual keepalive probes. However, if we use –no-keepalive then this option has no effect.
In case, if we use this option several times then the last one will be used. If you don’t specify the value then it defaults to 60 seconds.
In PHP cURL, the –keepalive-time option is available from the PHP version 5.5. You can use it as follows:
curl_setopt($connection, CURLOPT_TCP_KEEPALIVE, 1);
curl_setopt($connection, CURLOPT_TCP_KEEPIDLE, 2);