// Handle handles all HTTP requests which // have no been caught via static file // handler or other middlewares. func (r *React) Handle(c *echo.Context) error { UUID := c.Get("uuid").(*uuid.UUID) defer func() { if r := recover(); r != nil { c.Render(http.StatusInternalServerError, "react.html", Resp{ UUID: UUID.String(), Error: r.(string), }) } }() vm := r.get() start := time.Now() select { case re := <-vm.Handle(map[string]interface{}{ "url": c.Request().URL.String(), "headers": c.Request().Header, "uuid": UUID.String(), }): re.RenderTime = time.Since(start) // Return vm back to the pool r.put(vm) // Handle the Response if len(re.Redirect) == 0 && len(re.Error) == 0 { // If no redirection and no errors c.Response().Header().Set("X-React-Render-Time", fmt.Sprintf("%s", re.RenderTime)) return c.Render(http.StatusOK, "react.html", re) // If redirect } else if len(re.Redirect) != 0 { return c.Redirect(http.StatusMovedPermanently, re.Redirect) // If internal error } else if len(re.Error) != 0 { c.Response().Header().Set("X-React-Render-Time", fmt.Sprintf("%s", re.RenderTime)) return c.Render(http.StatusInternalServerError, "react.html", re) } case <-time.After(2 * time.Second): // release duktape context r.drop(vm) return c.Render(http.StatusInternalServerError, "react.html", Resp{ UUID: UUID.String(), Error: "time is out", }) } return nil }
// ConfHandler handle the app config, for example func (api *API) ConfHandler(c *echo.Context) error { app := c.Get("app").(*App) <-time.After(time.Millisecond * 500) c.JSON(200, app.Conf.Root) return nil }