Index: impl/prod/context.go |
diff --git a/impl/prod/context.go b/impl/prod/context.go |
index b62614891a0425a3fedc9c91bf5c231427d6b55f..73fec355fd739518a432bc310b43ae6acb7344b6 100644 |
--- a/impl/prod/context.go |
+++ b/impl/prod/context.go |
@@ -9,7 +9,9 @@ import ( |
"github.com/luci/gae/service/info" |
"golang.org/x/net/context" |
+ gOAuth "golang.org/x/oauth2/google" |
"google.golang.org/appengine" |
+ "google.golang.org/appengine/remote_api" |
) |
type key int |
@@ -47,6 +49,12 @@ func AEContextNoTxn(c context.Context) context.Context { |
return aeCtx |
} |
+func setupAECtx(c, aeCtx context.Context) context.Context { |
+ c = context.WithValue(c, prodContextKey, aeCtx) |
+ c = context.WithValue(c, prodContextNoTxnKey, aeCtx) |
+ return useMail(useUser(useURLFetch(useRDS(useMC(useTQ(useGI(useLogging(c)))))))) |
+} |
+ |
// Use adds production implementations for all the gae services to the |
// context. |
// |
@@ -64,8 +72,36 @@ func AEContextNoTxn(c context.Context) context.Context { |
// |
// The implementations are all backed by the real appengine SDK functionality, |
func Use(c context.Context, r *http.Request) context.Context { |
- aeCtx := appengine.NewContext(r) |
- c = context.WithValue(c, prodContextKey, aeCtx) |
- c = context.WithValue(c, prodContextNoTxnKey, aeCtx) |
- return useMail(useUser(useURLFetch(useRDS(useMC(useTQ(useGI(useLogging(c)))))))) |
+ return setupAECtx(c, appengine.NewContext(r)) |
+} |
+ |
+// UseRemote is the same as Use, except that it lets you attach a context to |
+// a remote host using the Remote API feature. See the docs for the |
+// prerequisites. |
+// |
+// docs: https://cloud.google.com/appengine/docs/go/tools/remoteapi |
+// |
+// If client is nil, this will use a default Google OAuth2 client. Otherwise the |
+// client must be configured to have the following OAuth2 scopes: |
+// "https://www.googleapis.com/auth/appengine.apis" |
+// "https://www.googleapis.com/auth/userinfo.email" |
+// "https://www.googleapis.com/auth/cloud.platform" |
+func UseRemote(c context.Context, host string, client *http.Client) (context.Context, error) { |
+ err := error(nil) |
+ if client == nil { |
+ client, err = gOAuth.DefaultClient(context.Background(), |
+ "https://www.googleapis.com/auth/appengine.apis", |
+ "https://www.googleapis.com/auth/userinfo.email", |
+ "https://www.googleapis.com/auth/cloud.platform", |
+ ) |
+ if err != nil { |
+ return nil, err |
+ } |
+ } |
+ |
+ aeCtx, err := remote_api.NewRemoteContext(host, client) |
+ if err != nil { |
+ return nil, err |
+ } |
+ return setupAECtx(c, aeCtx), nil |
} |