diff --git a/go-http/httpserver.go b/go-http/httpserver.go new file mode 100644 index 0000000..75bc3bb --- /dev/null +++ b/go-http/httpserver.go @@ -0,0 +1,63 @@ +package main + +import ( + "github.com/patrickmn/go-cache" + "io" + "io/ioutil" + "log" + "net/http" + "time" +) + +const stacoURL string = "http://127.0.0.1:8100" + +var countCache = cache.New(5*time.Minute, 10*time.Minute) + +func commentsCount(w http.ResponseWriter, r *http.Request) { + + // only GET method is supported + if r.Method != "GET" { + http.NotFound(w, r) + return + } + + // set header + w.Header().Add("Content-Type", "application/json") + w.Header().Add("Access-Control-Allow-Origin", "*") + + // get cached value + cachedBody, found := countCache.Get(r.URL.String()) + if found { + //log.Printf("return cached value") + w.Write([]byte(cachedBody.(string))) + return + } + + // relay request to stacosys + response, err := http.Get(stacoURL + r.URL.String()) + if err != nil { + http.NotFound(w, r) + return + } + defer response.Body.Close() + body, err := ioutil.ReadAll(response.Body) + if err != nil { + http.NotFound(w, r) + return + } + + // cache body and return response + countCache.Set(r.URL.String(), string(body), cache.DefaultExpiration) + log.Printf(string(body)) + w.Write(body) +} + +func comments(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "Hello world!") +} + +func main() { + http.HandleFunc("/comments/count", commentsCount) + http.HandleFunc("/comments", comments) + http.ListenAndServe(":8200", nil) +}