response_writer.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package gin
  2. import (
  3. "bufio"
  4. "errors"
  5. "log"
  6. "net"
  7. "net/http"
  8. )
  9. type (
  10. ResponseWriter interface {
  11. http.ResponseWriter
  12. Status() int
  13. Written() bool
  14. WriteHeaderNow()
  15. Hijack() (net.Conn, *bufio.ReadWriter, error)
  16. }
  17. responseWriter struct {
  18. http.ResponseWriter
  19. status int
  20. written bool
  21. }
  22. )
  23. func (w *responseWriter) reset(writer http.ResponseWriter) {
  24. w.ResponseWriter = writer
  25. w.status = 200
  26. w.written = false
  27. }
  28. func (w *responseWriter) WriteHeader(code int) {
  29. if code > 0 {
  30. w.status = code
  31. if w.written {
  32. log.Println("[GIN] WARNING. Headers were already written!")
  33. }
  34. }
  35. }
  36. func (w *responseWriter) WriteHeaderNow() {
  37. if !w.written {
  38. w.written = true
  39. w.ResponseWriter.WriteHeader(w.status)
  40. }
  41. }
  42. func (w *responseWriter) Write(data []byte) (n int, err error) {
  43. w.WriteHeaderNow()
  44. return w.ResponseWriter.Write(data)
  45. }
  46. func (w *responseWriter) Status() int {
  47. return w.status
  48. }
  49. func (w *responseWriter) Written() bool {
  50. return w.written
  51. }
  52. // allow connection hijacking
  53. func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
  54. hijacker, ok := w.ResponseWriter.(http.Hijacker)
  55. if !ok {
  56. return nil, nil, errors.New("the ResponseWriter doesn't support the Hijacker interface")
  57. }
  58. return hijacker.Hijack()
  59. }