timeout_response.go 897 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package router
  2. import (
  3. "net/http"
  4. "time"
  5. "github.com/imgproxy/imgproxy/v3/config"
  6. )
  7. type timeoutResponse struct {
  8. http.ResponseWriter
  9. controller *http.ResponseController
  10. }
  11. func newTimeoutResponse(rw http.ResponseWriter) http.ResponseWriter {
  12. return &timeoutResponse{
  13. ResponseWriter: rw,
  14. controller: http.NewResponseController(rw),
  15. }
  16. }
  17. func (rw *timeoutResponse) WriteHeader(statusCode int) {
  18. rw.withWriteDeadline(func() {
  19. rw.ResponseWriter.WriteHeader(statusCode)
  20. })
  21. }
  22. func (rw *timeoutResponse) Write(b []byte) (int, error) {
  23. var (
  24. n int
  25. err error
  26. )
  27. rw.withWriteDeadline(func() {
  28. n, err = rw.ResponseWriter.Write(b)
  29. })
  30. return n, err
  31. }
  32. func (rw *timeoutResponse) withWriteDeadline(f func()) {
  33. rw.controller.SetWriteDeadline(time.Now().Add(time.Duration(config.WriteResponseTimeout) * time.Second))
  34. defer rw.controller.SetWriteDeadline(time.Time{})
  35. f()
  36. }