Проектная лаборатория
Собственный HTTP-сервер
Этап 09 · Сжатие HTTP
Заголовки сжатия
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
Добро пожаловать в расширение «Сжатие HTTP»! В нём вы добавите в HTTP-сервер поддержку сжатия.
На этом этапе вы добавите поддержку заголовков Accept-Encoding и Content-Encoding.
Accept-Encoding и Content-Encoding
HTTP-клиент использует заголовок Accept-Encoding, чтобы указать поддерживаемые методы сжатия. В следующем примере клиент сообщает о поддержке gzip:
> GET /echo/foo HTTP/1.1
> Host: localhost:4221
> User-Agent: curl/7.81.0
> Accept: */*
> Accept-Encoding: gzip // Client specifies it supports the gzip compression scheme.Сервер выбирает один из методов сжатия, перечисленных в Accept-Encoding, и сжимает им тело ответа.
Затем сервер отправляет ответ со сжатым телом и заголовком Content-Encoding, а Content-Encoding указывает использованный метод сжатия.
В следующем примере тело ответа сжато с помощью gzip:
< HTTP/1.1 200 OK
< Content-Encoding: gzip // Server specifies that the response body is compressed with gzip.
< Content-Type: text/plain // Original media type of the body.
< Content-Length: 23 // Size of the compressed body.
< ... // Compressed body.Если сервер не поддерживает ни один из методов сжатия, указанных клиентом, он не сжимает тело ответа. Вместо этого он отправляет обычный ответ без заголовка Content-Encoding.
В этом расширении считайте, что сервер поддерживает только метод сжатия gzip.
На этом этапе сжимать тело не требуется. Вы реализуете сжатие на одном из следующих этапов.
Тесты
Тестирующая система запустит вашу программу следующим образом:
$ ./your_program.shЗатем она отправит два запроса GET к эндпоинту /echo/{str} вашего сервера.
Первый запрос
Сначала тестирующая система отправит запрос с заголовком Accept-Encoding: gzip.
$ curl -v -H "Accept-Encoding: gzip" http://localhost:4221/echo/abcОтвет сервера должен содержать заголовок Content-Encoding: gzip.
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Encoding: gzip
... // Body omitted.Второй запрос
Затем тестирующая система отправит запрос с заголовком Accept-Encoding: invalid-encoding.
$ curl -v -H "Accept-Encoding: invalid-encoding" http://localhost:4221/echo/abcОтвет сервера не должен содержать заголовок Content-Encoding:
HTTP/1.1 200 OK
Content-Type: text/plain
... // Body omitted.Примечания
- Поддержку нескольких методов сжатия в заголовке
Accept-Encodingвы добавите на следующем этапе. - Существует ещё один способ сжатия HTTP, использующий заголовки
TEиTransfer-Encoding. В этом расширении мы его не рассматриваем.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init http-server ./my-http-server --language go2. Откройте папку в IDE
cd ./my-http-serverРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage df4Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.