aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/google.golang.org/appengine/remote_api/remote_api.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/google.golang.org/appengine/remote_api/remote_api.go')
-rw-r--r--vendor/google.golang.org/appengine/remote_api/remote_api.go152
1 files changed, 0 insertions, 152 deletions
diff --git a/vendor/google.golang.org/appengine/remote_api/remote_api.go b/vendor/google.golang.org/appengine/remote_api/remote_api.go
deleted file mode 100644
index 3d2880d..0000000
--- a/vendor/google.golang.org/appengine/remote_api/remote_api.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2012 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.
-
-/*
-Package remote_api implements the /_ah/remote_api endpoint.
-This endpoint is used by offline tools such as the bulk loader.
-*/
-package remote_api // import "google.golang.org/appengine/remote_api"
-
-import (
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "strconv"
-
- "github.com/golang/protobuf/proto"
-
- "google.golang.org/appengine"
- "google.golang.org/appengine/internal"
- pb "google.golang.org/appengine/internal/remote_api"
- "google.golang.org/appengine/log"
- "google.golang.org/appengine/user"
-)
-
-func init() {
- http.HandleFunc("/_ah/remote_api", handle)
-}
-
-func handle(w http.ResponseWriter, req *http.Request) {
- c := appengine.NewContext(req)
-
- u := user.Current(c)
- if u == nil {
- u, _ = user.CurrentOAuth(c,
- "https://www.googleapis.com/auth/cloud-platform",
- "https://www.googleapis.com/auth/appengine.apis",
- )
- }
-
- if !appengine.IsDevAppServer() && (u == nil || !u.Admin) {
- w.Header().Set("Content-Type", "text/plain; charset=utf-8")
- w.WriteHeader(http.StatusUnauthorized)
- io.WriteString(w, "You must be logged in as an administrator to access this.\n")
- return
- }
- if req.Header.Get("X-Appcfg-Api-Version") == "" {
- w.Header().Set("Content-Type", "text/plain; charset=utf-8")
- w.WriteHeader(http.StatusForbidden)
- io.WriteString(w, "This request did not contain a necessary header.\n")
- return
- }
-
- if req.Method != "POST" {
- // Response must be YAML.
- rtok := req.FormValue("rtok")
- if rtok == "" {
- rtok = "0"
- }
- w.Header().Set("Content-Type", "text/yaml; charset=utf-8")
- fmt.Fprintf(w, `{app_id: %q, rtok: %q}`, internal.FullyQualifiedAppID(c), rtok)
- return
- }
-
- defer req.Body.Close()
- body, err := ioutil.ReadAll(req.Body)
- if err != nil {
- w.WriteHeader(http.StatusBadRequest)
- log.Errorf(c, "Failed reading body: %v", err)
- return
- }
- remReq := &pb.Request{}
- if err := proto.Unmarshal(body, remReq); err != nil {
- w.WriteHeader(http.StatusBadRequest)
- log.Errorf(c, "Bad body: %v", err)
- return
- }
-
- service, method := *remReq.ServiceName, *remReq.Method
- if !requestSupported(service, method) {
- w.WriteHeader(http.StatusBadRequest)
- log.Errorf(c, "Unsupported RPC /%s.%s", service, method)
- return
- }
-
- rawReq := &rawMessage{remReq.Request}
- rawRes := &rawMessage{}
- err = internal.Call(c, service, method, rawReq, rawRes)
-
- remRes := &pb.Response{}
- if err == nil {
- remRes.Response = rawRes.buf
- } else if ae, ok := err.(*internal.APIError); ok {
- remRes.ApplicationError = &pb.ApplicationError{
- Code: &ae.Code,
- Detail: &ae.Detail,
- }
- } else {
- // This shouldn't normally happen.
- log.Errorf(c, "appengine/remote_api: Unexpected error of type %T: %v", err, err)
- remRes.ApplicationError = &pb.ApplicationError{
- Code: proto.Int32(0),
- Detail: proto.String(err.Error()),
- }
- }
- out, err := proto.Marshal(remRes)
- if err != nil {
- // This should not be possible.
- w.WriteHeader(500)
- log.Errorf(c, "proto.Marshal: %v", err)
- return
- }
-
- log.Infof(c, "Spooling %d bytes of response to /%s.%s", len(out), service, method)
- w.Header().Set("Content-Type", "application/octet-stream")
- w.Header().Set("Content-Length", strconv.Itoa(len(out)))
- w.Write(out)
-}
-
-// rawMessage is a protocol buffer type that is already serialised.
-// This allows the remote_api code here to handle messages
-// without having to know the real type.
-type rawMessage struct {
- buf []byte
-}
-
-func (rm *rawMessage) Marshal() ([]byte, error) {
- return rm.buf, nil
-}
-
-func (rm *rawMessage) Unmarshal(buf []byte) error {
- rm.buf = make([]byte, len(buf))
- copy(rm.buf, buf)
- return nil
-}
-
-func requestSupported(service, method string) bool {
- // This list of supported services is taken from SERVICE_PB_MAP in remote_api_services.py
- switch service {
- case "app_identity_service", "blobstore", "capability_service", "channel", "datastore_v3",
- "datastore_v4", "file", "images", "logservice", "mail", "matcher", "memcache", "remote_datastore",
- "remote_socket", "search", "modules", "system", "taskqueue", "urlfetch", "user", "xmpp":
- return true
- }
- return false
-}
-
-// Methods to satisfy proto.Message.
-func (rm *rawMessage) Reset() { rm.buf = nil }
-func (rm *rawMessage) String() string { return strconv.Quote(string(rm.buf)) }
-func (*rawMessage) ProtoMessage() {}