From a9f924b041975b0315717feca0c2871ed83ec528 Mon Sep 17 00:00:00 2001 From: Marcus Schiesser <mail@marcusschiesser.de> Date: Thu, 15 Apr 2021 11:28:14 +0800 Subject: [PATCH] added goproxy implementation --- src/goproxy/handlers/proxy.go | 34 ++++++++++++++++++++++++++++++++++ src/goproxy/main.go | 20 ++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/goproxy/handlers/proxy.go create mode 100644 src/goproxy/main.go diff --git a/src/goproxy/handlers/proxy.go b/src/goproxy/handlers/proxy.go new file mode 100644 index 0000000..c920bca --- /dev/null +++ b/src/goproxy/handlers/proxy.go @@ -0,0 +1,34 @@ +package handlers + +import ( + "io" + "log" + "net/http" + + "github.com/gorilla/mux" +) + +func Proxy(upstream string) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + url := upstream + "/" + vars["req"] + log.Printf("Calling upstream url: %s\n", url) + resp, err := http.Get(url) + if err != nil { + handleError(w, url, err) + return + } + defer resp.Body.Close() + _, err = io.Copy(w, resp.Body) + if err != nil { + handleError(w, url, err) + return + } + log.Printf("Successfully read request from %s\n", url) + } +} + +func handleError(w http.ResponseWriter, url string, err error) { + log.Printf("Error reading from %s - %v\n", url, err) + io.WriteString(w, "can't read from upstream") +} diff --git a/src/goproxy/main.go b/src/goproxy/main.go new file mode 100644 index 0000000..dc12fda --- /dev/null +++ b/src/goproxy/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "log" + "net/http" + + "github.com/gorilla/mux" + "github.com/turngeek/examples-go/src/goproxy/handlers" +) + +func main() { + log.Println("Starting My-Aktion API server") + router := mux.NewRouter() + router.HandleFunc("/google/{req}", handlers.Proxy("https://www.google.com")).Methods("GET") + router.HandleFunc("/fb/{req}", handlers.Proxy("https://www.facebook.com")).Methods("GET") + router.HandleFunc("/fb", handlers.Proxy("https://www.facebook.com")).Methods("GET") + if err := http.ListenAndServe(":8000", router); err != nil { + log.Fatal(err) + } +} -- GitLab