dongpo4197 2019-05-21 13:12
浏览 91
已采纳

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

I've seen a couple of related issues, but unfortunately, none of the recommended solutions had solved my problem.

I'm trying to send in a blank Accept header using PHP curl:

PHP Version: 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;
    }

If Accept: is provided, then no Accept header will be sent in what so ever.

Whereas Accept; make it so, that the blank value will be sent in along with */* value as well: "accept":"*/*,

Is there a way to send in just the Accept: header as is?

I wonder if this mechanism has been changed in the last couple of PHP and curl extension releases, given that none of the suggestions are working as intended.

  • 写回答

1条回答 默认 最新

  • dqrmkdu25623 2019-05-22 10:19
    关注

    Please see description of the issue in github.com/docker-library/php/issues/832

    Tldr; debian uses ancient 2.5y old curl package while other platforms are using newer versions. There must be a bug that's causing this.

    If you are on debian, and if you want to send a blank accept header using curl, you'll have to update the version to 7.64.0 from the (testing) repo.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵