main
go 87 lines 2.52 KB
Raw
1 package sdk
2
3 import (
4 "net/http"
5 "net/http/httptest"
6 "strings"
7 "testing"
8 )
9
10 func TestHTTPRoutesUseLongestPrefix(t *testing.T) {
11 t.Parallel()
12
13 gotPath := make(chan string, 1)
14 apiServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
15 gotPath <- r.URL.RequestURI()
16 _, _ = w.Write([]byte("api"))
17 }))
18 defer apiServer.Close()
19
20 rootServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
21 _, _ = w.Write([]byte("root"))
22 }))
23 defer rootServer.Close()
24
25 handler, err := NewHTTPRoutes([]HTTPRouteConfig{
26 {Prefix: "/", Upstream: rootServer.URL},
27 {Prefix: "/api", Upstream: apiServer.URL},
28 }, "", false)
29 if err != nil {
30 t.Fatalf("NewHTTPRoutes() error = %v", err)
31 }
32
33 req := httptest.NewRequest(http.MethodGet, "https://public.example/api/users?active=true", nil)
34 rec := httptest.NewRecorder()
35 handler.ServeHTTP(rec, req)
36
37 if got := rec.Body.String(); got != "api" {
38 t.Fatalf("body = %q, want api", got)
39 }
40 if got := <-gotPath; got != "/users?active=true" {
41 t.Fatalf("upstream path = %q, want /users?active=true", got)
42 }
43 }
44
45 func TestHTTPRoutesRewriteResponseHeaders(t *testing.T) {
46 t.Parallel()
47
48 var upstreamURL string
49 upstreamServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
50 w.Header().Set("Location", upstreamURL+"/base/login")
51 http.SetCookie(w, &http.Cookie{Name: "sid", Value: "1", Path: "/base/session"})
52 w.WriteHeader(http.StatusFound)
53 }))
54 defer upstreamServer.Close()
55 upstreamURL = upstreamServer.URL
56
57 handler, err := NewHTTPRoutes([]HTTPRouteConfig{
58 {Prefix: "/app", Upstream: upstreamURL + "/base"},
59 }, "", false)
60 if err != nil {
61 t.Fatalf("NewHTTPRoutes() error = %v", err)
62 }
63
64 req := httptest.NewRequest(http.MethodGet, "http://public.example/app/dashboard", nil)
65 req.Header.Set("X-Forwarded-Proto", "https")
66 rec := httptest.NewRecorder()
67 handler.ServeHTTP(rec, req)
68
69 if got := rec.Header().Get("Location"); got != "https://public.example/app/login" {
70 t.Fatalf("Location = %q, want https://public.example/app/login", got)
71 }
72 if got := rec.Header().Get("Set-Cookie"); !strings.Contains(got, "Path=/app/session") {
73 t.Fatalf("Set-Cookie = %q, want rewritten path", got)
74 }
75 }
76
77 func TestHTTPRoutesRejectDuplicateNormalizedPrefixes(t *testing.T) {
78 t.Parallel()
79
80 _, err := NewHTTPRoutes([]HTTPRouteConfig{
81 {Prefix: "/api", Upstream: "127.0.0.1:3001"},
82 {Prefix: "/api/", Upstream: "127.0.0.1:3002"},
83 }, "", false)
84 if err == nil {
85 t.Fatal("NewHTTPRoutes() error = nil, want duplicate prefix error")
86 }
87 }