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