@@ -101,8 +101,7 @@ type OAuthProxy struct {
101101 sessionChain alice.Chain
102102 headersChain alice.Chain
103103 preAuthChain alice.Chain
104− errorPage *app.ErrorPage
105− signInPage *app.SignInPage
104+ pageWriter app.PageWriter
106105}
107106
108107// NewOAuthProxy creates a new instance of OAuthProxy from the options provided
@@ -112,20 +111,31 @@ func NewOAuthProxy(opts *options.Options, validator func(string) bool) (*OAuthPr
112111 return nil, fmt.Errorf("error initialising session store: %v", err)
113112 }
114113
115− templates, err := app.LoadTemplates(opts.Templates.Path)
116− if err != nil {
117− return nil, fmt.Errorf("error loading templates: %v", err)
114+ var basicAuthValidator basic.Validator
115+ if opts.HtpasswdFile != "" {
116+ logger.Printf("using htpasswd file: %s", opts.HtpasswdFile)
117+ var err error
118+ basicAuthValidator, err = basic.NewHTPasswdValidator(opts.HtpasswdFile)
119+ if err != nil {
120+ return nil, fmt.Errorf("could not load htpasswdfile: %v", err)
121+ }
118122 }
119123
120− errorPage := &app.ErrorPage{
121− Template: templates.Lookup("error.html"),
122− ProxyPrefix: opts.ProxyPrefix,
123− Footer: opts.Templates.Footer,
124− Version: VERSION,
125− Debug: opts.Templates.Debug,
124+ pageWriter, err := app.NewPageWriter(app.PageWriterOpts{
125+ TemplatesPath: opts.Templates.Path,
126+ ProxyPrefix: opts.ProxyPrefix,
127+ Footer: opts.Templates.Footer,
128+ Version: VERSION,
129+ Debug: opts.Templates.Debug,
130+ ProviderName: buildProviderName(opts.GetProvider(), opts.ProviderName),
131+ SignInMessage: buildSignInMessage(opts),
132+ DisplayLoginForm: basicAuthValidator != nil && opts.Templates.DisplayLoginForm,
133+ })
134+ if err != nil {
135+ return nil, fmt.Errorf("error initialising page writer: %v", err)
126136 }
127137
128− upstreamProxy, err := upstream.NewProxy(opts.UpstreamServers, opts.GetSignatureData(), errorPage.ProxyErrorHandler)
138+ upstreamProxy, err := upstream.NewProxy(opts.UpstreamServers, opts.GetSignatureData(), pageWriter.ProxyErrorHandler)
129139 if err != nil {
130140 return nil, fmt.Errorf("error initialising upstream proxy: %v", err)
131141 }
@@ -158,27 +168,6 @@ func NewOAuthProxy(opts *options.Options, validator func(string) bool) (*OAuthPr
158168 }
159169 }
160170
161− var basicAuthValidator basic.Validator
162− if opts.HtpasswdFile != "" {
163− logger.Printf("using htpasswd file: %s", opts.HtpasswdFile)
164− var err error
165− basicAuthValidator, err = basic.NewHTPasswdValidator(opts.HtpasswdFile)
166− if err != nil {
167− return nil, fmt.Errorf("could not load htpasswdfile: %v", err)
168− }
169− }
170−
171− signInPage := &app.SignInPage{
172− Template: templates.Lookup("sign_in.html"),
173− ErrorPage: errorPage,
174− ProxyPrefix: opts.ProxyPrefix,
175− ProviderName: buildProviderName(opts.GetProvider(), opts.ProviderName),
176− SignInMessage: buildSignInMessage(opts),
177− Footer: opts.Templates.Footer,
178− Version: VERSION,
179− DisplayLoginForm: basicAuthValidator != nil && opts.Templates.DisplayLoginForm,
180− }
181−
182171 allowedRoutes, err := buildRoutesAllowlist(opts)
183172 if err != nil {
184173 return nil, err
@@ -232,8 +221,7 @@ func NewOAuthProxy(opts *options.Options, validator func(string) bool) (*OAuthPr
232221 sessionChain: sessionChain,
233222 headersChain: headersChain,
234223 preAuthChain: preAuthChain,
235− errorPage: errorPage,
236− signInPage: signInPage,
224+ pageWriter: pageWriter,
237225 }, nil
238226}
239227
@@ -540,7 +528,7 @@ func (p *OAuthProxy) ErrorPage(rw http.ResponseWriter, req *http.Request, code i
540528 redirectURL = "/"
541529 }
542530
543− p.errorPage.Render(rw, code, redirectURL, appError, messages...)
531+ p.pageWriter.WriteErrorPage(rw, code, redirectURL, appError, messages...)
544532}
545533
546534// IsAllowedRequest is used to check if auth should be skipped for this request
@@ -601,7 +589,7 @@ func (p *OAuthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code
601589 redirectURL = "/"
602590 }
603591
604− p.signInPage.Render(rw, redirectURL)
592+ p.pageWriter.WriteSignInPage(rw, redirectURL)
605593}
606594
607595// ManualSignIn handles basic auth logins to the proxy