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 type skyHandlerRoot struct { | 18 type skyHandlerRoot struct { |
19 root string | 19 » root string |
20 } | 20 } |
21 | 21 |
22 func skyHandler(root string) http.Handler { | 22 func skyHandler(root string) http.Handler { |
23 return &skyHandlerRoot{root} | 23 » return &skyHandlerRoot{root} |
24 } | 24 } |
25 | 25 |
26 func (handler *skyHandlerRoot) ServeHTTP(w http.ResponseWriter, r *http.Request)
{ | 26 func (handler *skyHandlerRoot) ServeHTTP(w http.ResponseWriter, r *http.Request)
{ |
27 path := path.Join(handler.root, r.URL.Path) | 27 » if strings.HasPrefix(r.URL.Path, "/.git") { |
28 if strings.HasSuffix(path, ".sky") { | 28 » » w.WriteHeader(http.StatusNotFound) |
29 w.Header().Set("Content-Type", "text/sky") | 29 » » return |
30 } | 30 » } |
31 w.Header().Set("Cache-Control", "no-cache") | 31 » path := path.Join(handler.root, r.URL.Path) |
32 http.ServeFile(w, r, path) | 32 » if strings.HasSuffix(path, ".sky") { |
| 33 » » w.Header().Set("Content-Type", "text/sky") |
| 34 » } |
| 35 » w.Header().Set("Cache-Control", "no-cache") |
| 36 » http.ServeFile(w, r, path) |
33 } | 37 } |
34 | 38 |
35 func usage() { | 39 func usage() { |
36 fmt.Fprintf(os.Stderr, "Usage: sky_server [flags] MOJO_SRC_ROOT PORT\n\n") | 40 » fmt.Fprintf(os.Stderr, "Usage: sky_server [flags] MOJO_SRC_ROOT PORT\n\n
") |
37 fmt.Fprintf(os.Stderr, "launches a basic http server with mappings into the\
n") | 41 » fmt.Fprintf(os.Stderr, "launches a basic http server with mappings into
the\n") |
38 fmt.Fprintf(os.Stderr, "mojo repository for framework/service paths.\n") | 42 » fmt.Fprintf(os.Stderr, "mojo repository for framework/service paths.\n") |
39 fmt.Fprintf(os.Stderr, "[flags] MUST be before arguments, because go:flag.\n
\n") | 43 » fmt.Fprintf(os.Stderr, "[flags] MUST be before arguments, because go:fla
g.\n\n") |
40 flag.PrintDefaults() | 44 » flag.PrintDefaults() |
41 os.Exit(2) | 45 » os.Exit(2) |
42 } | 46 } |
43 | 47 |
44 func addMapping(from_path string, to_path string) { | 48 func addMapping(from_path string, to_path string) { |
45 // Print to stderr to it's more obvious what this binary does. | 49 » // Print to stderr to it's more obvious what this binary does. |
46 fmt.Fprintf(os.Stderr, " %s -> %s\n", from_path, to_path) | 50 » fmt.Fprintf(os.Stderr, " %s -> %s\n", from_path, to_path) |
47 http.Handle(from_path, http.StripPrefix(from_path, skyHandler(to_path))) | 51 » http.Handle(from_path, http.StripPrefix(from_path, skyHandler(to_path))) |
48 } | 52 } |
49 | 53 |
50 func main() { | 54 func main() { |
51 var configuration = flag.String("t", "Release", "The target configuration (i
.e. Release or Debug)") | 55 » var configuration = flag.String("t", "Release", "The target configuratio
n (i.e. Release or Debug)") |
52 | 56 |
53 flag.Parse() | 57 » flag.Parse() |
54 flag.Usage = usage | 58 » flag.Usage = usage |
55 // The built-in go:flag is awful. It only allows short-name arguments | 59 » // The built-in go:flag is awful. It only allows short-name arguments |
56 // and they *must* be before any unnamed arguments. There are better ones: | 60 » // and they *must* be before any unnamed arguments. There are better on
es: |
57 // https://godoc.org/github.com/jessevdk/go-flags | 61 » // https://godoc.org/github.com/jessevdk/go-flags |
58 // but for now we're using raw-go. | 62 » // but for now we're using raw-go. |
59 if flag.NArg() != 3 { | 63 » if flag.NArg() != 3 { |
60 usage() | 64 » » usage() |
61 } | 65 » } |
62 | 66 |
63 root, _ := filepath.Abs(flag.Arg(0)) | 67 » root, _ := filepath.Abs(flag.Arg(0)) |
64 port := flag.Arg(1) | 68 » port := flag.Arg(1) |
65 packageRoot := flag.Arg(2) | 69 » packageRoot := flag.Arg(2) |
66 | 70 |
67 // genRoot should not be needed once we figure out how mojom generation | 71 » // genRoot should not be needed once we figure out how mojom generation |
68 // for sdk users should work. | 72 » // for sdk users should work. |
69 genRoot := path.Join(root, "out", *configuration, "gen") | 73 » genRoot := path.Join(root, "out", *configuration, "gen") |
70 | 74 |
71 fmt.Fprintf(os.Stderr, "Mappings for localhost:%s:\n", port) | 75 » fmt.Fprintf(os.Stderr, "Mappings for localhost:%s:\n", port) |
72 | 76 |
73 fmt.Fprintf(os.Stderr, " / -> %s\n", root) | 77 » fmt.Fprintf(os.Stderr, " / -> %s\n", root) |
74 http.Handle("/", skyHandler(root)) | 78 » http.Handle("/", skyHandler(root)) |
75 | 79 |
76 fmt.Fprintf(os.Stderr, " /echo_post -> custom echo handler\n") | 80 » fmt.Fprintf(os.Stderr, " /echo_post -> custom echo handler\n") |
77 http.HandleFunc("/echo_post", func(w http.ResponseWriter, r *http.Request) { | 81 » http.HandleFunc("/echo_post", func(w http.ResponseWriter, r *http.Reques
t) { |
78 defer r.Body.Close() | 82 » » defer r.Body.Close() |
79 body, _ := ioutil.ReadAll(r.Body) | 83 » » body, _ := ioutil.ReadAll(r.Body) |
80 w.Write(body) | 84 » » w.Write(body) |
81 }) | 85 » }) |
82 | 86 |
83 addMapping("/gen/", genRoot) | 87 » addMapping("/gen/", genRoot) |
84 addMapping("/packages/", packageRoot) | 88 » addMapping("/packages/", packageRoot) |
85 | 89 |
86 http.ListenAndServe(":" + port, nil) | 90 » http.ListenAndServe(":"+port, nil) |
87 } | 91 } |
OLD | NEW |