| Index: impl/memory/info.go
|
| diff --git a/impl/memory/info.go b/impl/memory/info.go
|
| index 6d28d5ab45478255432528ab560d1442b1c8b766..432f70195ee82efab6f464cde55b466392c049af 100644
|
| --- a/impl/memory/info.go
|
| +++ b/impl/memory/info.go
|
| @@ -20,23 +20,46 @@ var giContextKey giContextKeyType
|
| // validNamespace matches valid namespace names.
|
| var validNamespace = regexp.MustCompile(`^[0-9A-Za-z._-]{0,100}$`)
|
|
|
| +var defaultGlobalInfoData = globalInfoData{
|
| + // versionID returns X.Y where Y is autogenerated by appengine, and X is
|
| + // whatever's in app.yaml.
|
| + versionID: "testVersionID.1",
|
| + requestID: "test-request-id",
|
| +}
|
| +
|
| +type globalInfoData struct {
|
| + appid string
|
| + namespace string
|
| + versionID string
|
| + requestID string
|
| +}
|
| +
|
| func curGID(c context.Context) *globalInfoData {
|
| - return c.Value(giContextKey).(*globalInfoData)
|
| + if gid, ok := c.Value(giContextKey).(*globalInfoData); ok {
|
| + return gid
|
| + }
|
| + return &defaultGlobalInfoData
|
| +}
|
| +
|
| +func useGID(c context.Context, f func(mod *globalInfoData)) context.Context {
|
| + cur := curGID(c)
|
| + if cur == nil {
|
| + cur = &defaultGlobalInfoData
|
| + }
|
| +
|
| + clone := *cur
|
| + f(&clone)
|
| + return context.WithValue(c, giContextKey, &clone)
|
| }
|
|
|
| // useGI adds a gae.GlobalInfo context, accessible
|
| // by gae.GetGI(c)
|
| -func useGI(c context.Context, appID string) context.Context {
|
| +func useGI(c context.Context) context.Context {
|
| return info.SetFactory(c, func(ic context.Context) info.Interface {
|
| return &giImpl{dummy.Info(), curGID(ic), ic}
|
| })
|
| }
|
|
|
| -type globalInfoData struct {
|
| - appid string
|
| - namespace string
|
| -}
|
| -
|
| type giImpl struct {
|
| info.Interface
|
| *globalInfoData
|
| @@ -53,7 +76,10 @@ func (gi *giImpl) Namespace(ns string) (ret context.Context, err error) {
|
| if !validNamespace.MatchString(ns) {
|
| return nil, fmt.Errorf("appengine: namespace %q does not match /%s/", ns, validNamespace)
|
| }
|
| - return context.WithValue(gi.c, giContextKey, &globalInfoData{gi.appid, ns}), nil
|
| +
|
| + return useGID(gi.c, func(mod *globalInfoData) {
|
| + mod.namespace = ns
|
| + }), nil
|
| }
|
|
|
| func (gi *giImpl) MustNamespace(ns string) context.Context {
|
| @@ -77,7 +103,25 @@ func (gi *giImpl) IsDevAppServer() bool {
|
| }
|
|
|
| func (gi *giImpl) VersionID() string {
|
| - // VersionID returns X.Y where Y is autogenerated by appengine, and X is
|
| - // whatever's in app.yaml.
|
| - return "testVersionID.1"
|
| + return curGID(gi.c).versionID
|
| +}
|
| +
|
| +func (gi *giImpl) RequestID() string {
|
| + return curGID(gi.c).requestID
|
| +}
|
| +
|
| +func (gi *giImpl) Testable() info.Testable {
|
| + return gi
|
| +}
|
| +
|
| +func (gi *giImpl) SetVersionID(v string) context.Context {
|
| + return useGID(gi.c, func(mod *globalInfoData) {
|
| + mod.versionID = v
|
| + })
|
| +}
|
| +
|
| +func (gi *giImpl) SetRequestID(v string) context.Context {
|
| + return useGID(gi.c, func(mod *globalInfoData) {
|
| + mod.requestID = v
|
| + })
|
| }
|
|
|