aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/google.golang.org/appengine/remote_api/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/google.golang.org/appengine/remote_api/client.go')
-rw-r--r--vendor/google.golang.org/appengine/remote_api/client.go60
1 files changed, 40 insertions, 20 deletions
diff --git a/vendor/google.golang.org/appengine/remote_api/client.go b/vendor/google.golang.org/appengine/remote_api/client.go
index dbe219d..ce8aab5 100644
--- a/vendor/google.golang.org/appengine/remote_api/client.go
+++ b/vendor/google.golang.org/appengine/remote_api/client.go
@@ -27,16 +27,24 @@ import (
pb "google.golang.org/appengine/internal/remote_api"
)
-// NewRemoteContext returns a context that gives access to the production
-// APIs for the application at the given host. All communication will be
-// performed over SSL unless the host is localhost.
-func NewRemoteContext(host string, client *http.Client) (context.Context, error) {
+// Client is a connection to the production APIs for an application.
+type Client struct {
+ hc *http.Client
+ url string
+ appID string
+}
+
+// NewClient returns a client for the given host. All communication will
+// be performed over SSL unless the host is localhost.
+func NewClient(host string, client *http.Client) (*Client, error) {
// Add an appcfg header to outgoing requests.
+ wrapClient := new(http.Client)
+ *wrapClient = *client
t := client.Transport
if t == nil {
t = http.DefaultTransport
}
- client.Transport = &headerAddingRoundTripper{t}
+ wrapClient.Transport = &headerAddingRoundTripper{t}
url := url.URL{
Scheme: "https",
@@ -47,23 +55,35 @@ func NewRemoteContext(host string, client *http.Client) (context.Context, error)
url.Scheme = "http"
}
u := url.String()
- appID, err := getAppID(client, u)
+ appID, err := getAppID(wrapClient, u)
if err != nil {
return nil, fmt.Errorf("unable to contact server: %v", err)
}
- rc := &remoteContext{
- client: client,
- url: u,
- }
- ctx := internal.WithCallOverride(context.Background(), rc.call)
- ctx = internal.WithLogOverride(ctx, rc.logf)
- ctx = internal.WithAppIDOverride(ctx, appID)
- return ctx, nil
+ return &Client{
+ hc: wrapClient,
+ url: u,
+ appID: appID,
+ }, nil
}
-type remoteContext struct {
- client *http.Client
- url string
+// NewContext returns a copy of parent that will cause App Engine API
+// calls to be sent to the client's remote host.
+func (c *Client) NewContext(parent context.Context) context.Context {
+ ctx := internal.WithCallOverride(parent, c.call)
+ ctx = internal.WithLogOverride(ctx, c.logf)
+ ctx = internal.WithAppIDOverride(ctx, c.appID)
+ return ctx
+}
+
+// NewRemoteContext returns a context that gives access to the production
+// APIs for the application at the given host. All communication will be
+// performed over SSL unless the host is localhost.
+func NewRemoteContext(host string, client *http.Client) (context.Context, error) {
+ c, err := NewClient(host, client)
+ if err != nil {
+ return nil, err
+ }
+ return c.NewContext(context.Background()), nil
}
var logLevels = map[int64]string{
@@ -74,11 +94,11 @@ var logLevels = map[int64]string{
4: "CRITICAL",
}
-func (c *remoteContext) logf(level int64, format string, args ...interface{}) {
+func (c *Client) logf(level int64, format string, args ...interface{}) {
log.Printf(logLevels[level]+": "+format, args...)
}
-func (c *remoteContext) call(ctx context.Context, service, method string, in, out proto.Message) error {
+func (c *Client) call(ctx context.Context, service, method string, in, out proto.Message) error {
req, err := proto.Marshal(in)
if err != nil {
return fmt.Errorf("error marshalling request: %v", err)
@@ -97,7 +117,7 @@ func (c *remoteContext) call(ctx context.Context, service, method string, in, ou
}
// TODO(djd): Respect ctx.Deadline()?
- resp, err := c.client.Post(c.url, "application/octet-stream", bytes.NewReader(req))
+ resp, err := c.hc.Post(c.url, "application/octet-stream", bytes.NewReader(req))
if err != nil {
return fmt.Errorf("error sending request: %v", err)
}