func (c *controllerAPI) appLookup(handler httphelper.HandlerFunc) httphelper.HandlerFunc { return func(ctx context.Context, w http.ResponseWriter, req *http.Request) { params, _ := ctxhelper.ParamsFromContext(ctx) data, err := c.appRepo.Get(params.ByName("apps_id")) if err != nil { respondWithError(w, err) return } ctx = context.WithValue(ctx, "app", data.(*ct.App)) handler(ctx, w, req) } }
func (api *API) WrapHandler(handler httphelper.HandlerFunc) httprouter.Handle { return func(w http.ResponseWriter, req *http.Request, params httprouter.Params) { ctx := w.(*httphelper.ResponseWriter).Context() log, _ := ctxhelper.LoggerFromContext(ctx) ctx = ctxhelper.NewContextParams(ctx, params) s, err := api.conf.SessionStore.Get(req, "session") if err != nil { log.Error(err.Error()) } ctx = context.WithValue(ctx, ctxSessionKey, s) handler.ServeHTTP(ctx, w, req) } }
func (i *Installer) azureClient(creds *Credential) *azure.Client { var azureJSONOAuthClient *http.Client var azureXMLOAuthClient *http.Client for _, oc := range creds.OAuthCreds { ctx := context.WithValue(oauth2.NoContext, oauth2.TokenRefreshNotifier, i.azureTokenRefreshHandler(oc.ClientID, oc.Scope)) token := &oauth2.Token{ AccessToken: oc.AccessToken, RefreshToken: oc.RefreshToken, Expiry: *oc.ExpiresAt, } switch oc.Scope { case azure.JSONAPIResource: azureJSONOAuthClient = azure.OAuth2Config(oc.ClientID, creds.Endpoint, oc.Scope).Client(ctx, token) case azure.XMLAPIResource: azureXMLOAuthClient = azure.OAuth2Config(oc.ClientID, creds.Endpoint, oc.Scope).Client(ctx, token) } } return azure.NewClient(azureJSONOAuthClient, azureXMLOAuthClient) }
func TestExchangeRequest_NonBasicAuth(t *testing.T) { tr := &mockTransport{ rt: func(r *http.Request) (w *http.Response, err error) { headerAuth := r.Header.Get("Authorization") if headerAuth != "" { t.Errorf("Unexpected authorization header, %v is found.", headerAuth) } return nil, errors.New("no response") }, } c := &http.Client{Transport: tr} conf := &Config{ ClientID: "CLIENT_ID", Endpoint: Endpoint{ AuthURL: "https://accounts.google.com/auth", TokenURL: "https://accounts.google.com/token", }, } ctx := context.WithValue(context.Background(), HTTPClient, c) conf.Exchange(ctx, "code") }
func (app *App) configureRedis(configuration *configuration.Configuration) { if configuration.Redis.Addr == "" { ctxu.GetLogger(app).Infof("redis not configured") return } pool := &redis.Pool{ Dial: func() (redis.Conn, error) { // TODO(stevvooe): Yet another use case for contextual timing. ctx := context.WithValue(app, "redis.connect.startedat", time.Now()) done := func(err error) { logger := ctxu.GetLoggerWithField(ctx, "redis.connect.duration", ctxu.Since(ctx, "redis.connect.startedat")) if err != nil { logger.Errorf("redis: error connecting: %v", err) } else { logger.Infof("redis: connect %v", configuration.Redis.Addr) } } conn, err := redis.DialTimeout("tcp", configuration.Redis.Addr, configuration.Redis.DialTimeout, configuration.Redis.ReadTimeout, configuration.Redis.WriteTimeout) if err != nil { ctxu.GetLogger(app).Errorf("error connecting to redis instance %s: %v", configuration.Redis.Addr, err) done(err) return nil, err } // authorize the connection if configuration.Redis.Password != "" { if _, err = conn.Do("AUTH", configuration.Redis.Password); err != nil { defer conn.Close() done(err) return nil, err } } // select the database to use if configuration.Redis.DB != 0 { if _, err = conn.Do("SELECT", configuration.Redis.DB); err != nil { defer conn.Close() done(err) return nil, err } } done(nil) return conn, nil }, MaxIdle: configuration.Redis.Pool.MaxIdle, MaxActive: configuration.Redis.Pool.MaxActive, IdleTimeout: configuration.Redis.Pool.IdleTimeout, TestOnBorrow: func(c redis.Conn, t time.Time) error { // TODO(stevvooe): We can probably do something more interesting // here with the health package. _, err := c.Do("PING") return err }, Wait: false, // if a connection is not avialable, proceed without cache. } app.redis = pool // setup expvar registry := expvar.Get("registry") if registry == nil { registry = expvar.NewMap("registry") } registry.(*expvar.Map).Set("redis", expvar.Func(func() interface{} { return map[string]interface{}{ "Config": configuration.Redis, "Active": app.redis.ActiveCount(), } })) }
// NewContextStartTime creates a new context that carries the provided start // time. func NewContextStartTime(ctx context.Context, start time.Time) context.Context { return context.WithValue(ctx, ctxKeyStartTime, start) }
// NewContextRequestID creates a new context that carries the provided request // ID value. func NewContextRequestID(ctx context.Context, id string) context.Context { return context.WithValue(ctx, ctxKeyReqID, id) }
// NewContextParams creates a new context that carries the provided params // value. func NewContextParams(ctx context.Context, params httprouter.Params) context.Context { return context.WithValue(ctx, ctxKeyParams, params) }
// NewContextLogger creates a new context that carries the provided logger // value. func NewContextLogger(ctx context.Context, logger log.Logger) context.Context { return context.WithValue(ctx, ctxKeyLogger, logger) }
// NewContextComponentName creates a new context that carries the provided // componentName value. func NewContextComponentName(ctx context.Context, componentName string) context.Context { return context.WithValue(ctx, ctxKeyComponent, componentName) }
// WithValue returns a copy of parent in which the value associated with key is // val. Use context Values only for request-scoped data that transits processes // and APIs, not for passing optional parameters to functions. func WithValue(parent Context, key, val interface{}) Context { return context.WithValue(parent, key, val) }