如何使用Curl发送空白的接受标头-PHP

独眼巨space

我已经看到了几个相关的问题,但是不幸的是,没有推荐的解决方案能够解决我的问题。

我正在尝试使用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扩展版本中是否已经更改了这种机制,因为没有任何建议可以正常工作。

独眼巨space

请在github.com/docker-library/php/issues/832中查看问题的描述

Tldr; debian使用古老的2.5y旧curl软件包,而其他平台则使用较新的版本。必须有一个导致此错误。

如果您使用的是debian,并且要使用curl发送空白的接受标头,则必须从(测试)存储库中将版本更新为7.64.0。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章