Обработка данных формы -заголовки отправляются разные, это нормально?


Sly32
122

Закопался тут в серверлесс технологии и столкнулся с неизвестным мне фактом. Так как я ни разу не системщик и да и с фронтендом имею мало дел, может кто подскажет, нормально ли это и можно ли как-то настроить.

Ситуация: Фронт написан на Реакте, данные формы отправляются на api gateway амазоновский а сам обработчик лежит в лямбде. Потестил код через Постман — все отлично, отправляю данные из формы — поломалось. Искал причину и наткнулся буквально случайно, что в хедерах заголовки в постмане идут с большой буквы а в браузере(Хром) с маленькой, соответственно нужный заголовок не находится и падает ошибка. Пришлось еще писать проверку на это, но как-то совсем костыльно. Это вообще нормальная ситуация?

Примеры заголовков, могу быть такие:

'content-type': 'multipart/form-data;...'
'Content-Type': 'multipart/form-data;...'

Может, другие браузеры еще какие заголовки шлют?


livetv

Sly32 :
Content-Type

В php заголовки клиента содержаться в массиве $_SERVER c ключами вида

CONTENT_TYPE

То есть ключи приводятся к верхнему регистру и разделителем стает нижнее подчеркивание

Я хз, это web сервер проводит такие манипуляции или сам php


Sly32

livetv #:

В php заголовки клиента содержаться в массиве $_SERVER c ключами вида

То есть ключи приводятся к верхнему регистру и разделителем стает нижнее подчеркивание

Я хз, это web сервер проводит такие манипуляции или сам php

Кстати навел на мысль хорошую, спасибо. Тут как раз у пхп есть преимущество как у языка, исключительно заточеного под веб, в пайтоне все это пришлось делать руками. Тут дело не в вебсервере а в том как данные формы отсылает браузер.


drDaemon

Sly32 #:
Тут дело не в вебсервере а в том как данные формы отсылает браузер.

браузер всегда правильно отсылает стандартные заголовки.
вы как заголовки проверяете? (Django, Flask, что то еще используете)

Если джанго —

#  You can access headers case-insensitively
'Content-Type' in request.headers
# True
'content-type' in request.headers
# True

если фласк — (если не ошибаюсь — давно не использовал) также  возможно case insens

livetv #:

В php заголовки клиента содержаться в массиве $_SERVER c ключами вида

То есть ключи приводятся к верхнему регистру и разделителем стает нижнее подчеркивание

Я хз, это web сервер проводит такие манипуляции или сам php

Это ПХП делает. Вебсервер опирается на стандарты.


Sly32

drDaemon #:
вы как заголовки проверяете? (Django, Flask, что то еще используете)

Я сейчас не использую фреймворки, на чистом пайтоне все. Потому что все делается под авсовскую лямбду. Сначала для тестов поднимал фласковский веб-сервер, потом набросал свой. НО тут дело не веб-сервере, он отрабатывает как надо. Это именно бразуер по разному шлет заголовки. Например Постман их отправляет в ловеркэйс, хром — аппер. 


Solmyr

По стандартам http заголовки регистронезависимы. Т.е. да, это нормальная ситуация.


timo-71

Sly32 #:
на чистом пайтоне все
(pyenv) [www@localhost ~]$ python
Python 3.9.0 (default, Nov 14 2020, 12:28:09)
[GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from multidict import CIMultiDict
>>> oo = CIMultiDict( {
...                      'conTent-tYPe':1,
...                      'Cache-Control':2
...                    } )
>>> oo['Content-TYPE']
1

Как вариант


Sly32

timo-71 #:
Как вариант

Спасибо, не знал что так можно, в принципе, решает мою проблему! Единственное — нужно импортить ее, соответственно создавать слой для лямбды, так хотел обойтись без этого. Но оно того стоит!


timo-71

Sly32 #:
не знал что так можно

Тоже не знал, подсмотрел у aiohttp

Server Reference — aiohttp 3.7.3 documentation

  • docs.aiohttp.org
The Request object contains all the information about an incoming HTTP request. is used for (which have no applications, routers, signals and middlewares). has an and attributes. class ¶ ¶ HTTP version of request, Read-only property. Returns instance. ¶ HTTP method , read-only property. The value is upper-cased like , , etc. ¶ A instance with…


Sly32

timo-71 #:
Тоже не знал, подсмотрел у aiohttp

Мне aiohttp очень зашел, но работал в нем в основном с бэкенд частью и больше гет-запросами. После него на джангу как-то неохота смотреть.

А сейчас вообще ушел в серверлесс — веселая штука, но настройка — то еще развлечение)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *