github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/httpsnoop/wrap_generated_gteq_1.8.go (about) 1 // +build go1.8 2 // Code generated by "httpsnoop/codegen"; DO NOT EDIT 3 4 package httpsnoop 5 6 import ( 7 "bufio" 8 "io" 9 "net" 10 http "github.com/hxx258456/ccgo/gmhttp" 11 ) 12 13 // HeaderFunc is part of the http.ResponseWriter interface. 14 type HeaderFunc func() http.Header 15 16 // WriteHeaderFunc is part of the http.ResponseWriter interface. 17 type WriteHeaderFunc func(code int) 18 19 // WriteFunc is part of the http.ResponseWriter interface. 20 type WriteFunc func(b []byte) (int, error) 21 22 // FlushFunc is part of the http.Flusher interface. 23 type FlushFunc func() 24 25 // CloseNotifyFunc is part of the http.CloseNotifier interface. 26 type CloseNotifyFunc func() <-chan bool 27 28 // HijackFunc is part of the http.Hijacker interface. 29 type HijackFunc func() (net.Conn, *bufio.ReadWriter, error) 30 31 // ReadFromFunc is part of the io.ReaderFrom interface. 32 type ReadFromFunc func(src io.Reader) (int64, error) 33 34 // PushFunc is part of the http.Pusher interface. 35 type PushFunc func(target string, opts *http.PushOptions) error 36 37 // Hooks defines a set of method interceptors for methods included in 38 // http.ResponseWriter as well as some others. You can think of them as 39 // middleware for the function calls they target. See Wrap for more details. 40 type Hooks struct { 41 Header func(HeaderFunc) HeaderFunc 42 WriteHeader func(WriteHeaderFunc) WriteHeaderFunc 43 Write func(WriteFunc) WriteFunc 44 Flush func(FlushFunc) FlushFunc 45 CloseNotify func(CloseNotifyFunc) CloseNotifyFunc 46 Hijack func(HijackFunc) HijackFunc 47 ReadFrom func(ReadFromFunc) ReadFromFunc 48 Push func(PushFunc) PushFunc 49 } 50 51 // Wrap returns a wrapped version of w that provides the exact same interface 52 // as w. Specifically if w implements any combination of: 53 // 54 // - http.Flusher 55 // - http.CloseNotifier 56 // - http.Hijacker 57 // - io.ReaderFrom 58 // - http.Pusher 59 // 60 // The wrapped version will implement the exact same combination. If no hooks 61 // are set, the wrapped version also behaves exactly as w. Hooks targeting 62 // methods not supported by w are ignored. Any other hooks will intercept the 63 // method they target and may modify the call's arguments and/or return values. 64 // The CaptureMetrics implementation serves as a working example for how the 65 // hooks can be used. 66 func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter { 67 rw := &rw{w: w, h: hooks} 68 _, i0 := w.(http.Flusher) 69 _, i1 := w.(http.CloseNotifier) 70 _, i2 := w.(http.Hijacker) 71 _, i3 := w.(io.ReaderFrom) 72 _, i4 := w.(http.Pusher) 73 switch { 74 // combination 1/32 75 case !i0 && !i1 && !i2 && !i3 && !i4: 76 return struct { 77 Unwrapper 78 http.ResponseWriter 79 }{rw, rw} 80 // combination 2/32 81 case !i0 && !i1 && !i2 && !i3 && i4: 82 return struct { 83 Unwrapper 84 http.ResponseWriter 85 http.Pusher 86 }{rw, rw, rw} 87 // combination 3/32 88 case !i0 && !i1 && !i2 && i3 && !i4: 89 return struct { 90 Unwrapper 91 http.ResponseWriter 92 io.ReaderFrom 93 }{rw, rw, rw} 94 // combination 4/32 95 case !i0 && !i1 && !i2 && i3 && i4: 96 return struct { 97 Unwrapper 98 http.ResponseWriter 99 io.ReaderFrom 100 http.Pusher 101 }{rw, rw, rw, rw} 102 // combination 5/32 103 case !i0 && !i1 && i2 && !i3 && !i4: 104 return struct { 105 Unwrapper 106 http.ResponseWriter 107 http.Hijacker 108 }{rw, rw, rw} 109 // combination 6/32 110 case !i0 && !i1 && i2 && !i3 && i4: 111 return struct { 112 Unwrapper 113 http.ResponseWriter 114 http.Hijacker 115 http.Pusher 116 }{rw, rw, rw, rw} 117 // combination 7/32 118 case !i0 && !i1 && i2 && i3 && !i4: 119 return struct { 120 Unwrapper 121 http.ResponseWriter 122 http.Hijacker 123 io.ReaderFrom 124 }{rw, rw, rw, rw} 125 // combination 8/32 126 case !i0 && !i1 && i2 && i3 && i4: 127 return struct { 128 Unwrapper 129 http.ResponseWriter 130 http.Hijacker 131 io.ReaderFrom 132 http.Pusher 133 }{rw, rw, rw, rw, rw} 134 // combination 9/32 135 case !i0 && i1 && !i2 && !i3 && !i4: 136 return struct { 137 Unwrapper 138 http.ResponseWriter 139 http.CloseNotifier 140 }{rw, rw, rw} 141 // combination 10/32 142 case !i0 && i1 && !i2 && !i3 && i4: 143 return struct { 144 Unwrapper 145 http.ResponseWriter 146 http.CloseNotifier 147 http.Pusher 148 }{rw, rw, rw, rw} 149 // combination 11/32 150 case !i0 && i1 && !i2 && i3 && !i4: 151 return struct { 152 Unwrapper 153 http.ResponseWriter 154 http.CloseNotifier 155 io.ReaderFrom 156 }{rw, rw, rw, rw} 157 // combination 12/32 158 case !i0 && i1 && !i2 && i3 && i4: 159 return struct { 160 Unwrapper 161 http.ResponseWriter 162 http.CloseNotifier 163 io.ReaderFrom 164 http.Pusher 165 }{rw, rw, rw, rw, rw} 166 // combination 13/32 167 case !i0 && i1 && i2 && !i3 && !i4: 168 return struct { 169 Unwrapper 170 http.ResponseWriter 171 http.CloseNotifier 172 http.Hijacker 173 }{rw, rw, rw, rw} 174 // combination 14/32 175 case !i0 && i1 && i2 && !i3 && i4: 176 return struct { 177 Unwrapper 178 http.ResponseWriter 179 http.CloseNotifier 180 http.Hijacker 181 http.Pusher 182 }{rw, rw, rw, rw, rw} 183 // combination 15/32 184 case !i0 && i1 && i2 && i3 && !i4: 185 return struct { 186 Unwrapper 187 http.ResponseWriter 188 http.CloseNotifier 189 http.Hijacker 190 io.ReaderFrom 191 }{rw, rw, rw, rw, rw} 192 // combination 16/32 193 case !i0 && i1 && i2 && i3 && i4: 194 return struct { 195 Unwrapper 196 http.ResponseWriter 197 http.CloseNotifier 198 http.Hijacker 199 io.ReaderFrom 200 http.Pusher 201 }{rw, rw, rw, rw, rw, rw} 202 // combination 17/32 203 case i0 && !i1 && !i2 && !i3 && !i4: 204 return struct { 205 Unwrapper 206 http.ResponseWriter 207 http.Flusher 208 }{rw, rw, rw} 209 // combination 18/32 210 case i0 && !i1 && !i2 && !i3 && i4: 211 return struct { 212 Unwrapper 213 http.ResponseWriter 214 http.Flusher 215 http.Pusher 216 }{rw, rw, rw, rw} 217 // combination 19/32 218 case i0 && !i1 && !i2 && i3 && !i4: 219 return struct { 220 Unwrapper 221 http.ResponseWriter 222 http.Flusher 223 io.ReaderFrom 224 }{rw, rw, rw, rw} 225 // combination 20/32 226 case i0 && !i1 && !i2 && i3 && i4: 227 return struct { 228 Unwrapper 229 http.ResponseWriter 230 http.Flusher 231 io.ReaderFrom 232 http.Pusher 233 }{rw, rw, rw, rw, rw} 234 // combination 21/32 235 case i0 && !i1 && i2 && !i3 && !i4: 236 return struct { 237 Unwrapper 238 http.ResponseWriter 239 http.Flusher 240 http.Hijacker 241 }{rw, rw, rw, rw} 242 // combination 22/32 243 case i0 && !i1 && i2 && !i3 && i4: 244 return struct { 245 Unwrapper 246 http.ResponseWriter 247 http.Flusher 248 http.Hijacker 249 http.Pusher 250 }{rw, rw, rw, rw, rw} 251 // combination 23/32 252 case i0 && !i1 && i2 && i3 && !i4: 253 return struct { 254 Unwrapper 255 http.ResponseWriter 256 http.Flusher 257 http.Hijacker 258 io.ReaderFrom 259 }{rw, rw, rw, rw, rw} 260 // combination 24/32 261 case i0 && !i1 && i2 && i3 && i4: 262 return struct { 263 Unwrapper 264 http.ResponseWriter 265 http.Flusher 266 http.Hijacker 267 io.ReaderFrom 268 http.Pusher 269 }{rw, rw, rw, rw, rw, rw} 270 // combination 25/32 271 case i0 && i1 && !i2 && !i3 && !i4: 272 return struct { 273 Unwrapper 274 http.ResponseWriter 275 http.Flusher 276 http.CloseNotifier 277 }{rw, rw, rw, rw} 278 // combination 26/32 279 case i0 && i1 && !i2 && !i3 && i4: 280 return struct { 281 Unwrapper 282 http.ResponseWriter 283 http.Flusher 284 http.CloseNotifier 285 http.Pusher 286 }{rw, rw, rw, rw, rw} 287 // combination 27/32 288 case i0 && i1 && !i2 && i3 && !i4: 289 return struct { 290 Unwrapper 291 http.ResponseWriter 292 http.Flusher 293 http.CloseNotifier 294 io.ReaderFrom 295 }{rw, rw, rw, rw, rw} 296 // combination 28/32 297 case i0 && i1 && !i2 && i3 && i4: 298 return struct { 299 Unwrapper 300 http.ResponseWriter 301 http.Flusher 302 http.CloseNotifier 303 io.ReaderFrom 304 http.Pusher 305 }{rw, rw, rw, rw, rw, rw} 306 // combination 29/32 307 case i0 && i1 && i2 && !i3 && !i4: 308 return struct { 309 Unwrapper 310 http.ResponseWriter 311 http.Flusher 312 http.CloseNotifier 313 http.Hijacker 314 }{rw, rw, rw, rw, rw} 315 // combination 30/32 316 case i0 && i1 && i2 && !i3 && i4: 317 return struct { 318 Unwrapper 319 http.ResponseWriter 320 http.Flusher 321 http.CloseNotifier 322 http.Hijacker 323 http.Pusher 324 }{rw, rw, rw, rw, rw, rw} 325 // combination 31/32 326 case i0 && i1 && i2 && i3 && !i4: 327 return struct { 328 Unwrapper 329 http.ResponseWriter 330 http.Flusher 331 http.CloseNotifier 332 http.Hijacker 333 io.ReaderFrom 334 }{rw, rw, rw, rw, rw, rw} 335 // combination 32/32 336 case i0 && i1 && i2 && i3 && i4: 337 return struct { 338 Unwrapper 339 http.ResponseWriter 340 http.Flusher 341 http.CloseNotifier 342 http.Hijacker 343 io.ReaderFrom 344 http.Pusher 345 }{rw, rw, rw, rw, rw, rw, rw} 346 } 347 panic("unreachable") 348 } 349 350 type rw struct { 351 w http.ResponseWriter 352 h Hooks 353 } 354 355 func (w *rw) Unwrap() http.ResponseWriter { 356 return w.w 357 } 358 359 func (w *rw) Header() http.Header { 360 f := w.w.(http.ResponseWriter).Header 361 if w.h.Header != nil { 362 f = w.h.Header(f) 363 } 364 return f() 365 } 366 367 func (w *rw) WriteHeader(code int) { 368 f := w.w.(http.ResponseWriter).WriteHeader 369 if w.h.WriteHeader != nil { 370 f = w.h.WriteHeader(f) 371 } 372 f(code) 373 } 374 375 func (w *rw) Write(b []byte) (int, error) { 376 f := w.w.(http.ResponseWriter).Write 377 if w.h.Write != nil { 378 f = w.h.Write(f) 379 } 380 return f(b) 381 } 382 383 func (w *rw) Flush() { 384 f := w.w.(http.Flusher).Flush 385 if w.h.Flush != nil { 386 f = w.h.Flush(f) 387 } 388 f() 389 } 390 391 func (w *rw) CloseNotify() <-chan bool { 392 f := w.w.(http.CloseNotifier).CloseNotify 393 if w.h.CloseNotify != nil { 394 f = w.h.CloseNotify(f) 395 } 396 return f() 397 } 398 399 func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) { 400 f := w.w.(http.Hijacker).Hijack 401 if w.h.Hijack != nil { 402 f = w.h.Hijack(f) 403 } 404 return f() 405 } 406 407 func (w *rw) ReadFrom(src io.Reader) (int64, error) { 408 f := w.w.(io.ReaderFrom).ReadFrom 409 if w.h.ReadFrom != nil { 410 f = w.h.ReadFrom(f) 411 } 412 return f(src) 413 } 414 415 func (w *rw) Push(target string, opts *http.PushOptions) error { 416 f := w.w.(http.Pusher).Push 417 if w.h.Push != nil { 418 f = w.h.Push(f) 419 } 420 return f(target, opts) 421 } 422 423 type Unwrapper interface { 424 Unwrap() http.ResponseWriter 425 } 426 427 // Unwrap returns the underlying http.ResponseWriter from within zero or more 428 // layers of httpsnoop wrappers. 429 func Unwrap(w http.ResponseWriter) http.ResponseWriter { 430 if rw, ok := w.(Unwrapper); ok { 431 // recurse until rw.Unwrap() returns a non-Unwrapper 432 return Unwrap(rw.Unwrap()) 433 } else { 434 return w 435 } 436 }