// Serve HTTP requests for the main port. func (a *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { a.once.Do(func() { const public = "/public/" fileserver := http.FileServer(a.PublicFS) mux, err := ctxmux.New( ctxmux.MuxErrorHandler(a.handleError), ctxmux.MuxNotFoundHandler(a.ExamplesHandler.Example), ctxmux.MuxRedirectTrailingSlash(), ctxmux.MuxContextMaker(a.contextMaker), ) if err != nil { panic(err) } mux.GET(a.Static.Path+"*rest", ctxmux.HTTPHandler(a.Static)) mux.GET("/favicon.ico", ctxmux.HTTPHandler(fileserver)) mux.GET("/f8.jpg", ctxmux.HTTPHandler(fileserver)) mux.GET("/robots.txt", ctxmux.HTTPHandler(fileserver)) mux.GET(public+"*rest", ctxmux.HTTPHandler(http.StripPrefix(public, fileserver))) mux.GET("/info/*rest", a.ContextHandler.Info) mux.POST("/info/*rest", a.ContextHandler.Info) mux.GET("/examples/", a.ExamplesHandler.List) mux.GET("/saved/:hash", a.ExamplesHandler.GetSaved) mux.POST("/saved/", a.ExamplesHandler.PostSaved) mux.GET("/og/*rest", a.OgHandler.Values) mux.GET("/rog/*rest", a.OgHandler.Base64) mux.GET("/rog-redirect/*rest", a.OgHandler.Redirect) mux.GET(oauth.Path+"*rest", a.OauthHandler.Handler) if a.AdminHandler.Path != "" { adminPath := path.Join("/", a.AdminHandler.Path) + "/*rest" mux.GET(adminPath, ctxmux.HTTPHandler(a.AdminHandler)) } var handler http.Handler handler = &appdata.Handler{ Handler: mux, Secret: a.App.SecretByte(), MaxAge: a.SignedRequestMaxAge, } a.mux = handler a.ctx = context.Background() a.ctx = ctxerr.WithConfig(a.ctx, ctxerr.Config{ StackMode: ctxerr.StackModeMultiStack, StringMode: ctxerr.StringModeNone, }) }) a.mux.ServeHTTP(w, r) }
func (a *Handler) contextChanger(r *http.Request) (*http.Request, error) { env, err := a.EnvParser.FromRequest(r) if err != nil { return nil, err } ctx := r.Context() ctx = ctxerr.WithConfig(ctx, ctxerr.Config{ StackMode: ctxerr.StackModeMultiStack, StringMode: ctxerr.StringModeNone, }) ctx = rellenv.WithEnv(ctx, env) ctx = static.NewContext(ctx, a.Static) return r.WithContext(ctx), nil }