PayPal IPN error: line folding of header fields is not supported
PayPal IPN error: line folding of header fields is not supported
运行 多年的 PayPal IPN 脚本突然停止工作。 PayPal 返回以下响应:
HTTP/1.1 400 Bad Request
Connection: close
Content-Length: 46
content-type: text/plain; charset=utf-8
line folding of header fields is not supported
总结 PayPal IPN 的工作原理:
- PayPal POST 到您系统上的端点
- 端点必须使用收到的 POST 数据回复 PayPal
- PayPal 回复 VERIFIED
就我而言,PayPal 无法验证响应,因为“不支持 header 字段的行折叠”。
Google 没有提供太多关于“行折叠 header 字段”的信息。我只能假设它与 header 格式有关。这是相关代码:
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
// post back to PayPal system to validate
// 7/22/2013 - Update to use HTTP 1.1 instead of HTTP 1.0
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Host: www.paypal.com\r\n ";
$header .= "Connection: close\r\n\r\n";
// Open a connection to PayPal.com
$fp = @fsockopen("ssl://{$target}", 443, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
}else{
@fputs ($fp, $header . $req);
while (!@feof($fp)) {
$res = @fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
$verified = true;
}else{
// Log failure
}
}
@fclose ($fp);
}
关于 header 的行折叠可能导致错误的任何想法?
Header 折叠解释在 https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4:
Historically, HTTP header field values could be extended over
multiple lines by preceding each extra line with at least one space
or horizontal tab (obs-fold).
我必须回显你生成的 headers 才能自己看到问题,很难发现:
$header .= "Host: www.paypal.com\r\n ";
换行符后的额外 space 表示 下一个 header 行将 start那 space - 这意味着,你 是 “折叠 headers”,而实际上并没有这样做。
删除多余的尾随 space,事情应该会正常进行。
运行 多年的 PayPal IPN 脚本突然停止工作。 PayPal 返回以下响应:
HTTP/1.1 400 Bad Request
Connection: close
Content-Length: 46
content-type: text/plain; charset=utf-8
line folding of header fields is not supported
总结 PayPal IPN 的工作原理:
- PayPal POST 到您系统上的端点
- 端点必须使用收到的 POST 数据回复 PayPal
- PayPal 回复 VERIFIED
就我而言,PayPal 无法验证响应,因为“不支持 header 字段的行折叠”。
Google 没有提供太多关于“行折叠 header 字段”的信息。我只能假设它与 header 格式有关。这是相关代码:
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
// post back to PayPal system to validate
// 7/22/2013 - Update to use HTTP 1.1 instead of HTTP 1.0
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Host: www.paypal.com\r\n ";
$header .= "Connection: close\r\n\r\n";
// Open a connection to PayPal.com
$fp = @fsockopen("ssl://{$target}", 443, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
}else{
@fputs ($fp, $header . $req);
while (!@feof($fp)) {
$res = @fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
$verified = true;
}else{
// Log failure
}
}
@fclose ($fp);
}
关于 header 的行折叠可能导致错误的任何想法?
Header 折叠解释在 https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4:
Historically, HTTP header field values could be extended over multiple lines by preceding each extra line with at least one space or horizontal tab (obs-fold).
我必须回显你生成的 headers 才能自己看到问题,很难发现:
$header .= "Host: www.paypal.com\r\n ";
换行符后的额外 space 表示 下一个 header 行将 start那 space - 这意味着,你 是 “折叠 headers”,而实际上并没有这样做。
删除多余的尾随 space,事情应该会正常进行。