// Creates a response from a handler and a request. // // It calls the handler's ServeHTTP method with an internal response // writer that shares the status code, headers and the response body // with the returned response. It blocks until the handler calls the // response writer's WriteHeader, or starts writing the body, or // returns. The written body is not buffered, but piped to the returned // response's body. // // Example, a simple file server: // // var handler = http.StripPrefix(webRoot, http.FileServer(http.Dir(root))) // // func (f *myFilter) Request(ctx filters.FilterContext) { // serve.ServeHTTP(ctx, handler) // } // func ServeHTTP(ctx filters.FilterContext, h http.Handler) { rsp := &http.Response{Header: make(http.Header)} r, w := io.Pipe() d := &pipedResponse{ response: rsp, reader: r, writer: w, headerDone: make(chan struct{})} req := ctx.Request() go func() { h.ServeHTTP(d, req) select { case <-d.headerDone: default: d.WriteHeader(http.StatusOK) } w.CloseWithError(io.EOF) }() <-d.headerDone rsp.Body = d ctx.Serve(rsp) }
// check basic auth func (a *basic) Request(ctx filters.FilterContext) { username := a.authenticator.CheckAuth(ctx.Request()) if username == "" { header := http.Header{} header.Set(ForceBasicAuthHeaderName, a.realmDefinition) ctx.Serve(&http.Response{ StatusCode: http.StatusUnauthorized, Header: header, }) } }
func (rc *requestCheck) Request(ctx filters.FilterContext) { if !rc.check(ctx.Request()) { ctx.Serve(&http.Response{StatusCode: http.StatusBadRequest}) } }
func (b *breaker) Request(c filters.FilterContext) { c.Serve(b.resp) }
// Redirect implements the redirect logic as a standalone function. func Redirect(ctx filters.FilterContext, code int, location *url.URL) { u := getLocation(ctx, location) ctx.Serve(&http.Response{ StatusCode: code, Header: http.Header{"Location": []string{u}}}) }