summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--metrics.go6
-rw-r--r--modules/caddyhttp/encode/encode.go5
-rw-r--r--modules/caddyhttp/fileserver/staticfiles.go6
-rw-r--r--modules/caddyhttp/responsewriter.go5
-rw-r--r--modules/caddyhttp/responsewriter_test.go8
5 files changed, 30 insertions, 0 deletions
diff --git a/metrics.go b/metrics.go
index 325006f..eb6c74f 100644
--- a/metrics.go
+++ b/metrics.go
@@ -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
+}
diff --git a/modules/caddyhttp/encode/encode.go b/modules/caddyhttp/encode/encode.go
index 8a6fc10..78d440e 100644
--- a/modules/caddyhttp/encode/encode.go
+++ b/modules/caddyhttp/encode/encode.go
@@ -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()) &&
diff --git a/modules/caddyhttp/fileserver/staticfiles.go b/modules/caddyhttp/fileserver/staticfiles.go
index 0459b3a..2b5cc3d 100644
--- a/modules/caddyhttp/fileserver/staticfiles.go
+++ b/modules/caddyhttp/fileserver/staticfiles.go
@@ -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
diff --git a/modules/caddyhttp/responsewriter.go b/modules/caddyhttp/responsewriter.go
index 1b28cf0..398bd15 100644
--- a/modules/caddyhttp/responsewriter.go
+++ b/modules/caddyhttp/responsewriter.go
@@ -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
diff --git a/modules/caddyhttp/responsewriter_test.go b/modules/caddyhttp/responsewriter_test.go
index 1913932..492fcad 100644
--- a/modules/caddyhttp/responsewriter_test.go
+++ b/modules/caddyhttp/responsewriter_test.go
@@ -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