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