$headers = explode(PHP_EOL, trim($headers));
ошибка была здесь.
надо не PHP_EOL, а "\r\n";
и еще здесь curl_setopt($curl, CURLOPT_HTTPHEADER, getallheaders());
getallheaders() возвращает ассоциативный массив. а необходимо массив вида
['Content-type: text/plain', 'Content-length: 100']