response_writer.go 995 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package gin
  2. import (
  3. "log"
  4. "net/http"
  5. )
  6. type (
  7. ResponseWriter interface {
  8. http.ResponseWriter
  9. Status() int
  10. Written() bool
  11. WriteHeaderNow()
  12. }
  13. responseWriter struct {
  14. http.ResponseWriter
  15. status int
  16. written bool
  17. }
  18. )
  19. func (w *responseWriter) reset(writer http.ResponseWriter) {
  20. w.ResponseWriter = writer
  21. w.status = 0
  22. w.written = false
  23. }
  24. func (w *responseWriter) WriteHeader(code int) {
  25. if code != 0 {
  26. w.status = code
  27. if w.written {
  28. log.Println("[GIN] WARNING. Headers were already written!")
  29. }
  30. }
  31. }
  32. func (w *responseWriter) WriteHeaderNow() {
  33. if !w.written {
  34. w.written = true
  35. w.ResponseWriter.WriteHeader(w.status)
  36. }
  37. }
  38. func (w *responseWriter) Write(data []byte) (n int, err error) {
  39. if !w.written {
  40. if w.status != 0 {
  41. w.ResponseWriter.WriteHeader(w.status)
  42. }
  43. w.written = true
  44. }
  45. return w.ResponseWriter.Write(data)
  46. }
  47. func (w *responseWriter) Status() int {
  48. return w.status
  49. }
  50. func (w *responseWriter) Written() bool {
  51. return w.written
  52. }