1 // Copyright 2017 The Prometheus Authors
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
6 // http://www.apache.org/licenses/LICENSE-2.0
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
24 closeNotifier = 1 << iota
31 type delegator interface {
38 type responseWriterDelegator struct {
44 observeWriteHeader func(int)
47 func (r *responseWriterDelegator) Status() int {
51 func (r *responseWriterDelegator) Written() int64 {
55 func (r *responseWriterDelegator) WriteHeader(code int) {
58 r.ResponseWriter.WriteHeader(code)
59 if r.observeWriteHeader != nil {
60 r.observeWriteHeader(code)
64 func (r *responseWriterDelegator) Write(b []byte) (int, error) {
66 r.WriteHeader(http.StatusOK)
68 n, err := r.ResponseWriter.Write(b)
73 type closeNotifierDelegator struct{ *responseWriterDelegator }
74 type flusherDelegator struct{ *responseWriterDelegator }
75 type hijackerDelegator struct{ *responseWriterDelegator }
76 type readerFromDelegator struct{ *responseWriterDelegator }
78 func (d closeNotifierDelegator) CloseNotify() <-chan bool {
79 return d.ResponseWriter.(http.CloseNotifier).CloseNotify()
81 func (d flusherDelegator) Flush() {
82 d.ResponseWriter.(http.Flusher).Flush()
84 func (d hijackerDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) {
85 return d.ResponseWriter.(http.Hijacker).Hijack()
87 func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) {
89 d.WriteHeader(http.StatusOK)
91 n, err := d.ResponseWriter.(io.ReaderFrom).ReadFrom(re)
96 var pickDelegator = make([]func(*responseWriterDelegator) delegator, 32)
99 // TODO(beorn7): Code generation would help here.
100 pickDelegator[0] = func(d *responseWriterDelegator) delegator { // 0
103 pickDelegator[closeNotifier] = func(d *responseWriterDelegator) delegator { // 1
104 return closeNotifierDelegator{d}
106 pickDelegator[flusher] = func(d *responseWriterDelegator) delegator { // 2
107 return flusherDelegator{d}
109 pickDelegator[flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 3
111 *responseWriterDelegator
114 }{d, flusherDelegator{d}, closeNotifierDelegator{d}}
116 pickDelegator[hijacker] = func(d *responseWriterDelegator) delegator { // 4
117 return hijackerDelegator{d}
119 pickDelegator[hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 5
121 *responseWriterDelegator
124 }{d, hijackerDelegator{d}, closeNotifierDelegator{d}}
126 pickDelegator[hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 6
128 *responseWriterDelegator
131 }{d, hijackerDelegator{d}, flusherDelegator{d}}
133 pickDelegator[hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 7
135 *responseWriterDelegator
139 }{d, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}}
141 pickDelegator[readerFrom] = func(d *responseWriterDelegator) delegator { // 8
142 return readerFromDelegator{d}
144 pickDelegator[readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 9
146 *responseWriterDelegator
149 }{d, readerFromDelegator{d}, closeNotifierDelegator{d}}
151 pickDelegator[readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 10
153 *responseWriterDelegator
156 }{d, readerFromDelegator{d}, flusherDelegator{d}}
158 pickDelegator[readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 11
160 *responseWriterDelegator
164 }{d, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}}
166 pickDelegator[readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 12
168 *responseWriterDelegator
171 }{d, readerFromDelegator{d}, hijackerDelegator{d}}
173 pickDelegator[readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 13
175 *responseWriterDelegator
179 }{d, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}}
181 pickDelegator[readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 14
183 *responseWriterDelegator
187 }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}}
189 pickDelegator[readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 15
191 *responseWriterDelegator
196 }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}}