Как рассчитать Content-Length для заголовка запроса POST на PHP CURL?

Для интеграции с сервисом Склад-Облако OptiCore нужно выполнить POST запрос ClientOrder_CreateUpdate в BODY которого содержится XML. Обязательным заголовком HTTP для этого запроса является Content-Length, если он не указано то сервер просто рвет соединение по таймауту.

Подскажите как можно рассчитать это значение для Content-Length на PHP?

Вот тело запроса XML

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ClientOrder_CreateUpdate xmlns="http://cowms.ru/outbound"><User>Onwer54797</User><Pass>99dc684baa6af26767e849335db57488</Pass><ClientOrderCode>40</ClientOrderCode><OrderDate>2020-06-16</OrderDate><ExpectedDeliveryDate>2020-06-16</ExpectedDeliveryDate><ExpectedShipmentDate>2020-06-16</ExpectedShipmentDate><OutcomeWarehouse_id>48</OutcomeWarehouse_id><Owner_id>54797</Owner_id><Client_id>0</Client_id><Contractor_id>0</Contractor_id><Agent_id>0</Agent_id><DeliveryType_id>13</DeliveryType_id><DeliveryType_Parameters><DeliveryType_Parameters><ParameterName>PVZCode</ParameterName><ParameterValue>MSK2</ParameterValue></DeliveryType_Parameters><DeliveryType_Parameters><ParameterName>SUMTOPAY</ParameterName><ParameterValue>500.00</ParameterValue></DeliveryType_Parameters></DeliveryType_Parameters><DeliveryMode_id>1</DeliveryMode_id><ClientOrder_Positions><ClientOrder_Positions><ClientOrder_PositionCode>62</ClientOrder_PositionCode><Sku_id></Sku_id><Unit_id>784</Unit_id><StockType_id>0</StockType_id><Price>1199.00</Price><VAT>0</VAT><Qty>1</Qty><IncomeRequest_PositionCode></IncomeRequest_PositionCode><LabelText></LabelText></ClientOrder_Positions><ClientOrder_Positions><ClientOrder_PositionCode>63</ClientOrder_PositionCode><Sku_id></Sku_id><Unit_id>784</Unit_id><StockType_id>0</StockType_id><Price>779.00</Price><VAT>0</VAT><Qty>1</Qty><IncomeRequest_PositionCode></IncomeRequest_PositionCode><LabelText></LabelText></ClientOrder_Positions><ClientOrder_Positions><ClientOrder_PositionCode>64</ClientOrder_PositionCode><Sku_id></Sku_id><Unit_id>784</Unit_id><StockType_id>0</StockType_id><Price>2999.00</Price><VAT>0</VAT><Qty>1</Qty><IncomeRequest_PositionCode></IncomeRequest_PositionCode><LabelText></LabelText></ClientOrder_Positions></ClientOrder_Positions></ClientOrder_CreateUpdate></soap:Body></soap:Envelope>

В POSTMAN запросы проходят за счет того что это значение рассчитывается им автоматически, но как это сделать на PHP??? https://yadi.sk/i/oaSYQxLof1pS3w


Ответы (3 шт):

Автор решения: toorr2p

из-за php_value mbstring.func_overload 2

→ Ссылка
Автор решения: toorr2p

Вот решение

$content_length = file_put_contents($_SERVER["DOCUMENT_ROOT"]."/upload/tmp/tmp.xml", $content);

подсказали тут https://dev.1c-bitrix.ru/support/forum/messages/forum6/topic133333/message658007/?result=vote4user#message658007

→ Ссылка
Автор решения: Total Pusher

Правильный и безопасный способ, в том числе при перегрузке функции mbstring.func_overload:

$content_length = mb_strlen($content, '8bit');

Ответ на enSO

→ Ссылка