Я пытаюсь реализовать клиент AS2 в PHP. Я использую PHP7 за http-сервером NGinx.
Если я могу получить доступ к заголовкам (версия AS2 и т. Д.), Я не могу получить доступ к полезной нагрузке HTTP с помощью file_get_contents (‘pĥp: // input’). Эта инструкция возвращает строку нулевой длины.
Любая идея, пожалуйста? Смотрите источники ниже.
Например, позвоните HTTP: //localhost/send.php файл = AS2PlainText.txt возвращает:
Send AS2PlainText.txt
-----------------------
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Fri, 17 Nov 2017 15:54:23 GMT
Content-Type: text/plain;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
14b
---HEADER---
HTTP_CONTENT_TYPE => Application/EDI-X12
HTTP_AS2_FROM => FromCompanyXYZ
HTTP_AS2_TO => ToCompanyABC
HTTP_AS2_VERSION => 1.0
HTTP_MESSAGE_ID => [email protected]
HTTP_USER_AGENT => AS2 Company Server
HTTP_CONNECTION => close
HTTP_HOST => localhost
---BODY---
string(0) ""---END---
0
Интересно, не будет ли это связано с удалением NGinx? Connection: close
из send.php возвращает тот же вывод, что и выше (исключено HTTP_CONNECTION
, конечно), плюс второй HTTP / 1.1 запрос:
[...]
HTTP_USER_AGENT => AS2 Company Server
HTTP_HOST => localhost
---BODY---
string(0) ""---END---
0
HTTP/1.1 400 Bad Request
Server: nginx/1.10.3 (Ubuntu)
Date: Fri, 17 Nov 2017 16:07:06 GMT
Content-Type: text/html
Content-Length: 182
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.10.3 (Ubuntu)</center>
</body>
</html>
send.php
<?php
header('Content-type: text/plain');
echo "Send {$_GET['file']}\r\n";
echo "-----------------------\r\n";
$fp = fsockopen('127.0.0.1', 80);
fwrite($fp, "POST /echo.php HTTP/1.1\r\n");
fwrite($fp, "Host: localhost\r\n");
fwrite($fp, "Connection: close\r\n");
fwrite($fp, file_get_contents($_GET['file']) . "\r\n");
fwrite($fp, "\r\n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
echo.php
<?php
header('Content-type: text/plain');
echo "---HEADER---\r\n";
foreach (array_filter(
$_SERVER,
function($k) {
return (substr($k,0,5) == 'HTTP_');
},
ARRAY_FILTER_USE_KEY
) as $key => $value) {
echo "$key => $value\n";
}
echo "---BODY---\r\n";
var_dump(file_get_contents('php://input'));
echo "---END---\r\n";
AS2PlainText.txt
User-Agent: AS2 Company Server
Message-ID: [email protected]
AS2-Version: 1.0
AS2-To: ToCompanyABC
AS2-From: FromCompanyXYZ
Content-Type: Application/EDI-X12
ISA*00* *00* *ZZ*SENDERISA *14*0073268795005
*960807*1548*U*00401*000000020*0*T*>~
GS*PO*SENDERGS*007326879*19960807*1548*1*X*004010~
ST*850*000000001~
BEG*00*SA*A99999-01**19971207~
REF*VR*54321~
ITD*01*3*1**15**16~
DTM*002*19971219~
N1*BT*BUYSNACKS INC.*9*1223334444~
N3*P.O. BOX 0000~
N4*TEMPLE*TX*76503~
N1*ST*BUYSNACKS PORT*9*1223334445~
N3*1000 N. SAMPLE HIGHWAY~
N4*ATHENS*GA*30603~
N1*VN*FOODSELLER*9*12345QQQQ~
N3*P.O. BOX 222222~
N4*DALLAS*TX*723224444~
PO1**16*CA*12.34**CB*000111111*UA*002840022222~
PID*F****CRUNCHY CHIPS LSS~
PO4*48*7.89*LB~
PO1**13*CA*12.34**CB*000555555*UA*002840033333~
PID*F****NACHO CHIPS LSS~
PO4*48*8.9*LB~
CTT*7~
SE*22*000000001~
GE*1*1~
IEA*1*000000020~
Нашел проблему: отсутствует Content-Length
в заголовках HTTP-запроса …
Других решений пока нет …