forked from suzmue/gophercon
-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.go
109 lines (97 loc) · 2.24 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main
import (
"context"
"fmt"
"gophercon/bar"
"gophercon/beach"
"gophercon/capitol"
"gophercon/cliffs"
"gophercon/garden"
"gophercon/gym"
"gophercon/jungle"
"gophercon/port"
"gophercon/volcano"
"html/template"
"io/ioutil"
"log"
"net/http"
"path/filepath"
"strings"
)
func main() {
http.HandleFunc("/", handler)
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static"))))
addr := "1234"
fmt.Printf("Listening on port %s\n", addr)
log.Fatal(http.ListenAndServe(":"+addr, nil))
}
// Page represents an HTML page.
type Page struct {
Body template.HTML
}
func handler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
r.URL.Path = "/home"
}
title := strings.TrimPrefix(r.URL.Path, "/")
if strings.HasPrefix(title, "run") {
go run(strings.TrimPrefix(title, "run/"))
return
}
p, err := loadPage(title)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
tmpl := template.Must(template.New("view").Parse(`<div>{{.Body}}</div>`))
if err := tmpl.Execute(w, p); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
var cancel context.CancelFunc
func run(title string) {
if cancel != nil {
cancel()
}
var ctx context.Context
ctx, cancel = context.WithCancel(context.Background())
switch title {
case "bar":
bar.Bar(ctx)
case "beach":
beach.Beach(ctx)
case "capitol":
capitol.Capitol(ctx)
case "cliffs":
cliffs.Cliffs(ctx)
case "gym":
gym.Gym(ctx)
case "garden":
garden.Garden(ctx)
case "jungle":
jungle.Jungle(ctx)
case "port":
port.Port(ctx)
case "volcano":
volcano.Volcano(ctx)
}
}
func loadPage(title string) (*Page, error) {
file := title + ".html"
body, err := ioutil.ReadFile(filepath.Join("static", file))
if err != nil {
return nil, err
}
body = append(body, fmt.Sprintf(`<script>
var anHttpRequest = new XMLHttpRequest();
anHttpRequest.onreadystatechange = function() {
if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200)
aCallback(anHttpRequest.responseText);
}
anHttpRequest.open( "GET", "http://localhost:1234/run/%s", true );
anHttpRequest.send( null );
</script>
`, title)...)
tmp := template.HTML(body)
return &Page{Body: tmp}, nil
}