withcoderesponsewriter.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package response
  2. import (
  3. "bufio"
  4. "errors"
  5. "net"
  6. "net/http"
  7. )
  8. // A WithCodeResponseWriter is a helper to delay sealing a http.ResponseWriter on writing code.
  9. type WithCodeResponseWriter struct {
  10. Writer http.ResponseWriter
  11. Code int
  12. }
  13. // Flush flushes the response writer.
  14. func (w *WithCodeResponseWriter) Flush() {
  15. if flusher, ok := w.Writer.(http.Flusher); ok {
  16. flusher.Flush()
  17. }
  18. }
  19. // Header returns the http header.
  20. func (w *WithCodeResponseWriter) Header() http.Header {
  21. return w.Writer.Header()
  22. }
  23. // Hijack implements the http.Hijacker interface.
  24. // This expands the Response to fulfill http.Hijacker if the underlying http.ResponseWriter supports it.
  25. func (w *WithCodeResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
  26. if hijacked, ok := w.Writer.(http.Hijacker); ok {
  27. return hijacked.Hijack()
  28. }
  29. return nil, nil, errors.New("server doesn't support hijacking")
  30. }
  31. // Write writes bytes into w.
  32. func (w *WithCodeResponseWriter) Write(bytes []byte) (int, error) {
  33. return w.Writer.Write(bytes)
  34. }
  35. // WriteHeader writes code into w, and not sealing the writer.
  36. func (w *WithCodeResponseWriter) WriteHeader(code int) {
  37. w.Writer.WriteHeader(code)
  38. w.Code = code
  39. }