154 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
package pagewriter
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"html/template"
 | 
						|
	"io/ioutil"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"os"
 | 
						|
	"path/filepath"
 | 
						|
 | 
						|
	middlewareapi "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/middleware"
 | 
						|
	. "github.com/onsi/ginkgo"
 | 
						|
	. "github.com/onsi/gomega"
 | 
						|
)
 | 
						|
 | 
						|
var _ = Describe("Static Pages", func() {
 | 
						|
	var customDir string
 | 
						|
	const customRobots = "User-agent: *\nAllow: /\n"
 | 
						|
	var errorPage *errorPageWriter
 | 
						|
	var request *http.Request
 | 
						|
 | 
						|
	BeforeEach(func() {
 | 
						|
		errorTmpl, err := template.New("").Parse("{{.Title}}")
 | 
						|
		Expect(err).ToNot(HaveOccurred())
 | 
						|
		errorPage = &errorPageWriter{
 | 
						|
			template: errorTmpl,
 | 
						|
		}
 | 
						|
 | 
						|
		customDir, err = ioutil.TempDir("", "oauth2-proxy-static-pages-test")
 | 
						|
		Expect(err).ToNot(HaveOccurred())
 | 
						|
 | 
						|
		robotsTxtFile := filepath.Join(customDir, robotsTxtName)
 | 
						|
		Expect(ioutil.WriteFile(robotsTxtFile, []byte(customRobots), 0400)).To(Succeed())
 | 
						|
 | 
						|
		request = httptest.NewRequest("", "http://127.0.0.1/", nil)
 | 
						|
		request = middlewareapi.AddRequestScope(request, &middlewareapi.RequestScope{
 | 
						|
			RequestID: testRequestID,
 | 
						|
		})
 | 
						|
	})
 | 
						|
 | 
						|
	AfterEach(func() {
 | 
						|
		Expect(os.RemoveAll(customDir)).To(Succeed())
 | 
						|
	})
 | 
						|
 | 
						|
	Context("Static Page Writer", func() {
 | 
						|
		Context("With custom content", func() {
 | 
						|
			var pageWriter *staticPageWriter
 | 
						|
 | 
						|
			BeforeEach(func() {
 | 
						|
				var err error
 | 
						|
				pageWriter, err = newStaticPageWriter(customDir, errorPage)
 | 
						|
				Expect(err).ToNot(HaveOccurred())
 | 
						|
			})
 | 
						|
 | 
						|
			Context("WriterRobotsTxt", func() {
 | 
						|
				It("Should write the custom robots txt", func() {
 | 
						|
					recorder := httptest.NewRecorder()
 | 
						|
					pageWriter.WriteRobotsTxt(recorder, request)
 | 
						|
 | 
						|
					body, err := ioutil.ReadAll(recorder.Result().Body)
 | 
						|
					Expect(err).ToNot(HaveOccurred())
 | 
						|
					Expect(string(body)).To(Equal(customRobots))
 | 
						|
 | 
						|
					Expect(recorder.Result().StatusCode).To(Equal(http.StatusOK))
 | 
						|
				})
 | 
						|
			})
 | 
						|
		})
 | 
						|
 | 
						|
		Context("Without custom content", func() {
 | 
						|
			var pageWriter *staticPageWriter
 | 
						|
 | 
						|
			BeforeEach(func() {
 | 
						|
				var err error
 | 
						|
				pageWriter, err = newStaticPageWriter("", errorPage)
 | 
						|
				Expect(err).ToNot(HaveOccurred())
 | 
						|
			})
 | 
						|
 | 
						|
			Context("WriterRobotsTxt", func() {
 | 
						|
				It("Should write the custom robots txt", func() {
 | 
						|
					recorder := httptest.NewRecorder()
 | 
						|
					pageWriter.WriteRobotsTxt(recorder, request)
 | 
						|
 | 
						|
					body, err := ioutil.ReadAll(recorder.Result().Body)
 | 
						|
					Expect(err).ToNot(HaveOccurred())
 | 
						|
					Expect(string(body)).To(Equal(string(defaultRobotsTxt)))
 | 
						|
 | 
						|
					Expect(recorder.Result().StatusCode).To(Equal(http.StatusOK))
 | 
						|
				})
 | 
						|
 | 
						|
				It("Should serve an error if it cannot write the page", func() {
 | 
						|
					recorder := &testBadResponseWriter{
 | 
						|
						ResponseRecorder: httptest.NewRecorder(),
 | 
						|
					}
 | 
						|
					pageWriter.WriteRobotsTxt(recorder, request)
 | 
						|
 | 
						|
					body, err := ioutil.ReadAll(recorder.Result().Body)
 | 
						|
					Expect(err).ToNot(HaveOccurred())
 | 
						|
					Expect(string(body)).To(Equal(string("Internal Server Error")))
 | 
						|
 | 
						|
					Expect(recorder.Result().StatusCode).To(Equal(http.StatusInternalServerError))
 | 
						|
				})
 | 
						|
			})
 | 
						|
		})
 | 
						|
	})
 | 
						|
 | 
						|
	Context("loadStaticPages", func() {
 | 
						|
		Context("With custom content", func() {
 | 
						|
			Context("And a custom robots txt", func() {
 | 
						|
				It("Loads the custom content", func() {
 | 
						|
					pages, err := loadStaticPages(customDir)
 | 
						|
					Expect(err).ToNot(HaveOccurred())
 | 
						|
					Expect(pages.pages).To(HaveLen(1))
 | 
						|
					Expect(pages.getPage(robotsTxtName)).To(BeEquivalentTo(customRobots))
 | 
						|
				})
 | 
						|
			})
 | 
						|
 | 
						|
			Context("And no custom robots txt", func() {
 | 
						|
				It("returns the default content", func() {
 | 
						|
					robotsTxtFile := filepath.Join(customDir, robotsTxtName)
 | 
						|
					Expect(os.Remove(robotsTxtFile)).To(Succeed())
 | 
						|
 | 
						|
					pages, err := loadStaticPages(customDir)
 | 
						|
					Expect(err).ToNot(HaveOccurred())
 | 
						|
					Expect(pages.pages).To(HaveLen(1))
 | 
						|
					Expect(pages.getPage(robotsTxtName)).To(BeEquivalentTo(defaultRobotsTxt))
 | 
						|
				})
 | 
						|
			})
 | 
						|
		})
 | 
						|
 | 
						|
		Context("Without custom content", func() {
 | 
						|
			It("Loads the default content", func() {
 | 
						|
				pages, err := loadStaticPages("")
 | 
						|
				Expect(err).ToNot(HaveOccurred())
 | 
						|
				Expect(pages.pages).To(HaveLen(1))
 | 
						|
				Expect(pages.getPage(robotsTxtName)).To(BeEquivalentTo(defaultRobotsTxt))
 | 
						|
			})
 | 
						|
		})
 | 
						|
	})
 | 
						|
})
 | 
						|
 | 
						|
type testBadResponseWriter struct {
 | 
						|
	*httptest.ResponseRecorder
 | 
						|
	firstWriteCalled bool
 | 
						|
}
 | 
						|
 | 
						|
func (b *testBadResponseWriter) Write(buf []byte) (int, error) {
 | 
						|
	if !b.firstWriteCalled {
 | 
						|
		b.firstWriteCalled = true
 | 
						|
		return 0, errors.New("write closed")
 | 
						|
	}
 | 
						|
	return b.ResponseRecorder.Write(buf)
 | 
						|
}
 |