| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
- // Use of this source code is governed by a MIT style
- // license that can be found in the LICENSE file.
- package gin
- import (
- "bufio"
- "errors"
- "log"
- "net"
- "net/http"
- )
- type (
- ResponseWriter interface {
- http.ResponseWriter
- http.Hijacker
- http.Flusher
- http.CloseNotifier
- Status() int
- Written() bool
- WriteHeaderNow()
- }
- responseWriter struct {
- http.ResponseWriter
- status int
- written bool
- }
- )
- func (w *responseWriter) reset(writer http.ResponseWriter) {
- w.ResponseWriter = writer
- w.status = 200
- w.written = false
- }
- func (w *responseWriter) WriteHeader(code int) {
- if code > 0 {
- w.status = code
- if w.written {
- log.Println("[GIN] WARNING. Headers were already written!")
- }
- }
- }
- func (w *responseWriter) WriteHeaderNow() {
- if !w.written {
- w.written = true
- w.ResponseWriter.WriteHeader(w.status)
- }
- }
- func (w *responseWriter) Write(data []byte) (n int, err error) {
- w.WriteHeaderNow()
- return w.ResponseWriter.Write(data)
- }
- func (w *responseWriter) Status() int {
- return w.status
- }
- func (w *responseWriter) Written() bool {
- return w.written
- }
- // Implements the http.Hijacker interface
- func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
- hijacker, ok := w.ResponseWriter.(http.Hijacker)
- if !ok {
- return nil, nil, errors.New("the ResponseWriter doesn't support the Hijacker interface")
- }
- return hijacker.Hijack()
- }
- // Implements the http.CloseNotify interface
- func (w *responseWriter) CloseNotify() <-chan bool {
- return w.ResponseWriter.(http.CloseNotifier).CloseNotify()
- }
- // Implements the http.Flush interface
- func (w *responseWriter) Flush() {
- flusher, ok := w.ResponseWriter.(http.Flusher)
- if ok {
- flusher.Flush()
- }
- }
|