// Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package main import ( "flag" "fmt" "io/ioutil" "net/http" "os" "path" "path/filepath" "strings" ) type skyHandlerRoot struct { root string } func skyHandler(root string) http.Handler { return &skyHandlerRoot{root} } func (handler *skyHandlerRoot) ServeHTTP(w http.ResponseWriter, r *http.Request) { path := path.Join(handler.root, r.URL.Path) if strings.HasSuffix(path, ".sky") { w.Header().Set("Content-Type", "text/sky") } w.Header().Set("Cache-Control", "no-cache") http.ServeFile(w, r, path) } func usage() { fmt.Fprintf(os.Stderr, "Usage: sky_server [flags] MOJO_SRC_ROOT PORT\n\n") fmt.Fprintf(os.Stderr, "launches a basic http server with mappings into the\n") fmt.Fprintf(os.Stderr, "mojo repository for framework/service paths.\n") fmt.Fprintf(os.Stderr, "[flags] MUST be before arguments, because go:flag.\n\n") flag.PrintDefaults() os.Exit(2) } func addMapping(from_path string, to_path string) { // Print to stderr to it's more obvious what this binary does. fmt.Fprintf(os.Stderr, " %s -> %s\n", from_path, to_path) http.Handle(from_path, http.StripPrefix(from_path, skyHandler(to_path))) } func main() { var configuration = flag.String("t", "Release", "The target configuration (i.e. Release or Debug)") flag.Parse() flag.Usage = usage // The built-in go:flag is awful. It only allows short-name arguments // and they *must* be before any unnamed arguments. There are better ones: // https://godoc.org/github.com/jessevdk/go-flags // but for now we're using raw-go. if flag.NArg() != 3 { usage() } root, _ := filepath.Abs(flag.Arg(0)) port := flag.Arg(1) packageRoot := flag.Arg(2) // genRoot should not be needed once we figure out how mojom generation // for sdk users should work. genRoot := path.Join(root, "out", *configuration, "gen") fmt.Fprintf(os.Stderr, "Mappings for localhost:%s:\n", port) fmt.Fprintf(os.Stderr, " / -> %s\n", root) http.Handle("/", skyHandler(root)) fmt.Fprintf(os.Stderr, " /echo_post -> custom echo handler\n") http.HandleFunc("/echo_post", func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() body, _ := ioutil.ReadAll(r.Body) w.Write(body) }) addMapping("/gen/", genRoot) addMapping("/packages/", packageRoot) http.ListenAndServe(":" + port, nil) }