Skip to content

Instantly share code, notes, and snippets.

@Tanmay451
Created March 31, 2024 12:36
Show Gist options
  • Save Tanmay451/616ea065fd48f1dacca54a6b2361e997 to your computer and use it in GitHub Desktop.
Save Tanmay451/616ea065fd48f1dacca54a6b2361e997 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"io"
"log"
"net/http"
"net/url"
"time"
"golang.org/x/time/rate"
)
var limiter = rate.NewLimiter(rate.Every(time.Second*1), 10)
func main() {
originServers := make([]*url.URL, 10)
for i := 0; i < 10; i++ {
serverURL, err := url.Parse(fmt.Sprintf("http://127.0.0.1:800%d", i))
if err != nil {
log.Fatalf("invalid origin server URL for server %d", i)
}
originServers[i] = serverURL
}
serverIndex := 0 // initial server index
reverseProxy := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
token := req.Header.Get("Authorization")
fmt.Println(token)
if token != "mySecretToken" {
rw.WriteHeader(http.StatusUnauthorized)
_, _ = fmt.Fprint(rw, "Unauthorized access. Invalid token.")
return
}
if !limiter.Allow() {
rw.WriteHeader(http.StatusTooManyRequests)
_, _ = fmt.Fprint(rw, "Rate limit exceeded. Try again later.")
return
}
serverURL := originServers[serverIndex]
serverIndex = (serverIndex + 1) % 10
fmt.Printf("[reverse proxy server] received request at: %s\n", time.Now())
// set req Host, URL and Request URI to forward a request to the origin server
req.URL.Host = serverURL.Host
req.URL.Scheme = serverURL.Scheme
req.RequestURI = ""
req.Header.Add("X-Forwarded-For", "Rad")
originServerResponse, err := http.DefaultClient.Do(req)
if err != nil {
rw.WriteHeader(http.StatusInternalServerError)
_, _ = fmt.Fprint(rw, err)
return
}
rw.Header().Set("Hello", "Hi")
io.Copy(rw, originServerResponse.Body)
rw.WriteHeader(http.StatusOK)
})
log.Fatal(http.ListenAndServe(":8080", reverseProxy))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment