From 90c7fab968cdd7518feaf712447a580f1d4b1fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20Cro=C3=ABs?= Date: Mon, 29 Oct 2018 14:25:39 +0100 Subject: [PATCH] adds a /data path (#14) --- app.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/app.go b/app.go index 3f21553..8332283 100644 --- a/app.go +++ b/app.go @@ -1,9 +1,13 @@ package main import ( + "bytes" "encoding/json" "flag" "fmt" + "io" + "strconv" + "strings" "sync" "github.com/gorilla/websocket" @@ -19,6 +23,14 @@ var cert string var key string var port string +const ( + _ = iota + KB int64 = 1 << (10 * iota) + MB + GB + TB +) + func init() { flag.StringVar(&cert, "cert", "", "give me a certificate") flag.StringVar(&key, "key", "", "give me a key") @@ -32,6 +44,7 @@ var upgrader = websocket.Upgrader{ func main() { flag.Parse() + http.HandleFunc("/data", dataHandler) http.HandleFunc("/echo", echoHandler) http.HandleFunc("/bench", benchHandler) http.HandleFunc("/", whoami) @@ -74,7 +87,41 @@ func echoHandler(w http.ResponseWriter, r *http.Request) { } } } +func dataHandler(w http.ResponseWriter, r *http.Request) { + u, _ := url.Parse(r.URL.String()) + queryParams := u.Query() + size, err := strconv.ParseInt(queryParams.Get("size"), 10, 64) + if err != nil { + size = 1 + } + if size < 0 { + size = 0 + } + + unit := queryParams.Get("unit") + switch (strings.ToLower(unit)) { + case "kb": size = size * KB + case "mb": size = size * MB + case "gb": size = size * GB + case "tb": size = size * TB + } + + attachment, err := strconv.ParseBool(queryParams.Get("attachment")) + if err != nil { + attachment = false + } + + content := fillContent(size) + + if attachment { + const name = "data.txt" + w.Header().Add("Content-Disposition", "Attachment") + http.ServeContent(w, r, name, time.Now(), content) + } else { + io.Copy(w, content) + } +} func whoami(w http.ResponseWriter, req *http.Request) { u, _ := url.Parse(req.URL.String()) queryParams := u.Query() @@ -161,3 +208,19 @@ func healthHandler(w http.ResponseWriter, req *http.Request) { w.WriteHeader(currentHealthState.StatusCode) } } + +func fillContent(length int64) io.ReadSeeker { + charset := "-ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b := make([]byte, length, length) + + for i := range b { + b[i] = charset[i % len(charset)] + } + + if length > 0 { + b[0] = '|' + b[length-1] = '|' + } + + return bytes.NewReader(b) +} \ No newline at end of file