package hscontrol import ( "context" "io" "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestSecurityHeaders(t *testing.T) { handler := securityHeaders(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) })) rec := httptest.NewRecorder() req := httptest.NewRequestWithContext(context.Background(), http.MethodGet, "/", nil) handler.ServeHTTP(rec, req) h := rec.Result().Header assert.Equal(t, "DENY", h.Get("X-Frame-Options")) assert.Equal(t, "frame-ancestors 'none'", h.Get("Content-Security-Policy")) assert.Equal(t, "nosniff", h.Get("X-Content-Type-Options")) assert.Equal(t, "no-referrer", h.Get("Referrer-Policy")) } func TestACMELoggerKeepsErrorBodyReadable(t *testing.T) { const problem = `{"type":"urn:ietf:params:acme:error:badNonce","detail":"JWS has an invalid anti-replay nonce","status":400}` server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/problem+json") w.WriteHeader(http.StatusBadRequest) _, _ = w.Write([]byte(problem)) })) defer server.Close() req, err := http.NewRequestWithContext(t.Context(), http.MethodGet, server.URL, nil) require.NoError(t, err) resp, err := (&acmeLogger{rt: http.DefaultTransport}).RoundTrip(req) require.NoError(t, err) defer resp.Body.Close() // acme parses the body to classify errors such as badNonce, so it has to // survive the logging middleware. body, err := io.ReadAll(resp.Body) require.NoError(t, err) assert.JSONEq(t, problem, string(body)) }