| 1482 | } |
| 1483 | |
| 1484 | func (app *App) init() *App { |
| 1485 | func() { |
| 1486 | // lock application |
| 1487 | app.mutex.Lock() |
| 1488 | defer app.mutex.Unlock() |
| 1489 | |
| 1490 | // Initialize Services when needed, |
| 1491 | // panics if there is an error starting them. |
| 1492 | app.initServices() |
| 1493 | |
| 1494 | // Only load templates if a view engine is specified |
| 1495 | if app.config.Views != nil { |
| 1496 | if err := app.config.Views.Load(); err != nil { |
| 1497 | log.Warnf("failed to load views: %v", err) |
| 1498 | } |
| 1499 | } |
| 1500 | |
| 1501 | // create fasthttp server |
| 1502 | app.server = &fasthttp.Server{ |
| 1503 | Logger: &disableLogger{}, |
| 1504 | LogAllErrors: false, |
| 1505 | ErrorHandler: app.serverErrorHandler, |
| 1506 | } |
| 1507 | |
| 1508 | // fasthttp server settings |
| 1509 | app.server.Handler = app.selectRequestHandler() |
| 1510 | app.server.Name = app.config.ServerHeader |
| 1511 | app.server.Concurrency = app.config.Concurrency |
| 1512 | app.server.NoDefaultDate = app.config.DisableDefaultDate |
| 1513 | app.server.NoDefaultContentType = app.config.DisableDefaultContentType |
| 1514 | app.server.DisableHeaderNamesNormalizing = app.config.DisableHeaderNormalizing |
| 1515 | app.server.DisableKeepalive = app.config.DisableKeepalive |
| 1516 | app.server.MaxRequestBodySize = app.config.BodyLimit |
| 1517 | app.server.NoDefaultServerHeader = app.config.ServerHeader == "" |
| 1518 | app.server.ReadTimeout = app.config.ReadTimeout |
| 1519 | app.server.WriteTimeout = app.config.WriteTimeout |
| 1520 | app.server.IdleTimeout = app.config.IdleTimeout |
| 1521 | app.server.ReadBufferSize = app.config.ReadBufferSize |
| 1522 | app.server.WriteBufferSize = app.config.WriteBufferSize |
| 1523 | app.server.GetOnly = app.config.GETOnly |
| 1524 | app.server.ReduceMemoryUsage = app.config.ReduceMemoryUsage |
| 1525 | app.server.StreamRequestBody = app.config.StreamRequestBody |
| 1526 | app.server.DisablePreParseMultipartForm = app.config.DisablePreParseMultipartForm |
| 1527 | }() |
| 1528 | |
| 1529 | // Register the Services shutdown handler once the app is initialized and unlocked. |
| 1530 | app.Hooks().OnPostShutdown(func(_ error) error { |
| 1531 | if err := app.shutdownServices(app.servicesShutdownCtx()); err != nil { |
| 1532 | log.Errorf("failed to shutdown services: %v", err) |
| 1533 | } |
| 1534 | if app.sharedState != nil && app.sharedState.storage != nil { |
| 1535 | if err := app.sharedState.Close(); err != nil { |
| 1536 | log.Errorf("failed to close sharedState: %v", err) |
| 1537 | } |
| 1538 | } |
| 1539 | return nil |
| 1540 | }) |
| 1541 | |