From 762567080d2f18df31fb1be6e6c5b3b4dad2f8c8 Mon Sep 17 00:00:00 2001 From: bel Date: Tue, 17 Jan 2023 22:14:42 -0700 Subject: [PATCH] norepeat --- main.go | 59 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/main.go b/main.go index e514ce6..1927cbb 100644 --- a/main.go +++ b/main.go @@ -31,39 +31,45 @@ func main() { } links := bytes.Split(b, []byte{'\n'}) log.Print(port) - limiter := rate.NewLimiter(1, 1) - if err := http.ListenAndServe(fmt.Sprintf(":%d", port), ServeHTTP(limiter, links, proxy)); err != nil { + server := Server{ + limiter: rate.NewLimiter(1, 1), + links: links, + proxy: proxy, + } + if err := http.ListenAndServe(fmt.Sprintf(":%d", port), server); err != nil { panic(err) } } -func ServeHTTP(limiter *rate.Limiter, links [][]byte, proxy bool) http.HandlerFunc { - handler := serveHTTP(limiter, links, proxy) - return func(w http.ResponseWriter, r *http.Request) { - s := r.URL.Query().Get("n") - if s == "" { - s = "1" - } - n, err := strconv.Atoi(s) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - for i := 0; i < n; i++ { - handler(w, r) - } - } +type Server struct { + limiter *rate.Limiter + proxy bool + links [][]byte } -func serveHTTP(limiter *rate.Limiter, links [][]byte, proxy bool) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - limiter.Wait(r.Context()) +func (server Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + s := r.URL.Query().Get("n") + if s == "" { + s = "1" + } + n, err := strconv.Atoi(s) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + links := make([]string, n) + for i := range links { link := "" - for len(link) == 0 { - link = string(links[rand.Intn(len(links))]) + for len(link) == 0 || strings.Contains(fmt.Sprint(links), link) { + link = string(server.links[rand.Intn(len(server.links))]) } + links[i] = link + } + + for _, link := range links { if strings.HasPrefix(link, "http") { - _serveHTTP(w, r, proxy, link) + server.serveHTTP(w, r, link) } else if strings.HasPrefix(link, "literal://") { w.Write([]byte(strings.TrimPrefix(link, "literal://"))) } @@ -71,8 +77,9 @@ func serveHTTP(limiter *rate.Limiter, links [][]byte, proxy bool) http.HandlerFu } } -func _serveHTTP(w http.ResponseWriter, r *http.Request, proxy bool, link string) { - if proxy { +func (server Server) serveHTTP(w http.ResponseWriter, r *http.Request, link string) { + if server.proxy { + server.limiter.Wait(r.Context()) resp, err := http.Get(link) if err != nil { http.Error(w, err.Error(), http.StatusBadGateway)