我已经看到了几个相关的问题,但是不幸的是,没有推荐的解决方案能够解决我的问题。
我正在尝试使用PHP curl发送空白的Accept标头:
PHP版本:7.3 Disto:Debian
/**
* @param string $method
* @param string $url
* @param string $body
* @param array $headers
*
* @return Response
*/
public function execute(string $method, string $url, string $body = '', array $headers = []): Response
{
$curlHeaders = [];
$isAcceptHeaderPresent = false;
$isExpectHeaderPresent = false;
$curl = \curl_init();
$response = new Response();
foreach ($headers as $name => $value) {
$curlHeaders[] = $value === '' ? "{$name};" : "{$name}: $value";
$name = \strtolower($name);
if ($name === 'accept') {
$isAcceptHeaderPresent = true;
}
if ($name === 'expect') {
$isAcceptHeaderPresent = true;
}
}
if ($isAcceptHeaderPresent === false) {
$curlHeaders[] = 'Accept: ';
}
if ($isExpectHeaderPresent === false) {
$curlHeaders[] = 'Expect: ';
}
$options = [
CURLOPT_URL => \str_replace(' ', '%20', $url),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_AUTOREFERER => true,
CURLOPT_CONNECTTIMEOUT => 120,
CURLOPT_TIMEOUT => 120,
CURLOPT_MAXREDIRS => 10,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HEADERFUNCTION => [$response, 'headerWrite'],
CURLOPT_WRITEFUNCTION => [$response, 'bodyWrite'],
CURLOPT_FILE => $response->getBodyAsResouce(),
CURLOPT_HTTPHEADER => $curlHeaders,
];
switch ($method) {
case 'GET':
case 'POST':
case 'PATCH':
case 'PUT':
case 'HEAD':
case 'DELETE':
case 'CONNECT':
case 'OPTIONS':
case 'TRACE':
$options[CURLOPT_CUSTOMREQUEST] = $method;
break;
default:
throw new \Exception('Unsupported HTTP method received: ' . $method);
}
\curl_setopt_array($curl, $options);
\curl_exec($curl);
$response->setStatusCode(\curl_getinfo($curl)['http_code']);
\curl_close($curl);
return $response;
}
如果提供了Accept:
,那么将不会再发送Accept标头。
Accept;
是这样,空白值也将与*/*
值一起发送:"accept":"*/*,
是否可以仅发送Accept:
标头?
我不知道这种机制在最新的PHP和curl扩展版本中是否已更改,因为没有任何建议可以按预期工作。
答案 0 :(得分:0)
请参阅github.com/docker-library/php/issues/832中的问题描述
Tldr; debian使用古老的2.5y旧curl软件包,而其他平台则使用较新的版本。一定是导致此错误的错误。
如果使用的是debian,并且要使用curl发送空白的接受标头,则必须从(测试)存储库中将版本更新为7.64.0。