func WrapResponseWriter()

in module/apmhttp/handler.go [177:228]


func WrapResponseWriter(w http.ResponseWriter) (http.ResponseWriter, *Response) {
	rw := responseWriter{
		ResponseWriter: w,
		resp: Response{
			Headers: w.Header(),
		},
	}

	h, _ := w.(http.Hijacker)
	p, _ := w.(http.Pusher)
	rf, _ := w.(io.ReaderFrom)

	switch {
	case h != nil && p != nil:
		rwhp := responseWriterHijackerPusher{
			responseWriter: rw,
			Hijacker:       h,
			Pusher:         p,
		}
		if rf != nil {
			rwhprf := responseWriterHijackerPusherReaderFrom{rwhp, rf}
			return &rwhprf, &rwhprf.resp
		}
		return &rwhp, &rwhp.resp
	case h != nil:
		rwh := responseWriterHijacker{
			responseWriter: rw,
			Hijacker:       h,
		}
		if rf != nil {
			rwhrf := responseWriterHijackerReaderFrom{rwh, rf}
			return &rwhrf, &rwhrf.resp
		}
		return &rwh, &rwh.resp
	case p != nil:
		rwp := responseWriterPusher{
			responseWriter: rw,
			Pusher:         p,
		}
		if rf != nil {
			rwprf := responseWriterPusherReaderFrom{rwp, rf}
			return &rwprf, &rwprf.resp
		}
		return &rwp, &rwp.resp
	default:
		if rf != nil {
			rwrf := responseWriterReaderFrom{rw, rf}
			return &rwrf, &rwrf.resp
		}
		return &rw, &rw.resp
	}
}