From 4283a830bfd45275a3535e30a745ddf7f6fd315b Mon Sep 17 00:00:00 2001 From: Gianni Ceccarelli Date: Thu, 1 Aug 2019 14:38:13 +0100 Subject: go http implementation --- go/mixed-server.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/go/mixed-server.go b/go/mixed-server.go index 44dfcdc..fd44591 100644 --- a/go/mixed-server.go +++ b/go/mixed-server.go @@ -1,8 +1,15 @@ package main import ( + "fmt" + "net/http" + "net/url" + "os" + "os/signal" "sort" + "strings" "sync" + "io" ) type wordsByCount struct { @@ -59,5 +66,64 @@ func (m *Model) GetMostCommonPairs(how_many uint) []string { defer m.lock.RUnlock() wbc := newWordsByCount(&m.words) mcw := wbc.MostCommonWords() + if how_many >= uint(len(mcw)) { + how_many = uint(len(mcw)) + } return mcw[:how_many] } + +type View struct{} + +func NewView() View { + return View{} +} +func (v View) WordsFromInput(input string) []string { + return strings.Fields(input) +} +func (v View) TableFromRankedPairs(ranked_pairs []string) string { + // we're not actually getting pairs, just strings + var b strings.Builder + for _, s := range ranked_pairs { + fmt.Fprintf(&b, "%s\n", s) + } + return b.String() +} + +func NewHttpController(m Model, v View) *http.ServeMux { + controller := http.NewServeMux() + controller.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + if req.Method == "GET" { + uri, _ := url.Parse(req.RequestURI) + q := uri.Query() + n, _ := q["n"] + var how_many uint + if len(n) > 0 { + fmt.Sscanf(n[0], "%d", &how_many) + } + if how_many == 0 { + how_many = 10 + } + most_common_pairs := m.GetMostCommonPairs(how_many) + + table := v.TableFromRankedPairs(most_common_pairs) + strings.NewReader(table + "\n").WriteTo(w) + } else if req.Method == "POST" { + var body strings.Builder + io.Copy(&body,req.Body) + words := v.WordsFromInput(body.String()) + m.AddWords(words) + } + }) + return controller +} + +func main() { + model := NewModel() + view := NewView() + httpcontroller := NewHttpController(model, view) + go http.ListenAndServe("localhost:8080", httpcontroller) + + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, os.Interrupt) + <-sigs +} -- cgit v1.2.3