Что такое протокол HTTP и как он работает
Что проверяют
Знаете ли вы протокол настолько, чтобы писать сервер и клиент без фреймворка. Стандартная библиотека Go даёт HTTP почти в сыром виде, поэтому разговор быстро уходит в детали: кто закрывает тело ответа, когда переиспользуется соединение, что происходит при отмене контекста.
Как отвечать
HTTP это протокол запроса и ответа поверх TCP, без состояния между запросами. Сообщение это стартовая строка, заголовки, пустая строка и тело. Методы различаются свойствами: GET и HEAD безопасны, PUT и DELETE идемпотентны, POST нет. Коды делятся на классы, и 4xx против 5xx это граница ответственности клиента и сервера.
Серверная часть: обработчик это интерфейс с методом ServeHTTP, маршрутизатор сопоставляет метод и путь. Заголовки пишутся до первой записи в тело, код ответа выставляется один раз. Отмена со стороны клиента видна через контекст запроса, и долгая работа обязана на неё реагировать. Остановка сервиса делается мягко, чтобы текущие запросы дожили.
Клиентская часть: клиент создаётся один раз и переиспользуется, внутри у него транспорт с пулом соединений. Тело ответа закрывают всегда и дочитывают до конца, иначе соединение не вернётся в пул. Отдельно назовите таймауты: у клиента по умолчанию их нет.
Поддержку HTTP/2 сервер включает сам поверх TLS, и это стоит упомянуть, чтобы показать, что версия протокола не абстракция.
Где спотыкаются
Ходят наружу клиентом по умолчанию, без таймаута и без контекста. Один зависший ответ держит горутину и соединение навсегда, а под нагрузкой это накапливается до исчерпания памяти.
Забывают закрыть тело ответа или закрывают, не дочитав. Соединения не переиспользуются, пул растёт, и в профиле это выглядит как утечка, хотя код ошибок не содержит.
Трогают запись ответа после возврата из обработчика или из другой горутины. Соединение к этому моменту может быть уже отдано другому запросу, и результат непредсказуем, включая перемешанные ответы.