diff options
| author | Adnan Maolood <[email protected]> | 2021-02-23 20:40:22 -0500 |
|---|---|---|
| committer | Adnan Maolood <[email protected]> | 2021-02-23 20:41:16 -0500 |
| commit | a65c3c3d4f88c088eda47802bd5a1db9c4b39190 (patch) | |
| tree | 92ef503ec279443b316e9b3096a7f77ef5340c78 /response.go | |
| parent | handler: Mention when the context is canceled (diff) | |
| download | go-gemini-a65c3c3d4f88c088eda47802bd5a1db9c4b39190.tar.xz go-gemini-a65c3c3d4f88c088eda47802bd5a1db9c4b39190.zip | |
Make ResponseWriter a struct
Make ResponseWriter a struct again so that it can be extended in a
backwards-compatible way.
Diffstat (limited to 'response.go')
| -rw-r--r-- | response.go | 82 |
1 files changed, 33 insertions, 49 deletions
diff --git a/response.go b/response.go index d169e17..8c7febc 100644 --- a/response.go +++ b/response.go @@ -157,44 +157,7 @@ func (r *Response) TLS() *tls.ConnectionState { // // A ResponseWriter may not be used after the Handler.ServeGemini method // has returned. -type ResponseWriter interface { - // SetMediaType sets the media type that will be sent by Write for a - // successful response. If no media type is set, a default of - // "text/gemini; charset=utf-8" will be used. - // - // Setting the media type after a call to Write or WriteHeader has - // no effect. - SetMediaType(string) - - // Write writes the data to the connection as part of a Gemini response. - // - // If WriteHeader has not yet been called, Write calls WriteHeader with - // StatusSuccess and the media type set in SetMediaType before writing the data. - // If no media type was set, Write uses a default media type of - // "text/gemini; charset=utf-8". - Write([]byte) (int, error) - - // WriteHeader sends a Gemini response header with the provided - // status code and meta. - // - // If WriteHeader is not called explicitly, the first call to Write - // will trigger an implicit call to WriteHeader with a successful - // status code and the media type set in SetMediaType. - // - // The provided code must be a valid Gemini status code. - // The provided meta must not be longer than 1024 bytes. - // Only one header may be written. - WriteHeader(status Status, meta string) - - // Flush sends any buffered data to the client. - Flush() error - - // Close closes the connection. - // Any blocked Read or Write operations will be unblocked and return errors. - Close() error -} - -type responseWriter struct { +type ResponseWriter struct { b *bufio.Writer closer io.Closer mediatype string @@ -203,22 +166,30 @@ type responseWriter struct { } // NewResponseWriter returns a ResponseWriter that uses the provided io.WriteCloser. -func NewResponseWriter(wc io.WriteCloser) ResponseWriter { - return newResponseWriter(wc) -} - -func newResponseWriter(wc io.WriteCloser) *responseWriter { - return &responseWriter{ +func NewResponseWriter(wc io.WriteCloser) *ResponseWriter { + return &ResponseWriter{ b: bufio.NewWriter(wc), closer: wc, } } -func (w *responseWriter) SetMediaType(mediatype string) { +// SetMediaType sets the media type that will be sent by Write for a +// successful response. If no media type is set, a default of +// "text/gemini; charset=utf-8" will be used. +// +// Setting the media type after a call to Write or WriteHeader has +// no effect. +func (w *ResponseWriter) SetMediaType(mediatype string) { w.mediatype = mediatype } -func (w *responseWriter) Write(b []byte) (int, error) { +// Write writes the data to the connection as part of a Gemini response. +// +// If WriteHeader has not yet been called, Write calls WriteHeader with +// StatusSuccess and the media type set in SetMediaType before writing the data. +// If no media type was set, Write uses a default media type of +// "text/gemini; charset=utf-8". +func (w *ResponseWriter) Write(b []byte) (int, error) { if !w.wroteHeader { meta := w.mediatype if meta == "" { @@ -233,7 +204,17 @@ func (w *responseWriter) Write(b []byte) (int, error) { return w.b.Write(b) } -func (w *responseWriter) WriteHeader(status Status, meta string) { +// WriteHeader sends a Gemini response header with the provided +// status code and meta. +// +// If WriteHeader is not called explicitly, the first call to Write +// will trigger an implicit call to WriteHeader with a successful +// status code and the media type set in SetMediaType. +// +// The provided code must be a valid Gemini status code. +// The provided meta must not be longer than 1024 bytes. +// Only one header may be written. +func (w *ResponseWriter) WriteHeader(status Status, meta string) { if w.wroteHeader { return } @@ -249,7 +230,8 @@ func (w *responseWriter) WriteHeader(status Status, meta string) { w.wroteHeader = true } -func (w *responseWriter) Flush() error { +// Flush sends any buffered data to the client. +func (w *ResponseWriter) Flush() error { if !w.wroteHeader { w.WriteHeader(StatusTemporaryFailure, "Temporary failure") } @@ -257,6 +239,8 @@ func (w *responseWriter) Flush() error { return w.b.Flush() } -func (w *responseWriter) Close() error { +// Close closes the connection. +// Any blocked Write operations will be unblocked and return errors. +func (w *ResponseWriter) Close() error { return w.closer.Close() } |