github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/httpsnoop/wrap_generated_lt_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  // Hooks defines a set of method interceptors for methods included in
    35  // http.ResponseWriter as well as some others. You can think of them as
    36  // middleware for the function calls they target. See Wrap for more details.
    37  type Hooks struct {
    38  	Header      func(HeaderFunc) HeaderFunc
    39  	WriteHeader func(WriteHeaderFunc) WriteHeaderFunc
    40  	Write       func(WriteFunc) WriteFunc
    41  	Flush       func(FlushFunc) FlushFunc
    42  	CloseNotify func(CloseNotifyFunc) CloseNotifyFunc
    43  	Hijack      func(HijackFunc) HijackFunc
    44  	ReadFrom    func(ReadFromFunc) ReadFromFunc
    45  }
    46  
    47  // Wrap returns a wrapped version of w that provides the exact same interface
    48  // as w. Specifically if w implements any combination of:
    49  //
    50  // - http.Flusher
    51  // - http.CloseNotifier
    52  // - http.Hijacker
    53  // - io.ReaderFrom
    54  //
    55  // The wrapped version will implement the exact same combination. If no hooks
    56  // are set, the wrapped version also behaves exactly as w. Hooks targeting
    57  // methods not supported by w are ignored. Any other hooks will intercept the
    58  // method they target and may modify the call's arguments and/or return values.
    59  // The CaptureMetrics implementation serves as a working example for how the
    60  // hooks can be used.
    61  func Wrap(w http.ResponseWriter, hooks Hooks) http.ResponseWriter {
    62  	rw := &rw{w: w, h: hooks}
    63  	_, i0 := w.(http.Flusher)
    64  	_, i1 := w.(http.CloseNotifier)
    65  	_, i2 := w.(http.Hijacker)
    66  	_, i3 := w.(io.ReaderFrom)
    67  	switch {
    68  	// combination 1/16
    69  	case !i0 && !i1 && !i2 && !i3:
    70  		return struct {
    71  			Unwrapper
    72  			http.ResponseWriter
    73  		}{rw, rw}
    74  	// combination 2/16
    75  	case !i0 && !i1 && !i2 && i3:
    76  		return struct {
    77  			Unwrapper
    78  			http.ResponseWriter
    79  			io.ReaderFrom
    80  		}{rw, rw, rw}
    81  	// combination 3/16
    82  	case !i0 && !i1 && i2 && !i3:
    83  		return struct {
    84  			Unwrapper
    85  			http.ResponseWriter
    86  			http.Hijacker
    87  		}{rw, rw, rw}
    88  	// combination 4/16
    89  	case !i0 && !i1 && i2 && i3:
    90  		return struct {
    91  			Unwrapper
    92  			http.ResponseWriter
    93  			http.Hijacker
    94  			io.ReaderFrom
    95  		}{rw, rw, rw, rw}
    96  	// combination 5/16
    97  	case !i0 && i1 && !i2 && !i3:
    98  		return struct {
    99  			Unwrapper
   100  			http.ResponseWriter
   101  			http.CloseNotifier
   102  		}{rw, rw, rw}
   103  	// combination 6/16
   104  	case !i0 && i1 && !i2 && i3:
   105  		return struct {
   106  			Unwrapper
   107  			http.ResponseWriter
   108  			http.CloseNotifier
   109  			io.ReaderFrom
   110  		}{rw, rw, rw, rw}
   111  	// combination 7/16
   112  	case !i0 && i1 && i2 && !i3:
   113  		return struct {
   114  			Unwrapper
   115  			http.ResponseWriter
   116  			http.CloseNotifier
   117  			http.Hijacker
   118  		}{rw, rw, rw, rw}
   119  	// combination 8/16
   120  	case !i0 && i1 && i2 && i3:
   121  		return struct {
   122  			Unwrapper
   123  			http.ResponseWriter
   124  			http.CloseNotifier
   125  			http.Hijacker
   126  			io.ReaderFrom
   127  		}{rw, rw, rw, rw, rw}
   128  	// combination 9/16
   129  	case i0 && !i1 && !i2 && !i3:
   130  		return struct {
   131  			Unwrapper
   132  			http.ResponseWriter
   133  			http.Flusher
   134  		}{rw, rw, rw}
   135  	// combination 10/16
   136  	case i0 && !i1 && !i2 && i3:
   137  		return struct {
   138  			Unwrapper
   139  			http.ResponseWriter
   140  			http.Flusher
   141  			io.ReaderFrom
   142  		}{rw, rw, rw, rw}
   143  	// combination 11/16
   144  	case i0 && !i1 && i2 && !i3:
   145  		return struct {
   146  			Unwrapper
   147  			http.ResponseWriter
   148  			http.Flusher
   149  			http.Hijacker
   150  		}{rw, rw, rw, rw}
   151  	// combination 12/16
   152  	case i0 && !i1 && i2 && i3:
   153  		return struct {
   154  			Unwrapper
   155  			http.ResponseWriter
   156  			http.Flusher
   157  			http.Hijacker
   158  			io.ReaderFrom
   159  		}{rw, rw, rw, rw, rw}
   160  	// combination 13/16
   161  	case i0 && i1 && !i2 && !i3:
   162  		return struct {
   163  			Unwrapper
   164  			http.ResponseWriter
   165  			http.Flusher
   166  			http.CloseNotifier
   167  		}{rw, rw, rw, rw}
   168  	// combination 14/16
   169  	case i0 && i1 && !i2 && i3:
   170  		return struct {
   171  			Unwrapper
   172  			http.ResponseWriter
   173  			http.Flusher
   174  			http.CloseNotifier
   175  			io.ReaderFrom
   176  		}{rw, rw, rw, rw, rw}
   177  	// combination 15/16
   178  	case i0 && i1 && i2 && !i3:
   179  		return struct {
   180  			Unwrapper
   181  			http.ResponseWriter
   182  			http.Flusher
   183  			http.CloseNotifier
   184  			http.Hijacker
   185  		}{rw, rw, rw, rw, rw}
   186  	// combination 16/16
   187  	case i0 && i1 && i2 && i3:
   188  		return struct {
   189  			Unwrapper
   190  			http.ResponseWriter
   191  			http.Flusher
   192  			http.CloseNotifier
   193  			http.Hijacker
   194  			io.ReaderFrom
   195  		}{rw, rw, rw, rw, rw, rw}
   196  	}
   197  	panic("unreachable")
   198  }
   199  
   200  type rw struct {
   201  	w http.ResponseWriter
   202  	h Hooks
   203  }
   204  
   205  func (w *rw) Unwrap() http.ResponseWriter {
   206  	return w.w
   207  }
   208  
   209  func (w *rw) Header() http.Header {
   210  	f := w.w.(http.ResponseWriter).Header
   211  	if w.h.Header != nil {
   212  		f = w.h.Header(f)
   213  	}
   214  	return f()
   215  }
   216  
   217  func (w *rw) WriteHeader(code int) {
   218  	f := w.w.(http.ResponseWriter).WriteHeader
   219  	if w.h.WriteHeader != nil {
   220  		f = w.h.WriteHeader(f)
   221  	}
   222  	f(code)
   223  }
   224  
   225  func (w *rw) Write(b []byte) (int, error) {
   226  	f := w.w.(http.ResponseWriter).Write
   227  	if w.h.Write != nil {
   228  		f = w.h.Write(f)
   229  	}
   230  	return f(b)
   231  }
   232  
   233  func (w *rw) Flush() {
   234  	f := w.w.(http.Flusher).Flush
   235  	if w.h.Flush != nil {
   236  		f = w.h.Flush(f)
   237  	}
   238  	f()
   239  }
   240  
   241  func (w *rw) CloseNotify() <-chan bool {
   242  	f := w.w.(http.CloseNotifier).CloseNotify
   243  	if w.h.CloseNotify != nil {
   244  		f = w.h.CloseNotify(f)
   245  	}
   246  	return f()
   247  }
   248  
   249  func (w *rw) Hijack() (net.Conn, *bufio.ReadWriter, error) {
   250  	f := w.w.(http.Hijacker).Hijack
   251  	if w.h.Hijack != nil {
   252  		f = w.h.Hijack(f)
   253  	}
   254  	return f()
   255  }
   256  
   257  func (w *rw) ReadFrom(src io.Reader) (int64, error) {
   258  	f := w.w.(io.ReaderFrom).ReadFrom
   259  	if w.h.ReadFrom != nil {
   260  		f = w.h.ReadFrom(f)
   261  	}
   262  	return f(src)
   263  }
   264  
   265  type Unwrapper interface {
   266  	Unwrap() http.ResponseWriter
   267  }
   268  
   269  // Unwrap returns the underlying http.ResponseWriter from within zero or more
   270  // layers of httpsnoop wrappers.
   271  func Unwrap(w http.ResponseWriter) http.ResponseWriter {
   272  	if rw, ok := w.(Unwrapper); ok {
   273  		// recurse until rw.Unwrap() returns a non-Unwrapper
   274  		return Unwrap(rw.Unwrap())
   275  	} else {
   276  		return w
   277  	}
   278  }