From a3c180439586c28740f0e23ab4e9fbd1704e7746 Mon Sep 17 00:00:00 2001 From: Adnan Maolood Date: Wed, 17 Feb 2021 11:44:11 -0500 Subject: [PATCH] Move ResponseWriter.Flush to Flusher interface --- examples/stream.go | 8 +++++++- response.go | 17 +++++++++++++---- server.go | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/examples/stream.go b/examples/stream.go index 0c302bd..5f3e2b5 100644 --- a/examples/stream.go +++ b/examples/stream.go @@ -39,6 +39,12 @@ func main() { // stream writes an infinite stream to w. func stream(w gemini.ResponseWriter, r *gemini.Request) { + flusher, ok := w.(gemini.Flusher) + if !ok { + w.Status(gemini.StatusTemporaryFailure) + return + } + ch := make(chan string) ctx, cancel := context.WithCancel(context.Background()) @@ -63,7 +69,7 @@ func stream(w gemini.ResponseWriter, r *gemini.Request) { break } fmt.Fprintln(w, s) - if err := w.Flush(); err != nil { + if err := flusher.Flush(); err != nil { cancel() return } diff --git a/response.go b/response.go index c608bb1..bb25f1b 100644 --- a/response.go +++ b/response.go @@ -156,11 +156,16 @@ type ResponseWriter interface { // Write writes the response header if it has not already been written. // It writes a successful status code if one is not set. Write([]byte) (int, error) +} - // Flush writes any buffered data to the underlying io.Writer. - // - // Flush writes the response header if it has not already been written. - // It writes a failure status code if one is not set. +// The Flusher interface is implemented by ResponseWriters that allow a +// Gemini handler to flush buffered data to the client. +// +// The default Gemini ResponseWriter implementation supports Flusher, +// but ResponseWriter wrappers may not. Handlers should always test +// for this ability at runtime. +type Flusher interface { + // Flush sends any buffered data to the client. Flush() error } @@ -174,6 +179,10 @@ type responseWriter struct { // NewResponseWriter returns a ResponseWriter that uses the provided io.Writer. func NewResponseWriter(w io.Writer) ResponseWriter { + return newResponseWriter(w) +} + +func newResponseWriter(w io.Writer) *responseWriter { return &responseWriter{ b: bufio.NewWriter(w), } diff --git a/server.go b/server.go index f461d4a..d5dacd9 100644 --- a/server.go +++ b/server.go @@ -376,7 +376,7 @@ func (srv *Server) respond(conn net.Conn) { conn.SetWriteDeadline(time.Now().Add(d)) } - w := NewResponseWriter(conn) + w := newResponseWriter(conn) req, err := ReadRequest(conn) if err != nil {