Как отправить пустой заголовок подтверждения с помощью Curl - PHP - PullRequest
1 голос
/ 21 мая 2019

Я видел пару связанных проблем, но, к сожалению, ни одно из рекомендуемых решений не решило мою проблему.

Я пытаюсь отправить пустой заголовок Accept, используя PHP curl:

Версия 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, учитывая, что ни одно из предложений не работает должным образом.

1 Ответ

0 голосов
/ 22 мая 2019

Пожалуйста, смотрите описание проблемы в github.com/docker-library/php/issues/832

Tldr;Debian использует древний 2.5-летний пакет curl, в то время как другие платформы используют более новые версии.Должна быть ошибка, которая является причиной этого.

Если вы используете Debian и хотите отправить пустой заголовок accept с помощью curl, вам придется обновить версию до 7.64.0 из (test) репо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...