package main import ( "bufio" "context" "net/http" "net/http/httptest" "net/url" "testing" "time" ) func TestRejectWrites(t *testing.T) { for _, method := range []string{"POST", "PUT", "DELETE"} { w := httptest.NewRecorder() target, _ := url.Parse("http://127.0.0.1:18080") handler(target).ServeHTTP(w, httptest.NewRequest(method, "http://shop.my-mm.ir/api/snapshot", nil)) if w.Code != http.StatusMethodNotAllowed { t.Fatal("write method forwarded") } } } func TestForwardPublicHostOriginAndStream(t *testing.T) { release := make(chan struct{}) upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Host == "shop.my-mm.ir" || r.Header.Get("Origin") != "" { t.Error("public host/origin leaked into local guard") } w.Header().Set("Content-Type", "text/event-stream") w.Write([]byte("data: test\n\n")) w.(http.Flusher).Flush() select { case <-release: case <-r.Context().Done(): } })) defer upstream.Close() target, _ := url.Parse(upstream.URL) relay := httptest.NewServer(handler(target)) defer relay.Close() ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() req, _ := http.NewRequestWithContext(ctx, "GET", relay.URL+"/api/events", nil) req.Host = "shop.my-mm.ir" req.Header.Set("Origin", "https://shop.my-mm.ir") response, err := http.DefaultClient.Do(req) if err != nil { close(release) t.Fatal(err) } defer response.Body.Close() line, err := bufio.NewReader(response.Body).ReadString('\n') close(release) if err != nil || line != "data: test\n" { t.Fatal("stream buffered or missing") } }