delegator_1_8.go 5.5 KB

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