mirror of https://github.com/caddyserver/caddy.git
caddyhttp: Impl `ResponseWriter.Unwrap()`, prep for Go 1.20's `ResponseController` (#5509)
* feat: add support for ResponseWriter.Unwrap() * cherry-pick Francis' code
This commit is contained in:
parent
2b04e09fa7
commit
1c9ea0113d
|
@ -66,3 +66,9 @@ func (d *delegator) WriteHeader(code int) {
|
|||
d.status = code
|
||||
d.ResponseWriter.WriteHeader(code)
|
||||
}
|
||||
|
||||
// Unwrap returns the underlying ResponseWriter, necessary for
|
||||
// http.ResponseController to work correctly.
|
||||
func (d *delegator) Unwrap() http.ResponseWriter {
|
||||
return d.ResponseWriter
|
||||
}
|
||||
|
|
|
@ -299,6 +299,11 @@ func (rw *responseWriter) Close() error {
|
|||
return err
|
||||
}
|
||||
|
||||
// Unwrap returns the underlying ResponseWriter.
|
||||
func (rw *responseWriter) Unwrap() http.ResponseWriter {
|
||||
return rw.HTTPInterfaces
|
||||
}
|
||||
|
||||
// init should be called before we write a response, if rw.buf has contents.
|
||||
func (rw *responseWriter) init() {
|
||||
if rw.Header().Get("Content-Encoding") == "" && isEncodeAllowed(rw.Header()) &&
|
||||
|
|
|
@ -636,6 +636,12 @@ func (wr statusOverrideResponseWriter) WriteHeader(int) {
|
|||
wr.ResponseWriter.WriteHeader(wr.code)
|
||||
}
|
||||
|
||||
// Unwrap returns the underlying ResponseWriter, necessary for
|
||||
// http.ResponseController to work correctly.
|
||||
func (wr statusOverrideResponseWriter) Unwrap() http.ResponseWriter {
|
||||
return wr.ResponseWriter
|
||||
}
|
||||
|
||||
// osFS is a simple fs.FS implementation that uses the local
|
||||
// file system. (We do not use os.DirFS because we do our own
|
||||
// rooting or path prefixing without being constrained to a single
|
||||
|
|
|
@ -72,6 +72,11 @@ func (rww *ResponseWriterWrapper) ReadFrom(r io.Reader) (n int64, err error) {
|
|||
return io.Copy(rww.ResponseWriter, r)
|
||||
}
|
||||
|
||||
// Unwrap returns the underlying ResponseWriter.
|
||||
func (rww *ResponseWriterWrapper) Unwrap() http.ResponseWriter {
|
||||
return rww.ResponseWriter
|
||||
}
|
||||
|
||||
// HTTPInterfaces mix all the interfaces that middleware ResponseWriters need to support.
|
||||
type HTTPInterfaces interface {
|
||||
http.ResponseWriter
|
||||
|
|
|
@ -95,6 +95,14 @@ func TestResponseWriterWrapperReadFrom(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestResponseWriterWrapperUnwrap(t *testing.T) {
|
||||
w := &ResponseWriterWrapper{&baseRespWriter{}}
|
||||
|
||||
if _, ok := w.Unwrap().(*baseRespWriter); !ok {
|
||||
t.Errorf("Unwrap() doesn't return the underlying ResponseWriter")
|
||||
}
|
||||
}
|
||||
|
||||
func TestResponseRecorderReadFrom(t *testing.T) {
|
||||
tests := map[string]struct {
|
||||
responseWriter responseWriterSpy
|
||||
|
|
Loading…
Reference in New Issue