text: // Copyright 2011 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 (
  	"io"
  	"log"
  	"net/http"
  	"net/url"
  	"os"
  	"path/filepath"
  	"runtime"
  )
  
  func Main() {
  	MainPath = filepath.Dir(findMainPath())
  	installHealthChecker(http.DefaultServeMux)
  
  	port := "8080"
  	if s := os.Getenv("PORT"); s != "" {
  		port = s
  	}
  
  	host := ""
  	if IsDevAppServer() {
  		host = "127.0.0.1"
  	}
  	if err := http.ListenAndServe(host+":"+port, http.HandlerFunc(handleHTTP)); err != nil {
  		log.Fatalf("http.ListenAndServe: %v", err)
  	}
  }
  
  // Find the path to package main by looking at the root Caller.
  func findMainPath() string {
  	pc := make([]uintptr, 100)
  	n := runtime.Callers(2, pc)
  	frames := runtime.CallersFrames(pc[:n])
  	for {
  		frame, more := frames.Next()
  		// Tests won't have package main, instead they have testing.tRunner
  		if frame.Function == "main.main" || frame.Function == "testing.tRunner" {
  			return frame.File
  		}
  		if !more {
  			break
  		}
  	}
  	return ""
  }
  
  func installHealthChecker(mux *http.ServeMux) {
  	// If no health check handler has been installed by this point, add a trivial one.
  	const healthPath = "/_ah/health"
  	hreq := &http.Request{
  		Method: "GET",
  		URL: &url.URL{
  			Path: healthPath,
  		},
  	}
  	if _, pat := mux.Handler(hreq); pat != healthPath {
  		mux.HandleFunc(healthPath, func(w http.ResponseWriter, r *http.Request) {
  			io.WriteString(w, "ok")
  		})
  	}
  }
  