OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package gae | |
6 | |
7 import ( | |
8 "time" | |
9 | |
10 "golang.org/x/net/context" | |
11 ) | |
12 | |
13 // GlobalInfo is the interface for all of the package methods which normally | |
14 // would be in the 'appengine' package. | |
15 type GlobalInfo interface { | |
16 AppID() string | |
17 Datacenter() string | |
18 DefaultVersionHostname() string | |
19 InstanceID() string | |
20 IsDevAppServer() bool | |
21 IsOverQuota(err error) bool | |
22 IsTimeoutError(err error) bool | |
23 ModuleHostname(module, version, instance string) (string, error) | |
24 ModuleName() string | |
25 RequestID() string | |
26 ServerSoftware() string | |
27 ServiceAccount() (string, error) | |
28 VersionID() string | |
29 | |
30 Namespace(namespace string) (context.Context, error) | |
31 | |
32 AccessToken(scopes ...string) (token string, expiry time.Time, err error
) | |
33 PublicCertificates() ([]GICertificate, error) | |
34 SignBytes(bytes []byte) (keyName string, signature []byte, err error) | |
35 } | |
36 | |
37 // GIFactory is the function signature for factory methods compatible with | |
38 // SetGIFactory. | |
39 type GIFactory func(context.Context) GlobalInfo | |
40 | |
41 // GIFilter is the function signature for a filter GI implementation. It | |
42 // gets the current GI implementation, and returns a new GI implementation | |
43 // backed by the one passed in. | |
44 type GIFilter func(context.Context, GlobalInfo) GlobalInfo | |
45 | |
46 // GetGIUnfiltered gets gets the GlobalInfo implementation from context without | |
47 // any of the filters applied. | |
48 func GetGIUnfiltered(c context.Context) GlobalInfo { | |
49 if f, ok := c.Value(globalInfoKey).(GIFactory); ok && f != nil { | |
50 return f(c) | |
51 } | |
52 return nil | |
53 } | |
54 | |
55 // GetGI gets gets the GlobalInfo implementation from context. | |
56 func GetGI(c context.Context) GlobalInfo { | |
57 ret := GetGIUnfiltered(c) | |
58 if ret == nil { | |
59 return nil | |
60 } | |
61 for _, f := range getCurGIFilters(c) { | |
62 ret = f(c, ret) | |
63 } | |
64 return ret | |
65 } | |
66 | |
67 // SetGIFactory sets the function to produce GlobalInfo instances, as returned | |
68 // by the GetGI method. | |
69 func SetGIFactory(c context.Context, gif GIFactory) context.Context { | |
70 return context.WithValue(c, globalInfoKey, gif) | |
71 } | |
72 | |
73 // SetGI sets the current GlobalInfo object in the context. Useful for testing | |
74 // with a quick mock. This is just a shorthand SetGIFactory invocation to set | |
75 // a factory which always returns the same object. | |
76 func SetGI(c context.Context, gi GlobalInfo) context.Context { | |
77 return SetGIFactory(c, func(context.Context) GlobalInfo { return gi }) | |
78 } | |
79 | |
80 func getCurGIFilters(c context.Context) []GIFilter { | |
81 curFiltsI := c.Value(globalInfoFilterKey) | |
82 if curFiltsI != nil { | |
83 return curFiltsI.([]GIFilter) | |
84 } | |
85 return nil | |
86 } | |
87 | |
88 // AddGIFilters adds GlobalInfo filters to the context. | |
89 func AddGIFilters(c context.Context, filts ...GIFilter) context.Context { | |
90 if len(filts) == 0 { | |
91 return c | |
92 } | |
93 cur := getCurGIFilters(c) | |
94 newFilts := make([]GIFilter, 0, len(cur)+len(filts)) | |
95 newFilts = append(newFilts, getCurGIFilters(c)...) | |
96 newFilts = append(newFilts, filts...) | |
97 return context.WithValue(c, globalInfoFilterKey, newFilts) | |
98 } | |
OLD | NEW |