Контест Middle net/http и middleware обновлено

Разбор сырого HTTP/1.1 запроса на Go

Условие

На вход подаётся один HTTP/1.1 запрос в сыром виде (строки разделены \r\n): стартовая строка, заголовки, пустая строка и тело длиной Content-Length байт (если заголовка нет, тела нет).

Выведите:

  1. МЕТОД путь (путь без query-строки, в пути только латиница, цифры и /);
  2. host: <значение Host>;
  3. все заголовки, кроме Host, в каноническом виде имени (content-type превращается в Content-Type: первая буква и буквы после - заглавные, остальные строчные), отсортированные по имени, значения одного заголовка в порядке появления, каждое отдельной строкой Имя: значение (пробелы по краям значения обрезаются);
  4. 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 для тела.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме