123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package main
- import (
- "bufio"
- "context"
- "fmt"
- "net/http"
- "os"
- "time"
- )
- func main() {
- baseURL := "https://staging.ntfy.sh"
- if len(os.Args) > 1 {
- baseURL = os.Args[1]
- }
- for i := 0; i < 2000; i++ {
- go subscribe(i, baseURL)
- }
- time.Sleep(5 * time.Second)
- for i := 0; i < 2000; i++ {
- go func(worker int) {
- for {
- poll(worker, baseURL)
- }
- }(i)
- }
- time.Sleep(time.Hour)
- }
- func subscribe(worker int, baseURL string) {
- fmt.Printf("[subscribe] worker=%d STARTING\n", worker)
- start := time.Now()
- topic, ip := fmt.Sprintf("subtopic%d", worker), fmt.Sprintf("1.2.%d.%d", (worker/255)%255, worker%255)
- req, _ := http.NewRequest("GET", fmt.Sprintf("%s/%s/json", baseURL, topic), nil)
- req.Header.Set("X-Forwarded-For", ip)
- resp, err := http.DefaultClient.Do(req)
- if err != nil {
- fmt.Printf("[subscribe] worker=%d time=%d error=%s\n", worker, time.Since(start).Milliseconds(), err.Error())
- return
- }
- defer resp.Body.Close()
- scanner := bufio.NewScanner(resp.Body)
- for scanner.Scan() {
- // Do nothing
- }
- fmt.Printf("[subscribe] worker=%d status=%d time=%d EXITED\n", worker, resp.StatusCode, time.Since(start).Milliseconds())
- }
- func poll(worker int, baseURL string) {
- fmt.Printf("[poll] worker=%d STARTING\n", worker)
- topic, ip := fmt.Sprintf("polltopic%d", worker), fmt.Sprintf("1.2.%d.%d", (worker/255)%255, worker%255)
- start := time.Now()
- ctx, cancel := context.WithTimeout(context.Background(), time.Second*2)
- defer cancel()
- //req, _ := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("https://staging.ntfy.sh/%s/json?poll=1&since=all", topic), nil)
- req, _ := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/%s/json?poll=1&since=all", baseURL, topic), nil)
- req.Header.Set("X-Forwarded-For", ip)
- resp, err := http.DefaultClient.Do(req)
- if err != nil {
- fmt.Printf("[poll] worker=%d time=%d status=- error=%s\n", worker, time.Since(start).Milliseconds(), err.Error())
- cancel()
- return
- }
- defer resp.Body.Close()
- fmt.Printf("[poll] worker=%d time=%d status=%s\n", worker, time.Since(start).Milliseconds(), resp.Status)
- }
|