Задать вопрос
@MarkLb

Почему Yii2 HttpClient не отправляет заголовки с именами в snake_case?

Yii2 HTTPClient почему-то не отправляет header с именем в формате snake_case. В документации и в поиске не нашёл ничего про это поведение.

Вот в запросе добавляются заголовки, в них — 2 в формате snake_case: public_key, snake_case
private function prepareRequest(string $link, array $data = []): Request
    {
        $headers = [

            'bond' => $this->publicKey,
            'snake_case' => $this->publicKey,

            'publickey' => $this->publicKey,
            'public_key' => $this->publicKey,

            self::HEADER_PUBLIC_KEY => $this->publicKey,
            self::HEADER_SIGNATURE => $this->createSignature($this->publicKey, $this->privateKey, $data),
        ];

        return $this
            ->client
            ->createRequest()
            ->addHeaders($headers)
            ->setUrl($this->apiEndPoint . $link);
    }


Но приходят только заголовки, которые не в snake_case:
641b458935bcb188832488.jpeg

При этом, в HeaderCollection попадает:

Распечатка

var_dump($request->getHeaders());
// Result: 
object(yii\web\HeaderCollection)#407 (2) {
  ["_headers":"yii\web\HeaderCollection":private]=>
  array(6) {
    ["bond"]=>
    array(1) {
      [0]=>
      string(64) "PZC8ga2HYU_a-c2kKMvgpWoD7QlOyopakIrGimXGvcHOOsGhSHm6PvRL7UiII3z_"
    }
    ["snake_case"]=>
    array(1) {
      [0]=>
      string(64) "PZC8ga2HYU_a-c2kKMvgpWoD7QlOyopakIrGimXGvcHOOsGhSHm6PvRL7UiII3z_"
    }
    ["publickey"]=>
    array(1) {
      [0]=>
      string(64) "PZC8ga2HYU_a-c2kKMvgpWoD7QlOyopakIrGimXGvcHOOsGhSHm6PvRL7UiII3z_"
    }
    ["public_key"]=>
    array(1) {
      [0]=>
      string(64) "PZC8ga2HYU_a-c2kKMvgpWoD7QlOyopakIrGimXGvcHOOsGhSHm6PvRL7UiII3z_"
    }
    ["public-key"]=>
    array(1) {
      [0]=>
      string(64) "PZC8ga2HYU_a-c2kKMvgpWoD7QlOyopakIrGimXGvcHOOsGhSHm6PvRL7UiII3z_"
    }
    ["signature"]=>
    array(1) {
      [0]=>
      string(64) "82c9e42a48ab418a5e9e6fbb573b0e72fd34092a47b869a9a3592dbdbbb5123c"
    }
  }
  ["_originalHeaderNames":"yii\web\HeaderCollection":private]=>
  array(6) {
    ["bond"]=>
    string(4) "bond"
    ["snake_case"]=>
    string(10) "snake_case"
    ["publickey"]=>
    string(9) "publickey"
    ["public_key"]=>
    string(10) "public_key"
    ["public-key"]=>
    string(10) "public-key"
    ["signature"]=>
    string(9) "signature"
  }
}

  • Вопрос задан
  • 148 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
@MarkLb Автор вопроса
Название параметра должно состоять минимум из одного печатного символа (ASCII-коды от 33 до 126). Регистр символов в названиях не имеет значения. Заголовки с неизвестными именами должны игнорироваться. После названия сразу должен следовать символ двоеточия.

Wiki

Символы ASCII с кодом от 33 до 126в этом списке нижнего подчеркивания нет. snake_case не поддерживается.

UPD: Всё же в данном списке — нижнее подчеркивание есть под №95:
uJ05noY.png
Но поделились ссылкой на документацию nginx, с разделом Missing (disappearing) HTTP Headers, который гласит: «NGINX will silently drop HTTP headers with underscores (which are perfectly valid according to the HTTP standard». И изменение snake_case мою проблему решило.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Должен отправлять, тк это не запрещено стандартом (https://www.ietf.org/rfc/rfc7230.html#appendix-B)

Символы ASCII с кодом от 33 до 126 — в этом списке нижнего подчеркивания нет. snake_case не поддерживается.

Поддерживается. В этом списке есть подчёркивание (код 95 - "_ символ подчеркивания")

Скорее всего заголовок пропадает где-то на подходе к серверу (мб веб-сервер фильтрует или тот фреймворк, который используется на сервере)

Рекомендую:
1. Включить полные логи на сервере, чтобы посмотреть, какой запрос приходит целиком
2. Посмотреть при помощи Charles или другого подобного перехватчика, какой запрос отправляется клиентом.

Сделав эти два пункта ты сможешь определить, где именно заголовок пропадает.
А ещё он вполне может вообще не пропадать, тк на скриншоте явно не полный список.
Ответ написан
@pantsarny
underscores_in_headers on;
Nginx
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы