...

Source file src/github.com/letsencrypt/boulder/web/context_test.go

Documentation: github.com/letsencrypt/boulder/web

     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