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