Let's Go بهبودهای سرور و امنیت › ساختار http.Server
قبلی · فهرست · بعدی
فصل ۹.۱.

ساختار http.Server

تا اینجا در این کتاب از تابع میانبر http.ListenAndServe() برای راه‌اندازی سرور استفاده کرده‌ایم.

اگرچه http.ListenAndServe() در مثال‌های کوتاه و آموزش‌ها بسیار مفید است، در برنامه‌های واقعی معمول‌تر است که به صورت دستی یک ساختار http.Server ایجاد و استفاده کنیم. انجام این کار فرصتی برای سفارشی‌سازی رفتار سرور شما باز می‌کند که دقیقاً همان کاری است که در این بخش از کتاب انجام خواهیم داد.

پس برای آماده‌سازی، بیایید به سرعت فایل main.go خود را به‌روزرسانی کنیم تا استفاده از میانبر http.ListenAndServe() را متوقف کنیم و به جای آن به صورت دستی یک ساختار http.Server ایجاد و استفاده کنیم.

File: cmd/web/main.go
package main

...

func main() {
    addr := flag.String("addr", ":4000", "HTTP network address")
    dsn := flag.String("dsn", "web:pass@/snippetbox?parseTime=true", "MySQL data source name")
    flag.Parse()

    logger := slog.New(slog.NewTextHandler(os.Stdout, nil))

    db, err := openDB(*dsn)
    if err != nil {
        logger.Error(err.Error())
        os.Exit(1)
    }
    defer db.Close()

    templateCache, err := newTemplateCache()
    if err != nil {
        logger.Error(err.Error())
        os.Exit(1)
    }

    formDecoder := form.NewDecoder()

    sessionManager := scs.New()
    sessionManager.Store = mysqlstore.New(db)
    sessionManager.Lifetime = 12 * time.Hour

    app := &application{
        logger:         logger,
        snippets:       &models.SnippetModel{DB: db},
        templateCache:  templateCache,
        formDecoder:    formDecoder,
        sessionManager: sessionManager,
    }

    // Initialize a new http.Server struct. We set the Addr and Handler fields so
    // that the server uses the same network address and routes as before.
    srv := &http.Server{
        Addr:    *addr,
        Handler: app.routes(),
    }

    logger.Info("starting server", "addr", srv.Addr)

    // Call the ListenAndServe() method on our new http.Server struct to start 
    // the server.
    err = srv.ListenAndServe()
    logger.Error(err.Error())
    os.Exit(1)
}

...

این یک تغییر کوچک است که رفتار برنامه ما را (هنوز!) تحت تأثیر قرار نمی‌دهد، اما ما را برای کارهای آینده به خوبی آماده می‌کند.