Контест Middle net/http и middleware обновлено
Разбор сырого HTTP/1.1 запроса на Go
Условие
На вход подаётся один HTTP/1.1 запрос в сыром виде (строки разделены \r\n): стартовая строка, заголовки, пустая строка и тело длиной Content-Length байт (если заголовка нет, тела нет).
Выведите:
МЕТОД путь(путь без query-строки, в пути только латиница, цифры и/);host: <значение Host>;- все заголовки, кроме
Host, в каноническом виде имени (content-typeпревращается вContent-Type: первая буква и буквы после-заглавные, остальные строчные), отсортированные по имени, значения одного заголовка в порядке появления, каждое отдельной строкойИмя: значение(пробелы по краям значения обрезаются); body: N bytes, где N длина тела в байтах.
Проверка построчная.
Пример
POST /api/items?draft=1 HTTP/1.1
Host: shop.local
content-type: application/json
X-REQUEST-ID: r-1
Content-Length: 17
{"name":"чай"}
POST /api/items
host: shop.local
Content-Length: 17
Content-Type: application/json
X-Request-Id: r-1
body: 17 bytes
Как подойти
http.ReadRequest, r.Host отдельно от r.Header, сортировка ключей заголовков, io.ReadAll для тела.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Статистика access-логов: ошибки и p95 на Go
Следующий вопрос
Разбор query-строки URL с декодированием на Go
Термины по теме
Ещё по теме «net/http и middleware»
- Маршрутизатор с параметрами пути в стиле ServeMux
- Rate limiter на токен-бакете для middleware на Go
- Зачем закрывать resp.Body
- Таймаут http.DefaultClient
- Обработчики net/http и горутины
- http.HandlerFunc
- Надёжный HTTP-клиент в Go
- HTTP-сервис на стандартной библиотеке