blob: 31a70695695c59b58609554743f13ff8a8e89cdd [file] [log] [blame]
khenaidooffe076b2019-01-15 16:08:08 -05001// 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
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
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.
13
14// +build go1.8
15
16package promhttp
17
18import (
19 "io"
20 "net/http"
21)
22
23type pusherDelegator struct{ *responseWriterDelegator }
24
25func (d pusherDelegator) Push(target string, opts *http.PushOptions) error {
26 return d.ResponseWriter.(http.Pusher).Push(target, opts)
27}
28
29func init() {
30 pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16
31 return pusherDelegator{d}
32 }
33 pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17
34 return struct {
35 *responseWriterDelegator
36 http.Pusher
37 http.CloseNotifier
38 }{d, pusherDelegator{d}, closeNotifierDelegator{d}}
39 }
40 pickDelegator[pusher+flusher] = func(d *responseWriterDelegator) delegator { // 18
41 return struct {
42 *responseWriterDelegator
43 http.Pusher
44 http.Flusher
45 }{d, pusherDelegator{d}, flusherDelegator{d}}
46 }
47 pickDelegator[pusher+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 19
48 return struct {
49 *responseWriterDelegator
50 http.Pusher
51 http.Flusher
52 http.CloseNotifier
53 }{d, pusherDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}}
54 }
55 pickDelegator[pusher+hijacker] = func(d *responseWriterDelegator) delegator { // 20
56 return struct {
57 *responseWriterDelegator
58 http.Pusher
59 http.Hijacker
60 }{d, pusherDelegator{d}, hijackerDelegator{d}}
61 }
62 pickDelegator[pusher+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 21
63 return struct {
64 *responseWriterDelegator
65 http.Pusher
66 http.Hijacker
67 http.CloseNotifier
68 }{d, pusherDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}}
69 }
70 pickDelegator[pusher+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 22
71 return struct {
72 *responseWriterDelegator
73 http.Pusher
74 http.Hijacker
75 http.Flusher
76 }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}}
77 }
78 pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { //23
79 return struct {
80 *responseWriterDelegator
81 http.Pusher
82 http.Hijacker
83 http.Flusher
84 http.CloseNotifier
85 }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}}
86 }
87 pickDelegator[pusher+readerFrom] = func(d *responseWriterDelegator) delegator { // 24
88 return struct {
89 *responseWriterDelegator
90 http.Pusher
91 io.ReaderFrom
92 }{d, pusherDelegator{d}, readerFromDelegator{d}}
93 }
94 pickDelegator[pusher+readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 25
95 return struct {
96 *responseWriterDelegator
97 http.Pusher
98 io.ReaderFrom
99 http.CloseNotifier
100 }{d, pusherDelegator{d}, readerFromDelegator{d}, closeNotifierDelegator{d}}
101 }
102 pickDelegator[pusher+readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 26
103 return struct {
104 *responseWriterDelegator
105 http.Pusher
106 io.ReaderFrom
107 http.Flusher
108 }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}}
109 }
110 pickDelegator[pusher+readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 27
111 return struct {
112 *responseWriterDelegator
113 http.Pusher
114 io.ReaderFrom
115 http.Flusher
116 http.CloseNotifier
117 }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}}
118 }
119 pickDelegator[pusher+readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 28
120 return struct {
121 *responseWriterDelegator
122 http.Pusher
123 io.ReaderFrom
124 http.Hijacker
125 }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}}
126 }
127 pickDelegator[pusher+readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 29
128 return struct {
129 *responseWriterDelegator
130 http.Pusher
131 io.ReaderFrom
132 http.Hijacker
133 http.CloseNotifier
134 }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}}
135 }
136 pickDelegator[pusher+readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 30
137 return struct {
138 *responseWriterDelegator
139 http.Pusher
140 io.ReaderFrom
141 http.Hijacker
142 http.Flusher
143 }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}}
144 }
145 pickDelegator[pusher+readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 31
146 return struct {
147 *responseWriterDelegator
148 http.Pusher
149 io.ReaderFrom
150 http.Hijacker
151 http.Flusher
152 http.CloseNotifier
153 }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}}
154 }
155}
156
157func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator {
158 d := &responseWriterDelegator{
159 ResponseWriter: w,
160 observeWriteHeader: observeWriteHeaderFunc,
161 }
162
163 id := 0
164 if _, ok := w.(http.CloseNotifier); ok {
165 id += closeNotifier
166 }
167 if _, ok := w.(http.Flusher); ok {
168 id += flusher
169 }
170 if _, ok := w.(http.Hijacker); ok {
171 id += hijacker
172 }
173 if _, ok := w.(io.ReaderFrom); ok {
174 id += readerFrom
175 }
176 if _, ok := w.(http.Pusher); ok {
177 id += pusher
178 }
179
180 return pickDelegator[id](d)
181}