| package gateway |
| |
| import ( |
| "fmt" |
| "net/http" |
| "path/filepath" |
| "strings" |
| |
| "github.com/golang/glog" |
| "google.golang.org/grpc" |
| "google.golang.org/grpc/connectivity" |
| ) |
| |
| func swaggerServer(dir string) http.HandlerFunc { |
| return func(w http.ResponseWriter, r *http.Request) { |
| if !strings.HasSuffix(r.URL.Path, ".swagger.json") { |
| glog.Errorf("Not Found: %s", r.URL.Path) |
| http.NotFound(w, r) |
| return |
| } |
| |
| glog.Infof("Serving %s", r.URL.Path) |
| p := strings.TrimPrefix(r.URL.Path, "/swagger/") |
| p = filepath.Join(dir, p) |
| http.ServeFile(w, r, p) |
| } |
| } |
| |
| // allowCORS allows Cross Origin Resoruce Sharing from any origin. |
| // Don't do this without consideration in production systems. |
| func allowCORS(h http.Handler) http.Handler { |
| return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| if origin := r.Header.Get("Origin"); origin != "" { |
| w.Header().Set("Access-Control-Allow-Origin", origin) |
| if r.Method == "OPTIONS" && r.Header.Get("Access-Control-Request-Method") != "" { |
| preflightHandler(w, r) |
| return |
| } |
| } |
| h.ServeHTTP(w, r) |
| }) |
| } |
| |
| func preflightHandler(w http.ResponseWriter, r *http.Request) { |
| headers := []string{"Content-Type", "Accept"} |
| w.Header().Set("Access-Control-Allow-Headers", strings.Join(headers, ",")) |
| methods := []string{"GET", "HEAD", "POST", "PUT", "DELETE"} |
| w.Header().Set("Access-Control-Allow-Methods", strings.Join(methods, ",")) |
| glog.Infof("preflight request for %s", r.URL.Path) |
| } |
| |
| func healthzServer(conn *grpc.ClientConn) http.HandlerFunc { |
| return func(w http.ResponseWriter, r *http.Request) { |
| w.Header().Set("Content-Type", "text/plain") |
| if s := conn.GetState(); s != connectivity.Ready { |
| http.Error(w, fmt.Sprintf("grpc server is %s", s), http.StatusBadGateway) |
| return |
| } |
| fmt.Fprintln(w, "ok") |
| } |
| } |