| OLD | NEW |
| 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package main | 5 package main |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "flag" | 8 "flag" |
| 9 "fmt" | 9 "fmt" |
| 10 "io/ioutil" | 10 "io/ioutil" |
| 11 "net/http" | 11 "net/http" |
| 12 "os" | 12 "os" |
| 13 "path" | 13 "path" |
| 14 "path/filepath" | 14 "path/filepath" |
| 15 "strings" | 15 "strings" |
| 16 ) | 16 ) |
| 17 | 17 |
| 18 var verbose bool = false; |
| 19 |
| 18 type skyHandlerRoot struct { | 20 type skyHandlerRoot struct { |
| 19 root string | 21 root string |
| 20 } | 22 } |
| 21 | 23 |
| 22 func skyHandler(root string) http.Handler { | 24 func skyHandler(root string) http.Handler { |
| 23 return &skyHandlerRoot{root} | 25 return &skyHandlerRoot{root} |
| 24 } | 26 } |
| 25 | 27 |
| 26 func (handler *skyHandlerRoot) ServeHTTP(w http.ResponseWriter, r *http.Request)
{ | 28 func (handler *skyHandlerRoot) ServeHTTP(w http.ResponseWriter, r *http.Request)
{ |
| 27 if strings.HasPrefix(r.URL.Path, "/.git") { | 29 if strings.HasPrefix(r.URL.Path, "/.git") { |
| 28 w.WriteHeader(http.StatusNotFound) | 30 w.WriteHeader(http.StatusNotFound) |
| 29 return | 31 return |
| 30 } | 32 } |
| 31 path := path.Join(handler.root, r.URL.Path) | 33 path := path.Join(handler.root, r.URL.Path) |
| 34 |
| 35 // Remove this one once .sky files are gone: |
| 32 if strings.HasSuffix(path, ".sky") { | 36 if strings.HasSuffix(path, ".sky") { |
| 33 w.Header().Set("Content-Type", "text/sky") | 37 w.Header().Set("Content-Type", "text/sky") |
| 34 } | 38 } |
| 39 |
| 40 if strings.HasSuffix(path, ".dart") { |
| 41 w.Header().Set("Content-Type", "application/dart") |
| 42 } |
| 35 w.Header().Set("Cache-Control", "no-cache") | 43 w.Header().Set("Cache-Control", "no-cache") |
| 36 http.ServeFile(w, r, path) | 44 http.ServeFile(w, r, path) |
| 37 } | 45 } |
| 38 | 46 |
| 39 func usage() { | 47 func usage() { |
| 40 » fmt.Fprintf(os.Stderr, "Usage: sky_server [flags] MOJO_SRC_ROOT PORT\n\n
") | 48 » fmt.Fprintf(os.Stderr, "Usage: sky_server [flags] MOJO_SRC_ROOT PACKAGE_
ROOT\n") |
| 41 » fmt.Fprintf(os.Stderr, "launches a basic http server with mappings into
the\n") | 49 » fmt.Fprintf(os.Stderr, "Launches a basic http server with mappings into
the mojo repository for framework/service paths.\n") |
| 42 » fmt.Fprintf(os.Stderr, "mojo repository for framework/service paths.\n") | 50 » fmt.Fprintf(os.Stderr, "MOJO_SRC_ROOT must be the root of the Mojo repos
itory.\n") |
| 43 » fmt.Fprintf(os.Stderr, "[flags] MUST be before arguments, because go:fla
g.\n\n") | 51 » fmt.Fprintf(os.Stderr, "PACKAGE_ROOT must be the root of your Dart packa
ges (e.g. out/Debug/gen/dart-pkg/packages/).\n") |
| 44 flag.PrintDefaults() | 52 flag.PrintDefaults() |
| 45 os.Exit(2) | 53 os.Exit(2) |
| 46 } | 54 } |
| 47 | 55 |
| 48 func addMapping(from_path string, to_path string) { | 56 func addMapping(from_path string, to_path string) { |
| 49 » // Print to stderr to it's more obvious what this binary does. | 57 » if (verbose) { |
| 50 » fmt.Fprintf(os.Stderr, " %s -> %s\n", from_path, to_path) | 58 » » fmt.Fprintf(os.Stderr, " %s -> %s\n", from_path, to_path) |
| 59 » } |
| 51 http.Handle(from_path, http.StripPrefix(from_path, skyHandler(to_path))) | 60 http.Handle(from_path, http.StripPrefix(from_path, skyHandler(to_path))) |
| 52 } | 61 } |
| 53 | 62 |
| 54 func main() { | 63 func setupMappings(mojoRoot string, packageRoot string, port int) { |
| 55 » var configuration = flag.String("t", "Release", "The target configuratio
n (i.e. Release or Debug)") | 64 » if (verbose) { |
| 65 » » fmt.Fprintf(os.Stderr, "Mappings for localhost:%v:\n", port) |
| 66 » » fmt.Fprintf(os.Stderr, " / -> %s\n", mojoRoot) |
| 67 » } |
| 68 » http.Handle("/", skyHandler(mojoRoot)) |
| 56 | 69 |
| 57 » flag.Parse() | 70 » if (verbose) { |
| 58 » flag.Usage = usage | 71 » » fmt.Fprintf(os.Stderr, " /echo_post -> custom echo handler\n") |
| 59 » // The built-in go:flag is awful. It only allows short-name arguments | |
| 60 » // and they *must* be before any unnamed arguments. There are better on
es: | |
| 61 » // https://godoc.org/github.com/jessevdk/go-flags | |
| 62 » // but for now we're using raw-go. | |
| 63 » if flag.NArg() != 3 { | |
| 64 » » usage() | |
| 65 } | 72 } |
| 66 | |
| 67 root, _ := filepath.Abs(flag.Arg(0)) | |
| 68 port := flag.Arg(1) | |
| 69 packageRoot := flag.Arg(2) | |
| 70 | |
| 71 // genRoot should not be needed once we figure out how mojom generation | |
| 72 // for sdk users should work. | |
| 73 genRoot := path.Join(root, "out", *configuration, "gen") | |
| 74 | |
| 75 fmt.Fprintf(os.Stderr, "Mappings for localhost:%s:\n", port) | |
| 76 | |
| 77 fmt.Fprintf(os.Stderr, " / -> %s\n", root) | |
| 78 http.Handle("/", skyHandler(root)) | |
| 79 | |
| 80 fmt.Fprintf(os.Stderr, " /echo_post -> custom echo handler\n") | |
| 81 http.HandleFunc("/echo_post", func(w http.ResponseWriter, r *http.Reques
t) { | 73 http.HandleFunc("/echo_post", func(w http.ResponseWriter, r *http.Reques
t) { |
| 82 defer r.Body.Close() | 74 defer r.Body.Close() |
| 83 body, _ := ioutil.ReadAll(r.Body) | 75 body, _ := ioutil.ReadAll(r.Body) |
| 84 w.Write(body) | 76 w.Write(body) |
| 85 }) | 77 }) |
| 86 | 78 |
| 87 addMapping("/gen/", genRoot) | |
| 88 addMapping("/packages/", packageRoot) | 79 addMapping("/packages/", packageRoot) |
| 80 } |
| 89 | 81 |
| 90 » http.ListenAndServe(":"+port, nil) | 82 func main() { |
| 83 » var portPtr = flag.Int("p", 8000, "The HTTP port") |
| 84 » var verbosePtr = flag.Bool("v", false, "Verbose mode. Without this flag,
the default behaviour only reports errors.") |
| 85 » flag.Parse() |
| 86 » flag.Usage = usage |
| 87 » if flag.NArg() != 2 { |
| 88 » » usage() |
| 89 » } |
| 90 |
| 91 » var port int = *portPtr; |
| 92 » verbose = *verbosePtr; |
| 93 |
| 94 » root, _ := filepath.Abs(flag.Arg(0)) |
| 95 » packageRoot := flag.Arg(1) |
| 96 |
| 97 » setupMappings(root, packageRoot, port); |
| 98 |
| 99 » http.ListenAndServe(fmt.Sprintf(":%v", port), nil) |
| 91 } | 100 } |
| OLD | NEW |