| Index: go/src/infra/gae/libs/gae/filters/count/gi.go
 | 
| diff --git a/go/src/infra/gae/libs/gae/filters/count/gi.go b/go/src/infra/gae/libs/gae/filters/count/gi.go
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..21c48d2d56700e40afb98018b33c4639b15f769c
 | 
| --- /dev/null
 | 
| +++ b/go/src/infra/gae/libs/gae/filters/count/gi.go
 | 
| @@ -0,0 +1,136 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +package count
 | 
| +
 | 
| +import (
 | 
| +	"golang.org/x/net/context"
 | 
| +	"time"
 | 
| +
 | 
| +	"infra/gae/libs/gae"
 | 
| +)
 | 
| +
 | 
| +// GICounter is the counter object for the GlobalInfo service.
 | 
| +type GICounter struct {
 | 
| +	AppID                  Entry
 | 
| +	Datacenter             Entry
 | 
| +	DefaultVersionHostname Entry
 | 
| +	InstanceID             Entry
 | 
| +	IsDevAppServer         Entry
 | 
| +	IsOverQuota            Entry
 | 
| +	IsTimeoutError         Entry
 | 
| +	ModuleHostname         Entry
 | 
| +	ModuleName             Entry
 | 
| +	RequestID              Entry
 | 
| +	ServerSoftware         Entry
 | 
| +	ServiceAccount         Entry
 | 
| +	VersionID              Entry
 | 
| +	Namespace              Entry
 | 
| +	AccessToken            Entry
 | 
| +	PublicCertificates     Entry
 | 
| +	SignBytes              Entry
 | 
| +}
 | 
| +
 | 
| +type giCounter struct {
 | 
| +	c *GICounter
 | 
| +
 | 
| +	gi gae.GlobalInfo
 | 
| +}
 | 
| +
 | 
| +var _ gae.GlobalInfo = (*giCounter)(nil)
 | 
| +
 | 
| +func (g *giCounter) AppID() string {
 | 
| +	g.c.AppID.up()
 | 
| +	return g.gi.AppID()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) Datacenter() string {
 | 
| +	g.c.Datacenter.up()
 | 
| +	return g.gi.Datacenter()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) DefaultVersionHostname() string {
 | 
| +	g.c.DefaultVersionHostname.up()
 | 
| +	return g.gi.DefaultVersionHostname()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) InstanceID() string {
 | 
| +	g.c.InstanceID.up()
 | 
| +	return g.gi.InstanceID()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) IsDevAppServer() bool {
 | 
| +	g.c.IsDevAppServer.up()
 | 
| +	return g.gi.IsDevAppServer()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) IsOverQuota(err error) bool {
 | 
| +	g.c.IsOverQuota.up()
 | 
| +	return g.gi.IsOverQuota(err)
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) IsTimeoutError(err error) bool {
 | 
| +	g.c.IsTimeoutError.up()
 | 
| +	return g.gi.IsTimeoutError(err)
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) ModuleHostname(module, version, instance string) (string, error) {
 | 
| +	ret, err := g.gi.ModuleHostname(module, version, instance)
 | 
| +	return ret, g.c.ModuleHostname.up(err)
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) ModuleName() string {
 | 
| +	g.c.ModuleName.up()
 | 
| +	return g.gi.ModuleName()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) RequestID() string {
 | 
| +	g.c.RequestID.up()
 | 
| +	return g.gi.RequestID()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) ServerSoftware() string {
 | 
| +	g.c.ServerSoftware.up()
 | 
| +	return g.gi.ServerSoftware()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) ServiceAccount() (string, error) {
 | 
| +	ret, err := g.gi.ServiceAccount()
 | 
| +	return ret, g.c.ServiceAccount.up(err)
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) VersionID() string {
 | 
| +	g.c.VersionID.up()
 | 
| +	return g.gi.VersionID()
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) Namespace(namespace string) (context.Context, error) {
 | 
| +	ret, err := g.gi.Namespace(namespace)
 | 
| +	return ret, g.c.Namespace.up(err)
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) AccessToken(scopes ...string) (token string, expiry time.Time, err error) {
 | 
| +	token, expiry, err = g.gi.AccessToken(scopes...)
 | 
| +	g.c.AccessToken.up(err)
 | 
| +	return
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) PublicCertificates() ([]gae.GICertificate, error) {
 | 
| +	ret, err := g.gi.PublicCertificates()
 | 
| +	return ret, g.c.PublicCertificates.up(err)
 | 
| +}
 | 
| +
 | 
| +func (g *giCounter) SignBytes(bytes []byte) (keyName string, signature []byte, err error) {
 | 
| +	keyName, signature, err = g.gi.SignBytes(bytes)
 | 
| +	g.c.SignBytes.up(err)
 | 
| +	return
 | 
| +}
 | 
| +
 | 
| +// FilterGI installs a counter GlobalInfo filter in the context.
 | 
| +func FilterGI(c context.Context) (context.Context, *GICounter) {
 | 
| +	state := &GICounter{}
 | 
| +	return gae.AddGIFilters(c, func(ic context.Context, gi gae.GlobalInfo) gae.GlobalInfo {
 | 
| +		return &giCounter{state, gi}
 | 
| +	}), state
 | 
| +}
 | 
| 
 |