From dec2d0062c5db720a0717666ba2e4474b9a41432 Mon Sep 17 00:00:00 2001 From: Umputun Date: Sun, 4 Nov 2018 13:13:56 -0600 Subject: [PATCH] ssl redirect test --- backend/app/rest/api/rest.go | 5 ++--- backend/app/rest/api/ssl.go | 2 ++ backend/app/rest/api/ssl_test.go | 37 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 backend/app/rest/api/ssl_test.go diff --git a/backend/app/rest/api/rest.go b/backend/app/rest/api/rest.go index 1e087e19..ca35ee36 100644 --- a/backend/app/rest/api/rest.go +++ b/backend/app/rest/api/rest.go @@ -83,7 +83,7 @@ func (s *Rest) Run(port int) { err := s.httpServer.ListenAndServe() log.Printf("[WARN] http server terminated, %s", err) case Static: - log.Printf("[INFO] activate rest https server in 'static' mode on port %d", s.SSLConfig.Port) + log.Printf("[INFO] activate https server in 'static' mode on port %d", s.SSLConfig.Port) s.lock.Lock() s.httpsServer = s.makeHTTPServer(s.SSLConfig.Port, s.routes()) @@ -92,7 +92,6 @@ func (s *Rest) Run(port int) { go func() { log.Printf("[INFO] activate http redirect server on port %d", port) - err := s.httpServer.ListenAndServe() log.Printf("[WARN] http redirect server terminated, %s", err) }() @@ -100,7 +99,7 @@ func (s *Rest) Run(port int) { err := s.httpsServer.ListenAndServeTLS(s.SSLConfig.Cert, s.SSLConfig.Key) log.Printf("[WARN] https server terminated, %s", err) case Auto: - log.Printf("[WARN] Autocert mode is not implemented yet") + log.Printf("[WARN] autocert mode is not implemented yet") } } diff --git a/backend/app/rest/api/ssl.go b/backend/app/rest/api/ssl.go index 36c15b52..4eca924e 100644 --- a/backend/app/rest/api/ssl.go +++ b/backend/app/rest/api/ssl.go @@ -1,6 +1,7 @@ package api import ( + "log" "net/http" "time" @@ -32,6 +33,7 @@ type SSLConfig struct { // httpToHTTPSRouter creates new router which does redirect from http to https server func (s *Rest) httpToHTTPSRouter() chi.Router { + log.Printf("[DEBUG] create https-to-http redirect routes") router := chi.NewRouter() router.Use(middleware.RealIP, Recoverer) router.Use(middleware.Throttle(1000), middleware.Timeout(60*time.Second)) diff --git a/backend/app/rest/api/ssl_test.go b/backend/app/rest/api/ssl_test.go new file mode 100644 index 00000000..0c459fb7 --- /dev/null +++ b/backend/app/rest/api/ssl_test.go @@ -0,0 +1,37 @@ +package api + +import ( + "crypto/tls" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSSL_Redirect(t *testing.T) { + rest := Rest{RemarkURL: "https://localhost:443"} + + ts := httptest.NewServer(rest.httpToHTTPSRouter()) + defer ts.Close() + + client := http.Client{ + // prevent http redirect + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + + // allow self-signed certificate + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + } + + // check http to https redirect response + resp, err := client.Get(ts.URL + "/blah?param=1") + require.Nil(t, err) + defer resp.Body.Close() + assert.Equal(t, 307, resp.StatusCode) + assert.Equal(t, "https://localhost:443/blah?param=1", resp.Header.Get("Location")) +}