From 29b860470bfe69fb66730847ff2b1cbf274a08ec Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Sun, 28 Jun 2020 00:28:22 +0100 Subject: [PATCH] basic server --- main.go | 5 +++- server/handlers.go | 23 +++++++++++++++ server/server.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 server/handlers.go create mode 100644 server/server.go diff --git a/main.go b/main.go index e6486e3..9351892 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,8 @@ package main import ( "github.com/nkanaev/yarr/storage" - "github.com/nkanaev/yarr/worker" + //"github.com/nkanaev/yarr/worker" + "github.com/nkanaev/yarr/server" "log" ) @@ -72,4 +73,6 @@ func main() { log.Print(worker.FindFeeds("https://horriblesubs.info/")) log.Print(worker.FindFeeds("http://daringfireball.net/")) */ + srv := server.New() + srv.ListenAndServe() } diff --git a/server/handlers.go b/server/handlers.go new file mode 100644 index 0000000..79204a1 --- /dev/null +++ b/server/handlers.go @@ -0,0 +1,23 @@ +package server + +import "net/http" + +func Index(rw http.ResponseWriter, req *http.Request) { + rw.Write([]byte("index")) +} + +func Static(rw http.ResponseWriter, req *http.Request) { + rw.Write([]byte("static:" + Vars(req)["path"])) +} + +func FolderList(rw http.ResponseWriter, req *http.Request) { +} + +func Folder(rw http.ResponseWriter, req *http.Request) { +} + +func FeedList(rw http.ResponseWriter, req *http.Request) { +} + +func Feed(rw http.ResponseWriter, req *http.Request) { +} diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..f9cbbe4 --- /dev/null +++ b/server/server.go @@ -0,0 +1,73 @@ +package server + +import ( + "context" + "regexp" + "net/http" +) + +type Route struct { + url string + urlRegex *regexp.Regexp + handler func(http.ResponseWriter, *http.Request) +} + +type Handler struct { +} + +func p(path string, handler func(http.ResponseWriter, *http.Request)) Route { + var urlRegexp string + urlRegexp = regexp.MustCompile(`[\*\:]\w+`).ReplaceAllStringFunc(path, func(m string) string { + if m[0:1] == `*` { + return "(?P<" + m[1:] + ">.+)" + } + return "(?P<" + m[1:] + ">[^/]+)" + }) + urlRegexp = "^" + urlRegexp + "$" + return Route{ + url: path, + urlRegex: regexp.MustCompile(urlRegexp), + handler: handler, + } +} + +var routes []Route = []Route{ + p("/", Index), + p("/static/*path", Static), + p("/api/folders", FolderList), + p("/api/folders/:id", Folder), + p("/api/feeds", FeedList), + p("/api/feeds/:id", Feed), +} + +func Vars(req *http.Request) map[string]string { + if rv := req.Context().Value(0); rv != nil { + return rv.(map[string]string) + } + return nil +} + +func (h Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { + for _, route := range routes { + if route.urlRegex.MatchString(req.URL.Path) { + if route.urlRegex.NumSubexp() > 0 { + vars := make(map[string]string) + matches := route.urlRegex.FindStringSubmatchIndex(req.URL.Path) + for i, key := range route.urlRegex.SubexpNames()[1:] { + vars[key] = req.URL.Path[matches[i*2+2]:matches[i*2+3]] + } + ctx := context.WithValue(req.Context(), 0, vars) + req = req.WithContext(ctx) + } + route.handler(rw, req) + return + } + } + rw.WriteHeader(http.StatusNotFound) +} + +func New() *http.Server { + h := Handler{} + s := &http.Server{Addr: "127.0.0.1:8000", Handler: h} + return s +}