731e0b0066
You shouldn't have to import both: github.com/docker/distribution/context golang.org/x/net/context just to use the distribution tools and implement the distribution interfaces. By pulling the Context interface from golang.org/x/net/context into the context package within the distribution project, you no longer have to import both packages. Note: You do not have to change anything anywhere else yet! All current uses of both packages together will still work correctly because the Context interface from either package is identical. I've also made some other minor changes: - Added a RemoteIP function. It's like RemoteAddr but discards the port suffix - Added `.String()` to the response duration context value so that JSON log formatting shows human-parseable duration and not just number of nano-seconds - Added WithMapContext(...) to the context package. This is a useful function so I pulled it out of the main.go in cmd/registry so that it can be used elsewhere. Docker-DCO-1.1-Signed-off-by: Josh Hawn <josh.hawn@docker.com> (github: jlhawn)
33 lines
789 B
Go
33 lines
789 B
Go
package context
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// Since looks up key, which should be a time.Time, and returns the duration
|
|
// since that time. If the key is not found, the value returned will be zero.
|
|
// This is helpful when inferring metrics related to context execution times.
|
|
func Since(ctx Context, key interface{}) time.Duration {
|
|
startedAtI := ctx.Value(key)
|
|
if startedAtI != nil {
|
|
if startedAt, ok := startedAtI.(time.Time); ok {
|
|
return time.Since(startedAt)
|
|
}
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
// GetStringValue returns a string value from the context. The empty string
|
|
// will be returned if not found.
|
|
func GetStringValue(ctx Context, key string) (value string) {
|
|
stringi := ctx.Value(key)
|
|
if stringi != nil {
|
|
if valuev, ok := stringi.(string); ok {
|
|
value = valuev
|
|
}
|
|
}
|
|
|
|
return value
|
|
}
|