From f9ef9d242c4d1de392269379598d2a05109d44ad Mon Sep 17 00:00:00 2001 From: bnewbold Date: Sun, 22 Apr 2012 22:44:08 -0400 Subject: http serving first steps --- serve.go | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 serve.go (limited to 'serve.go') diff --git a/serve.go b/serve.go new file mode 100644 index 0000000..dff2006 --- /dev/null +++ b/serve.go @@ -0,0 +1,68 @@ +package main + +import ( + "fmt" + "html/template" + "log" + "net/http" + "regexp" +) + +var ( + tmplHome, tmplView *template.Template +) + +func baseHandler(w http.ResponseWriter, r *http.Request) { + var err error + log.Printf("serving %s\n", r.URL.Path) + + bomUrlPattern := regexp.MustCompile("^/([a-zA-Z][a-zA-Z0-9_]*)/([a-zA-Z][a-zA-Z0-9_]*)/(.*)$") + userUrlPattern := regexp.MustCompile("^/([a-zA-Z][a-zA-Z0-9_]*)/$") + + switch { + case r.URL.Path == "/": + err = tmplHome.Execute(w, nil) + case bomUrlPattern.MatchString(r.URL.Path): + match := bomUrlPattern.FindStringSubmatch(r.URL.Path) + bomController(w, r, match[1], match[2], match[3]) + case userUrlPattern.MatchString(r.URL.Path): + match := userUrlPattern.FindStringSubmatch(r.URL.Path) + fmt.Fprintf(w, "will show BOM list here for user %s", match[1]) + default: + // 404 + log.Println("warning: 404") + http.NotFound(w, r) + return + } + if err != nil { + // this could cause multiple responses? + http.Error(w, "Internal error (check logs)", 500) + log.Println("error, 500: " + err.Error()) + } +} + +func bomController(w http.ResponseWriter, r *http.Request, user, name, extra string) { + fmt.Fprintf(w, "will show BOM %s/%s here?", user, name) +} + +func serveCmd() { + var err error + + // load and parse templates + tmplHome = template.Must(template.ParseFiles(*templatePath + "/home.html")) + tmplView = template.Must(template.ParseFiles(*templatePath + "/view.html")) + if err != nil { + log.Fatal(err) + } + + // serve template static assets (images, CSS, JS) + http.Handle("/static/", http.FileServer(http.Dir(*templatePath+"/"))) + http.Handle("/favicon.ico", http.FileServer(http.Dir(*templatePath+"/static/"))) + + // fall through to default handler + http.HandleFunc("/", baseHandler) + + listenString := fmt.Sprintf("%s:%d", *listenHost, *listenPort) + http.ListenAndServe(listenString, nil) + fmt.Println("Serving at " + listenString) +} -- cgit v1.2.3