veryoriginalnickname
@veryoriginalnickname

Как проверить, был ли до этого отправлен ответ и куда эту проверку добавить?

Имеется роутер (код тут). В роутер можно добавлять глобальные middleware, для всех путей, и отдельные.
Проблема такая: допустим если пользователь добавит 2 глобальных middleware, и в первом middleware отправит ответ
writer.WriteHeader(403)
writer.Write([]byte("что-то"))

то во втором middleware, или уже в контроллере, при повторной отправке ответа будет
http: superfluous response.WriteHeader call
Как сделать так, чтоб каждая middleware проверяла, был ли до этого отправлен ответ? Если ответ был до этого отправлен, то произойдет return, и обработка запроса закончится.
НО тут есть проблема. Даже если узнать, был ли до этого отправлен ответ, то возникает вопрос: где эта проверка должна быть? На ум приходит сделать какой-нибудь хук, который будет вызываться каждый раз, когда происходит вызов следующего middleware, но это не вариант, ибо при инициализации роутера вызывается штука, которая делает что-то типа одного большого middleware
func middlewareChainer(middlewares []TheMiddleware, next http.Handler) http.Handler {
	for i := len(middlewares) - 1; i >= 0; i-- {
		next = middlewares[i](next)
	}
	return next
}

убирать эту штуку не очень хочется, потому что если её убрать, то придется при каждом запросе перебирать слайс с middleware что вообще не круто.

Итого:
1. Как узнать, был ли до этого отправлен ответ?
2. Где можно запилить эту проверку?
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
Если Middleware записал заголовки и ответ, он должен вызвать return, а не next
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы