Browse Source

fancyWriters should also implement io.ReaderFrom

For sendfile(2) support. I should really DRY up the implementations here...
Carl Jackson 12 years ago
parent
commit
05e53fc481
3 changed files with 36 additions and 14 deletions
  1. +15
    -1
      graceful/middleware.go
  2. +0
    -13
      web/middleware/logger.go
  3. +21
    -0
      web/middleware/writer_proxy.go

+ 15
- 1
graceful/middleware.go View File

@ -2,6 +2,7 @@ package graceful
import ( import (
"bufio" "bufio"
"io"
"net" "net"
"net/http" "net/http"
) )
@ -36,10 +37,11 @@ func Middleware(h http.Handler) http.Handler {
_, cn := w.(http.CloseNotifier) _, cn := w.(http.CloseNotifier)
_, fl := w.(http.Flusher) _, fl := w.(http.Flusher)
_, hj := w.(http.Hijacker) _, hj := w.(http.Hijacker)
_, rf := w.(io.ReaderFrom)
bw := basicWriter{ResponseWriter: w} bw := basicWriter{ResponseWriter: w}
if cn && fl && hj {
if cn && fl && hj && rf {
h.ServeHTTP(&fancyWriter{bw}, r) h.ServeHTTP(&fancyWriter{bw}, r)
} else { } else {
h.ServeHTTP(&bw, r) h.ServeHTTP(&bw, r)
@ -104,3 +106,15 @@ func (f *fancyWriter) Hijack() (c net.Conn, b *bufio.ReadWriter, e error) {
return return
} }
func (f *fancyWriter) ReadFrom(r io.Reader) (int64, error) {
rf := f.basicWriter.ResponseWriter.(io.ReaderFrom)
if !f.basicWriter.headerWritten {
f.basicWriter.maybeClose()
}
return rf.ReadFrom(r)
}
var _ http.CloseNotifier = &fancyWriter{}
var _ http.Flusher = &fancyWriter{}
var _ http.Hijacker = &fancyWriter{}
var _ io.ReaderFrom = &fancyWriter{}

+ 0
- 13
web/middleware/logger.go View File

@ -78,16 +78,3 @@ func printEnd(reqId string, w writerProxy, dt time.Duration) {
log.Print(buf.String()) log.Print(buf.String())
} }
func wrapWriter(w http.ResponseWriter) writerProxy {
_, cn := w.(http.CloseNotifier)
_, fl := w.(http.Flusher)
_, hj := w.(http.Hijacker)
bw := basicWriter{ResponseWriter: w}
if cn && fl && hj {
return &fancyWriter{bw}
} else {
return &bw
}
}

+ 21
- 0
web/middleware/writer_proxy.go View File

@ -2,10 +2,25 @@ package middleware
import ( import (
"bufio" "bufio"
"io"
"net" "net"
"net/http" "net/http"
) )
func wrapWriter(w http.ResponseWriter) writerProxy {
_, cn := w.(http.CloseNotifier)
_, fl := w.(http.Flusher)
_, hj := w.(http.Hijacker)
_, rf := w.(io.ReaderFrom)
bw := basicWriter{ResponseWriter: w}
if cn && fl && hj && rf {
return &fancyWriter{bw}
} else {
return &bw
}
}
type writerProxy interface { type writerProxy interface {
http.ResponseWriter http.ResponseWriter
maybeWriteHeader() maybeWriteHeader()
@ -55,7 +70,13 @@ func (f *fancyWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
hj := f.basicWriter.ResponseWriter.(http.Hijacker) hj := f.basicWriter.ResponseWriter.(http.Hijacker)
return hj.Hijack() return hj.Hijack()
} }
func (f *fancyWriter) ReadFrom(r io.Reader) (int64, error) {
rf := f.basicWriter.ResponseWriter.(io.ReaderFrom)
f.basicWriter.maybeWriteHeader()
return rf.ReadFrom(r)
}
var _ http.CloseNotifier = &fancyWriter{} var _ http.CloseNotifier = &fancyWriter{}
var _ http.Flusher = &fancyWriter{} var _ http.Flusher = &fancyWriter{}
var _ http.Hijacker = &fancyWriter{} var _ http.Hijacker = &fancyWriter{}
var _ io.ReaderFrom = &fancyWriter{}

Loading…
Cancel
Save