headeronceresponsewriter.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package response
  2. import (
  3. "bufio"
  4. "errors"
  5. "net"
  6. "net/http"
  7. )
  8. // HeaderOnceResponseWriter is a http.ResponseWriter implementation
  9. // that only the first WriterHeader takes effect.
  10. type HeaderOnceResponseWriter struct {
  11. w http.ResponseWriter
  12. wroteHeader bool
  13. }
  14. // NewHeaderOnceResponseWriter returns a HeaderOnceResponseWriter.
  15. func NewHeaderOnceResponseWriter(w http.ResponseWriter) http.ResponseWriter {
  16. return &HeaderOnceResponseWriter{w: w}
  17. }
  18. // Flush flushes the response writer.
  19. func (w *HeaderOnceResponseWriter) Flush() {
  20. if flusher, ok := w.w.(http.Flusher); ok {
  21. flusher.Flush()
  22. }
  23. }
  24. // Header returns the http header.
  25. func (w *HeaderOnceResponseWriter) Header() http.Header {
  26. return w.w.Header()
  27. }
  28. // Hijack implements the http.Hijacker interface.
  29. // This expands the Response to fulfill http.Hijacker if the underlying http.ResponseWriter supports it.
  30. func (w *HeaderOnceResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
  31. if hijacked, ok := w.w.(http.Hijacker); ok {
  32. return hijacked.Hijack()
  33. }
  34. return nil, nil, errors.New("server doesn't support hijacking")
  35. }
  36. // Write writes bytes into w.
  37. func (w *HeaderOnceResponseWriter) Write(bytes []byte) (int, error) {
  38. return w.w.Write(bytes)
  39. }
  40. // WriteHeader writes code into w, and not sealing the writer.
  41. func (w *HeaderOnceResponseWriter) WriteHeader(code int) {
  42. if w.wroteHeader {
  43. return
  44. }
  45. w.w.WriteHeader(code)
  46. w.wroteHeader = true
  47. }