func (a *Authenticator) Endpoint(prefix string) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		// create tracer
		tracer := fire.NewTracerFromRequest(r, "flame/Authenticator.Endpoint")
		tracer.Tag("prefix", prefix)
		defer tracer.Finish(true)

		// continue any previous aborts
		defer stack.Resume(func(err error) {
			// directly write oauth2 errors
			if oauth2Error, ok := err.(*oauth2.Error); ok {
				_ = oauth2.WriteError(w, oauth2Error)
				return
			}

			// set critical error on last span
			tracer.Tag("error", true)
			tracer.Log("error", err.Error())
			tracer.Log("stack", stack.Trace())

			// otherwise report critical errors
			if a.Reporter != nil {
				a.Reporter(err)
			}

			// ignore errors caused by writing critical errors
			_ = oauth2.WriteError(w, oauth2.ServerError(""))
		})

		// trim and split path
		s := strings.Split(strings.Trim(strings.TrimPrefix(r.URL.Path, prefix), "/"), "/")
		if len(s) != 1 || (s[0] != "authorize" && s[0] != "token" && s[0] != "revoke") {
			w.WriteHeader(http.StatusNotFound)
			return
		}

		// copy store
		store := a.store.Copy()
		defer store.Close()

		// create
		state := &state{
			request: r,
			writer:  w,
			store:   store,
			tracer:  tracer,
		}

		// call endpoints
		switch s[0] {
		case "authorize":
			a.authorizationEndpoint(state)
		case "token":
			a.tokenEndpoint(state)
		case "revoke":
			a.revocationEndpoint(state)
		}
	})
}
func (a *Authenticator) Endpoint(prefix string) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		
		tracer := fire.NewTracerFromRequest(r, "flame/Authenticator.Endpoint")
		tracer.Tag("prefix", prefix)
		defer tracer.Finish(true)

		
		defer stack.Resume(func(err error) {
			
			if oauth2Error, ok := err.(*oauth2.Error); ok {
				_ = oauth2.WriteError(w, oauth2Error)
				return
			}

			
			tracer.Tag("error", true)
			tracer.Log("error", err.Error())
			tracer.Log("stack", stack.Trace())

			
			if a.Reporter != nil {
				a.Reporter(err)
			}

			
			_ = oauth2.WriteError(w, oauth2.ServerError(""))
		})

		
		s := strings.Split(strings.Trim(strings.TrimPrefix(r.URL.Path, prefix), "/"), "/")
		if len(s) != 1 || (s[0] != "authorize" && s[0] != "token" && s[0] != "revoke") {
			w.WriteHeader(http.StatusNotFound)
			return
		}

		
		store := a.store.Copy()
		defer store.Close()

		
		state := &state{
			request: r,
			writer:  w,
			store:   store,
			tracer:  tracer,
		}

		
		switch s[0] {
		case "authorize":
			a.authorizationEndpoint(state)
		case "token":
			a.tokenEndpoint(state)
		case "revoke":
			a.revocationEndpoint(state)
		}
	})
}
func ( a * Authenticator ) Endpoint ( prefix string ) http . Handler { return http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) { // create tracer tracer := fire . NewTracerFromRequest ( r , " " ) tracer . Tag ( " " , prefix ) defer tracer . Finish ( true ) // continue any previous aborts defer stack . Resume ( func ( err error ) { // directly write oauth2 errors if oauth2Error , ok := err . ( * oauth2 . Error ) ; ok { _ = oauth2 . WriteError ( w , oauth2Error ) return } // set critical error on last span tracer . Tag ( " " , true ) tracer . Log ( " " , err . Error ( ) ) tracer . Log ( " " , stack . Trace ( ) ) // otherwise report critical errors if a . Reporter != nil { a . Reporter ( err ) } // ignore errors caused by writing critical errors _ = oauth2 . WriteError ( w , oauth2 . ServerError ( " " ) ) } ) // trim and split path s := strings . Split ( strings . Trim ( strings . TrimPrefix ( r . URL . Path , prefix ) , " " ) , " " ) if len ( s ) != 1 || ( s [ 0 ] != " " && s [ 0 ] != " " && s [ 0 ] != " " ) { w . WriteHeader ( http . StatusNotFound ) return } // copy store store := a . store . Copy ( ) defer store . Close ( ) // create state := & state { request : r , writer : w , store : store , tracer : tracer , } // call endpoints switch s [ 0 ] { case " " : a . authorizationEndpoint ( state ) case " " : a . tokenEndpoint ( state ) case " " : a . revocationEndpoint ( state ) } } ) }
// Endpoint returns a handler for the common token and authorize endpoint.
Endpoint returns a handler for the common token and authorize endpoint .