Я пытаюсь получить AS2 MDN, используя PHP lib AS2Secure. Сообщение приходит и декодируется очень хорошо, но когда ответ выходит, он удаляет основное значение «multipart / подписано» из Content-Type
,
Например, что-то вроде этого должно быть в главном заголовке для обозначения составного сообщения:
Content-Type: multipart/signed; boundary="----=_Part_8f23d0b4-8a42-4946-9928-4d12d9f7fc66.63"; protocol="application/pkcs7-signature"; micalg=SHA1
Однако, когда ответ на составное сообщение исчезает, я вижу это только в основных заголовках:
Content-Type: text/html; charset=UTF-8
Это вызывает ошибку на удаленном сервере, который ожидает, что сообщение определит свой тип контента как multipart.
Я отследил разделение составного типа контента до этого кода в AS2MDN.php
:
// TODO : replace with futur AS2MimePart to separate content from header
if (strpos($content, "\n\n") !== false) $content = substr($content, strpos($content, "\n\n") + 2);
Если я удалю этот код, пропавший Content-Type: multipart/signed
линия появляется в теле, но Content-Type: text/html
все еще показывает в заголовках.
Есть идеи?
Это было вызвано тем, что среда PHP Laravel (которая обрабатывает маршрутизацию приложения) перезаписывала заголовки во время вывода.
Изменение этого кода в handle()
метод в AS2server.php
:
ob_end_clean();
// send headers
foreach ($mdn->getHeaders() as $key => $value) {
$header = str_replace(["\r", "\n", "\r\n"], '', $key . ': ' . $value);
header($header);
}
// output MDN
echo $mdn->getContent();
…в этот дружественный код Laravel:
$headers = [];
foreach ($mdn->getHeaders() as $key => $value) {
$headers[str_replace(["\r", "\n", "\r\n"], '', $key)] = str_replace(["\r", "\n", "\r\n"], '', $value);
}
return \Response::make($mdn->getContent(), 200, $headers); // Use native Laravel response.
…решил проблему!
Других решений пока нет …