func aboutPage(w http.ResponseWriter, r *http.Request) { c := appengine.NewContext(r) fmt.Fprintf(w, "<h1>%v</h1>", appengine.DefaultVersionHostname(c)) token, expire, _ := appengine.AccessToken(c, "test") fmt.Fprintf(w, "<p>AccessToken: %v %v", token, expire) fmt.Fprintf(w, "<p>AppID: %v", appengine.AppID(c)) fmt.Fprintf(w, "<p>FQAppID: %v", c.FullyQualifiedAppID()) fmt.Fprintf(w, "<p>Go version: %v", runtime.Version()) fmt.Fprintf(w, "<p>Datacenter: %v", appengine.Datacenter()) fmt.Fprintf(w, "<p>InstanceID: %v", appengine.InstanceID()) fmt.Fprintf(w, "<p>IsDevAppServer: %v", appengine.IsDevAppServer()) fmt.Fprintf(w, "<p>RequestID: %v", appengine.RequestID(c)) fmt.Fprintf(w, "<p>ServerSoftware: %v", appengine.ServerSoftware()) sa, _ := appengine.ServiceAccount(c) fmt.Fprintf(w, "<p>ServiceAccount: %v", sa) keyname, signed, _ := appengine.SignBytes(c, []byte("test")) fmt.Fprintf(w, "<p>SignBytes: %v %v", keyname, signed) fmt.Fprintf(w, "<p>VersionID: %v", appengine.VersionID(c)) fmt.Fprintf(w, "<p>Request: %v", r) r2 := c.Request() fmt.Fprintf(w, "<p>Context Request type/value: %T %v", r2, r2) }
// info generates a page of information useful to the developers func info(w http.ResponseWriter, r *http.Request) { // must do all reading before any writing var data struct { Req *http.Request Body []byte BE error Dctr string GoArch string GoOs string GoVer string VID string Vtime string MaxCx int } data.Req = r data.Body, data.BE = ioutil.ReadAll(r.Body) data.Dctr = appengine.Datacenter() data.GoArch = runtime.GOARCH data.GoOs = runtime.GOOS data.GoVer = runtime.Version() data.VID = appengine.VersionID(appengine.NewContext(r)) data.MaxCx = rx.MaxComplexity var ver int var bigtime int64 fmt.Sscanf(data.VID, "%d.%d", &ver, &bigtime) if strings.HasPrefix(r.Host, "localhost:") { // don't know how to decode this in SDK environment data.Vtime = "?!" } else { // decode VID to match with appengine admin logs t := time.Unix(bigtime>>28, 0) data.Vtime = t.Format("01/02 15:04") } putheader(w, r, "Info") fmt.Fprint(w, "<P>(Information for use of the website maintainers.)\n<P>") fmt.Fprintf(w, "<span class=cg>= cg =</span> \n") // .cg fmt.Fprintf(w, "<span class=cw>= cw =</span> \n") // .cw for i := 0; i < NCOLORS; i++ { fmt.Fprintf(w, "<span class=%s>= %s =</span> \n", colorname(i), colorname(i)) } fmt.Fprintln(w) tInfo.Execute(w, data) putfooter(w, r) }
func Datacenter(_ netcontext.Context) string { return appengine.Datacenter() }