in hello.go [99:191]
func main() {
tmpl := template.Must(template.ParseFiles("./index.html"))
// Get project ID from metadata server
project := ""
client := &http.Client{}
req, _ := http.NewRequest("GET", "http://metadata.google.internal/computeMetadata/v1/project/project-id", nil)
req.Header.Set("Metadata-Flavor", "Google")
res, err := client.Do(req)
if err == nil {
defer res.Body.Close()
if res.StatusCode == 200 {
responseBody, err := io.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
project = string(responseBody)
}
}
// Get region from metadata server
region := ""
req, _ = http.NewRequest("GET", "http://metadata.google.internal/computeMetadata/v1/instance/region", nil)
req.Header.Set("Metadata-Flavor", "Google")
res, err = client.Do(req)
if err == nil {
defer res.Body.Close()
if res.StatusCode == 200 {
responseBody, err := io.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
region = regexp.MustCompile(`projects/[^/]*/regions/`).ReplaceAllString(string(responseBody), "")
}
}
if region == "" {
// Fallback: get "zone" from metadata server (running on VM e.g. Cloud Run for Anthos)
req, _ = http.NewRequest("GET", "http://metadata.google.internal/computeMetadata/v1/instance/zone", nil)
req.Header.Set("Metadata-Flavor", "Google")
res, err = client.Do(req)
if err == nil {
defer res.Body.Close()
if res.StatusCode == 200 {
responseBody, err := io.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
region = regexp.MustCompile(`projects/[^/]*/zones/`).ReplaceAllString(string(responseBody), "")
}
}
}
service := os.Getenv("K_SERVICE")
revision := os.Getenv("K_REVISION")
color := os.Getenv("COLOR")
data := Data{
Service: service,
Revision: revision,
Project: project,
Region: region,
Color: color,
}
eventsHandler := getEventsHandler()
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodPost && r.Header.Get("ce-type") != "" {
// Handle cloud events.
eventsHandler.ServeHTTP(w, r)
return
}
// Default handler (hello page).
data.AuthenticatedEmail = r.Header.Get("X-Goog-Authenticated-User-Email") // set when behind IAP
tmpl.Execute(w, data)
})
http.HandleFunc("/robots.txt", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "User-agent: *\nDisallow: /\n")
})
fs := http.FileServer(http.Dir("./assets"))
http.Handle("/assets/", http.StripPrefix("/assets/", fs))
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
address := fmt.Sprintf(":%s", port)
log.Printf("Hello from Cloud Run! The container started successfully and is listening for HTTP requests on port %s", port)
log.Fatal(http.ListenAndServe(address, nil))
}