1 // File automatically generated with ./wrap.sh - DO NOT EDIT 2 3 // Package httpwrap wraps an http.ResponseWriter to override some method(s) 4 // while maintaining other possible interface implementations 5 package httpwrap // import "vimagination.zapto.org/httpwrap" 6 7 import ( 8 "io" 9 "net/http" 10 ) 11 12 // Headers is an interface for the Header method of the ResponseWriter interface 13 type Headers interface { 14 Header() http.Header 15 } 16 17 // HeaderWriter is an interface for the WriteHeader method of the ResponseWriter 18 // interface 19 type HeaderWriter interface { 20 WriteHeader(int) 21 } 22 23 type responseWriter struct { 24 io.Writer 25 Headers 26 HeaderWriter 27 } 28 29 type types struct { 30 responseWriterOverride bool 31 responseWriter 32 http.Flusher 33 http.Hijacker 34 http.Pusher 35 StringWriter 36 } 37 38 // Wrap wraps the given ResponseWriter and overrides the methods requested. 39 // When using OverrideWriter make sure to use OverrideStringWriter, even if only 40 // with a nil value to disable it 41 func Wrap(w http.ResponseWriter, overrides ...Override) http.ResponseWriter { 42 if len(overrides) == 0 { 43 return w 44 } 45 var t types 46 switch wt := w.(type) { 47 case responseWriterFlusher: 48 w = wt.ResponseWriter 49 t.Flusher = wt.Flusher 50 case responseWriterHijacker: 51 w = wt.ResponseWriter 52 t.Hijacker = wt.Hijacker 53 case responseWriterFlusherHijacker: 54 w = wt.ResponseWriter 55 t.Flusher = wt.Flusher 56 t.Hijacker = wt.Hijacker 57 case responseWriterPusher: 58 w = wt.ResponseWriter 59 t.Pusher = wt.Pusher 60 case responseWriterFlusherPusher: 61 w = wt.ResponseWriter 62 t.Flusher = wt.Flusher 63 t.Pusher = wt.Pusher 64 case responseWriterHijackerPusher: 65 w = wt.ResponseWriter 66 t.Hijacker = wt.Hijacker 67 t.Pusher = wt.Pusher 68 case responseWriterFlusherHijackerPusher: 69 w = wt.ResponseWriter 70 t.Flusher = wt.Flusher 71 t.Hijacker = wt.Hijacker 72 t.Pusher = wt.Pusher 73 case responseWriterStringWriter: 74 w = wt.ResponseWriter 75 t.StringWriter = wt.StringWriter 76 case responseWriterFlusherStringWriter: 77 w = wt.ResponseWriter 78 t.Flusher = wt.Flusher 79 t.StringWriter = wt.StringWriter 80 case responseWriterHijackerStringWriter: 81 w = wt.ResponseWriter 82 t.Hijacker = wt.Hijacker 83 t.StringWriter = wt.StringWriter 84 case responseWriterFlusherHijackerStringWriter: 85 w = wt.ResponseWriter 86 t.Flusher = wt.Flusher 87 t.Hijacker = wt.Hijacker 88 t.StringWriter = wt.StringWriter 89 case responseWriterPusherStringWriter: 90 w = wt.ResponseWriter 91 t.Pusher = wt.Pusher 92 t.StringWriter = wt.StringWriter 93 case responseWriterFlusherPusherStringWriter: 94 w = wt.ResponseWriter 95 t.Flusher = wt.Flusher 96 t.Pusher = wt.Pusher 97 t.StringWriter = wt.StringWriter 98 case responseWriterHijackerPusherStringWriter: 99 w = wt.ResponseWriter 100 t.Hijacker = wt.Hijacker 101 t.Pusher = wt.Pusher 102 t.StringWriter = wt.StringWriter 103 case responseWriterFlusherHijackerPusherStringWriter: 104 w = wt.ResponseWriter 105 t.Flusher = wt.Flusher 106 t.Hijacker = wt.Hijacker 107 t.Pusher = wt.Pusher 108 t.StringWriter = wt.StringWriter 109 default: 110 t.Flusher, _ = w.(http.Flusher) 111 t.Hijacker, _ = w.(http.Hijacker) 112 t.Pusher, _ = w.(http.Pusher) 113 t.StringWriter, _ = w.(StringWriter) 114 } 115 if rw, ok := w.(responseWriter); ok { 116 t.responseWriter = rw 117 } else { 118 t.Writer = w 119 t.Headers = w 120 t.HeaderWriter = w 121 } 122 for _, o := range overrides { 123 o.Set(&t) 124 } 125 var bf uint64 126 if t.Flusher != nil { 127 bf |= 1 128 } 129 if t.Hijacker != nil { 130 bf |= 2 131 } 132 if t.Pusher != nil { 133 bf |= 4 134 } 135 if t.StringWriter != nil { 136 bf |= 8 137 } 138 if t.responseWriterOverride || bf == 0 { 139 w = t.responseWriter 140 } 141 switch bf { 142 case 1: 143 return responseWriterFlusher{ 144 w, 145 t.Flusher, 146 } 147 case 2: 148 return responseWriterHijacker{ 149 w, 150 t.Hijacker, 151 } 152 case 3: 153 return responseWriterFlusherHijacker{ 154 w, 155 t.Flusher, 156 t.Hijacker, 157 } 158 case 4: 159 return responseWriterPusher{ 160 w, 161 t.Pusher, 162 } 163 case 5: 164 return responseWriterFlusherPusher{ 165 w, 166 t.Flusher, 167 t.Pusher, 168 } 169 case 6: 170 return responseWriterHijackerPusher{ 171 w, 172 t.Hijacker, 173 t.Pusher, 174 } 175 case 7: 176 return responseWriterFlusherHijackerPusher{ 177 w, 178 t.Flusher, 179 t.Hijacker, 180 t.Pusher, 181 } 182 case 8: 183 return responseWriterStringWriter{ 184 w, 185 t.StringWriter, 186 } 187 case 9: 188 return responseWriterFlusherStringWriter{ 189 w, 190 t.Flusher, 191 t.StringWriter, 192 } 193 case 10: 194 return responseWriterHijackerStringWriter{ 195 w, 196 t.Hijacker, 197 t.StringWriter, 198 } 199 case 11: 200 return responseWriterFlusherHijackerStringWriter{ 201 w, 202 t.Flusher, 203 t.Hijacker, 204 t.StringWriter, 205 } 206 case 12: 207 return responseWriterPusherStringWriter{ 208 w, 209 t.Pusher, 210 t.StringWriter, 211 } 212 case 13: 213 return responseWriterFlusherPusherStringWriter{ 214 w, 215 t.Flusher, 216 t.Pusher, 217 t.StringWriter, 218 } 219 case 14: 220 return responseWriterHijackerPusherStringWriter{ 221 w, 222 t.Hijacker, 223 t.Pusher, 224 t.StringWriter, 225 } 226 case 15: 227 return responseWriterFlusherHijackerPusherStringWriter{ 228 w, 229 t.Flusher, 230 t.Hijacker, 231 t.Pusher, 232 t.StringWriter, 233 } 234 } 235 return w 236 } 237 238 type responseWriterFlusher struct { 239 http.ResponseWriter 240 http.Flusher 241 } 242 243 type responseWriterHijacker struct { 244 http.ResponseWriter 245 http.Hijacker 246 } 247 248 type responseWriterFlusherHijacker struct { 249 http.ResponseWriter 250 http.Flusher 251 http.Hijacker 252 } 253 254 type responseWriterPusher struct { 255 http.ResponseWriter 256 http.Pusher 257 } 258 259 type responseWriterFlusherPusher struct { 260 http.ResponseWriter 261 http.Flusher 262 http.Pusher 263 } 264 265 type responseWriterHijackerPusher struct { 266 http.ResponseWriter 267 http.Hijacker 268 http.Pusher 269 } 270 271 type responseWriterFlusherHijackerPusher struct { 272 http.ResponseWriter 273 http.Flusher 274 http.Hijacker 275 http.Pusher 276 } 277 278 type responseWriterStringWriter struct { 279 http.ResponseWriter 280 StringWriter 281 } 282 283 type responseWriterFlusherStringWriter struct { 284 http.ResponseWriter 285 http.Flusher 286 StringWriter 287 } 288 289 type responseWriterHijackerStringWriter struct { 290 http.ResponseWriter 291 http.Hijacker 292 StringWriter 293 } 294 295 type responseWriterFlusherHijackerStringWriter struct { 296 http.ResponseWriter 297 http.Flusher 298 http.Hijacker 299 StringWriter 300 } 301 302 type responseWriterPusherStringWriter struct { 303 http.ResponseWriter 304 http.Pusher 305 StringWriter 306 } 307 308 type responseWriterFlusherPusherStringWriter struct { 309 http.ResponseWriter 310 http.Flusher 311 http.Pusher 312 StringWriter 313 } 314 315 type responseWriterHijackerPusherStringWriter struct { 316 http.ResponseWriter 317 http.Hijacker 318 http.Pusher 319 StringWriter 320 } 321 322 type responseWriterFlusherHijackerPusherStringWriter struct { 323 http.ResponseWriter 324 http.Flusher 325 http.Hijacker 326 http.Pusher 327 StringWriter 328 }