mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
Output from 'dep status': PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED cloud.google.com/go v0.23.0 v0.23.0 0fd7230 v0.23.0 1 github.com/briandowns/openweathermap ^0.11.0 0.11 1b87579 0.11 1 github.com/gdamore/encoding branch master branch master b23993c b23993c 1 github.com/gdamore/tcell ^1.0.0 v1.0.0 061d51a v1.0.0 2 github.com/go-test/deep ^1.0.1 v1.0.1 6592d9c v1.0.1 1 github.com/golang/protobuf v1.1.0 v1.1.0 b4deda0 v1.1.0 1 github.com/google/go-github branch master branch master 2ae5df7 2ae5df7 1 github.com/google/go-querystring branch master branch master 53e6ce1 53e6ce1 1 github.com/jessevdk/go-flags ^1.4.0 v1.4.0 c6ca198 v1.4.0 1 github.com/lucasb-eyer/go-colorful v1.0 v1.0 345fbb3 v1.0 1 github.com/mattn/go-runewidth v0.0.2 v0.0.2 9e777a8 v0.0.2 1 github.com/olebedev/config branch master branch master 9a10d05 9a10d05 1 github.com/radovskyb/watcher ^1.0.2 v1.0.2 6145e14 v1.0.2 1 github.com/rivo/tview branch master branch master 71ecf1f 71ecf1f 1 github.com/yfronto/newrelic branch master branch master f7fa0c6 f7fa0c6 1 golang.org/x/net branch master branch master 1e49130 1e49130 2 golang.org/x/oauth2 branch master branch master 1e0a3fa 1e0a3fa 5 golang.org/x/text v0.3.0 v0.3.0 f21a4df v0.3.0 5 google.golang.org/api branch master branch master 00e3bb8 00e3bb8 4 google.golang.org/appengine v1.0.0 v1.0.0 150dc57 v1.0.0 10 gopkg.in/yaml.v2 ^2.2.1 v2.2.1 5420a8b v2.2.1 1 See https://golang.github.io/dep/docs/daily-dep.html
160 lines
3.7 KiB
Go
160 lines
3.7 KiB
Go
// Copyright 2015 Google Inc. All rights reserved.
|
|
// Use of this source code is governed by the Apache 2.0
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build appengine
|
|
|
|
package internal
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"appengine"
|
|
"appengine_internal"
|
|
basepb "appengine_internal/base"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
netcontext "golang.org/x/net/context"
|
|
)
|
|
|
|
var contextKey = "holds an appengine.Context"
|
|
|
|
func fromContext(ctx netcontext.Context) appengine.Context {
|
|
c, _ := ctx.Value(&contextKey).(appengine.Context)
|
|
return c
|
|
}
|
|
|
|
// This is only for classic App Engine adapters.
|
|
func ClassicContextFromContext(ctx netcontext.Context) appengine.Context {
|
|
return fromContext(ctx)
|
|
}
|
|
|
|
func withContext(parent netcontext.Context, c appengine.Context) netcontext.Context {
|
|
ctx := netcontext.WithValue(parent, &contextKey, c)
|
|
|
|
s := &basepb.StringProto{}
|
|
c.Call("__go__", "GetNamespace", &basepb.VoidProto{}, s, nil)
|
|
if ns := s.GetValue(); ns != "" {
|
|
ctx = NamespacedContext(ctx, ns)
|
|
}
|
|
|
|
return ctx
|
|
}
|
|
|
|
func IncomingHeaders(ctx netcontext.Context) http.Header {
|
|
if c := fromContext(ctx); c != nil {
|
|
if req, ok := c.Request().(*http.Request); ok {
|
|
return req.Header
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context {
|
|
c := appengine.NewContext(req)
|
|
return withContext(parent, c)
|
|
}
|
|
|
|
type testingContext struct {
|
|
appengine.Context
|
|
|
|
req *http.Request
|
|
}
|
|
|
|
func (t *testingContext) FullyQualifiedAppID() string { return "dev~testcontext" }
|
|
func (t *testingContext) Call(service, method string, _, _ appengine_internal.ProtoMessage, _ *appengine_internal.CallOptions) error {
|
|
if service == "__go__" && method == "GetNamespace" {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("testingContext: unsupported Call")
|
|
}
|
|
func (t *testingContext) Request() interface{} { return t.req }
|
|
|
|
func ContextForTesting(req *http.Request) netcontext.Context {
|
|
return withContext(netcontext.Background(), &testingContext{req: req})
|
|
}
|
|
|
|
func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error {
|
|
if ns := NamespaceFromContext(ctx); ns != "" {
|
|
if fn, ok := NamespaceMods[service]; ok {
|
|
fn(in, ns)
|
|
}
|
|
}
|
|
|
|
if f, ctx, ok := callOverrideFromContext(ctx); ok {
|
|
return f(ctx, service, method, in, out)
|
|
}
|
|
|
|
// Handle already-done contexts quickly.
|
|
select {
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
default:
|
|
}
|
|
|
|
c := fromContext(ctx)
|
|
if c == nil {
|
|
// Give a good error message rather than a panic lower down.
|
|
return errors.New("not an App Engine context")
|
|
}
|
|
|
|
// Apply transaction modifications if we're in a transaction.
|
|
if t := transactionFromContext(ctx); t != nil {
|
|
if t.finished {
|
|
return errors.New("transaction context has expired")
|
|
}
|
|
applyTransaction(in, &t.transaction)
|
|
}
|
|
|
|
var opts *appengine_internal.CallOptions
|
|
if d, ok := ctx.Deadline(); ok {
|
|
opts = &appengine_internal.CallOptions{
|
|
Timeout: d.Sub(time.Now()),
|
|
}
|
|
}
|
|
|
|
err := c.Call(service, method, in, out, opts)
|
|
switch v := err.(type) {
|
|
case *appengine_internal.APIError:
|
|
return &APIError{
|
|
Service: v.Service,
|
|
Detail: v.Detail,
|
|
Code: v.Code,
|
|
}
|
|
case *appengine_internal.CallError:
|
|
return &CallError{
|
|
Detail: v.Detail,
|
|
Code: v.Code,
|
|
Timeout: v.Timeout,
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func handleHTTP(w http.ResponseWriter, r *http.Request) {
|
|
panic("handleHTTP called; this should be impossible")
|
|
}
|
|
|
|
func logf(c appengine.Context, level int64, format string, args ...interface{}) {
|
|
var fn func(format string, args ...interface{})
|
|
switch level {
|
|
case 0:
|
|
fn = c.Debugf
|
|
case 1:
|
|
fn = c.Infof
|
|
case 2:
|
|
fn = c.Warningf
|
|
case 3:
|
|
fn = c.Errorf
|
|
case 4:
|
|
fn = c.Criticalf
|
|
default:
|
|
// This shouldn't happen.
|
|
fn = c.Criticalf
|
|
}
|
|
fn(format, args...)
|
|
}
|