1 package web
2
3 import (
4 "bytes"
5 "crypto/tls"
6 "fmt"
7 "net/http"
8 "net/http/httptest"
9 "strings"
10 "testing"
11
12 blog "github.com/letsencrypt/boulder/log"
13 "github.com/letsencrypt/boulder/test"
14 )
15
16 type myHandler struct{}
17
18 func (m myHandler) ServeHTTP(e *RequestEvent, w http.ResponseWriter, r *http.Request) {
19 w.WriteHeader(201)
20 e.Endpoint = "/endpoint"
21 _, _ = w.Write([]byte("hi"))
22 }
23
24 func TestLogCode(t *testing.T) {
25 mockLog := blog.UseMock()
26 th := NewTopHandler(mockLog, myHandler{})
27 req, err := http.NewRequest("GET", "/thisisignored", &bytes.Reader{})
28 if err != nil {
29 t.Fatal(err)
30 }
31 th.ServeHTTP(httptest.NewRecorder(), req)
32 expected := `INFO: GET /endpoint 0 201 0 0.0.0.0 JSON={}`
33 if len(mockLog.GetAllMatching(expected)) != 1 {
34 t.Errorf("Expected exactly one log line matching %q. Got \n%s",
35 expected, strings.Join(mockLog.GetAllMatching(".*"), "\n"))
36 }
37 }
38
39 type codeHandler struct{}
40
41 func (ch codeHandler) ServeHTTP(e *RequestEvent, w http.ResponseWriter, r *http.Request) {
42 e.Endpoint = "/endpoint"
43 _, _ = w.Write([]byte("hi"))
44 }
45
46 func TestStatusCodeLogging(t *testing.T) {
47 mockLog := blog.UseMock()
48 th := NewTopHandler(mockLog, codeHandler{})
49 req, err := http.NewRequest("GET", "/thisisignored", &bytes.Reader{})
50 if err != nil {
51 t.Fatal(err)
52 }
53 th.ServeHTTP(httptest.NewRecorder(), req)
54 expected := `INFO: GET /endpoint 0 200 0 0.0.0.0 JSON={}`
55 if len(mockLog.GetAllMatching(expected)) != 1 {
56 t.Errorf("Expected exactly one log line matching %q. Got \n%s",
57 expected, strings.Join(mockLog.GetAllMatching(".*"), "\n"))
58 }
59 }
60
61 func TestOrigin(t *testing.T) {
62 mockLog := blog.UseMock()
63 th := NewTopHandler(mockLog, myHandler{})
64 req, err := http.NewRequest("GET", "/thisisignored", &bytes.Reader{})
65 if err != nil {
66 t.Fatal(err)
67 }
68 req.Header.Add("Origin", "https://example.com")
69 th.ServeHTTP(httptest.NewRecorder(), req)
70 expected := `INFO: GET /endpoint 0 201 0 0.0.0.0 JSON={.*"Origin":"https://example.com"}`
71 if len(mockLog.GetAllMatching(expected)) != 1 {
72 t.Errorf("Expected exactly one log line matching %q. Got \n%s",
73 expected, strings.Join(mockLog.GetAllMatching(".*"), "\n"))
74 }
75 }
76
77 type hostHeaderHandler struct {
78 f func(*RequestEvent, http.ResponseWriter, *http.Request)
79 }
80
81 func (hhh hostHeaderHandler) ServeHTTP(e *RequestEvent, w http.ResponseWriter, r *http.Request) {
82 hhh.f(e, w, r)
83 }
84
85 func TestHostHeaderRewrite(t *testing.T) {
86 mockLog := blog.UseMock()
87 hhh := hostHeaderHandler{f: func(_ *RequestEvent, _ http.ResponseWriter, r *http.Request) {
88 t.Helper()
89 test.AssertEquals(t, r.Host, "localhost")
90 }}
91 th := NewTopHandler(mockLog, &hhh)
92
93 req, err := http.NewRequest("GET", "/", &bytes.Reader{})
94 test.AssertNotError(t, err, "http.NewRequest failed")
95 req.Host = "localhost:80"
96 fmt.Println("here")
97 th.ServeHTTP(httptest.NewRecorder(), req)
98
99 req, err = http.NewRequest("GET", "/", &bytes.Reader{})
100 test.AssertNotError(t, err, "http.NewRequest failed")
101 req.Host = "localhost:443"
102 req.TLS = &tls.ConnectionState{}
103 th.ServeHTTP(httptest.NewRecorder(), req)
104
105 req, err = http.NewRequest("GET", "/", &bytes.Reader{})
106 test.AssertNotError(t, err, "http.NewRequest failed")
107 req.Host = "localhost:443"
108 req.TLS = nil
109 th.ServeHTTP(httptest.NewRecorder(), req)
110
111 hhh.f = func(_ *RequestEvent, _ http.ResponseWriter, r *http.Request) {
112 t.Helper()
113 test.AssertEquals(t, r.Host, "localhost:123")
114 }
115 req, err = http.NewRequest("GET", "/", &bytes.Reader{})
116 test.AssertNotError(t, err, "http.NewRequest failed")
117 req.Host = "localhost:123"
118 th.ServeHTTP(httptest.NewRecorder(), req)
119 }
120
View as plain text