از DefaultServeMux استفاده نکنیم


توی بعضی از آموزش‌ها دیدم که برای راه اندازی یه وب‌سرور ساده در گولنگ روش زیر رو پیشنهاد می‌دهند.

package main

import (
  &quotfmt&quot
  &quotlog&quot
  &quotnet/http&quot
)

func main() {
  http.HandleFunc(&quot/hello&quot, func(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, &quotHello world!&quot)
  })

  fmt.Printf(&quotStarting server at port 8080\n&quot)
  log.Fatal(http.ListenAndServe(&quot:8080&quot, nil))
}

اگر با گولنگ وب‌سرور ساده‌ای نوشته‌اید، احتمالا تابه‌حال DefaultServeMux به گوشتان خورده.

در واقع ServeMux یک روتر است که وظیفه ارتباط درخواست با url از پیش تعیین شده و اجرای `handler` مورد نظر را دارد. http.HandleFunc و http.Handle برای ثبت handler در DeafultServeMux استفاده میشود. مشکل این است که DeafultServeMux یک متغیر گلوبال است.

var DefaultServeMux = new(ServeMux)

اگر پکیج‌های خارجی رو وارد و استفاده میکنین، اون‌ها هم این امکان رو دارند که در DefaultHandlerMux بتوانند handler خودشون رو ثبت کنن!

package malicious

import (
  &quotfmt&quot
  &quotnet/http&quot
  &quotos&quot
)

func init() {
  http.HandleFunc(&quot/env&quot, printEnvHandler)
}

func printEnvHandler(w http.ResponseWriter, r *http.Request) {
  for _, env := range os.Environ() {
    fmt.Fprintf(w, &quot%s\n&quot, env)
  }
}

برای جلوگیری کافیه ServeMux رو خودتون تعریف کنین.

mux := http.NewServeMux()
mux.HandleFunc(&quot/hello&quot, helloHandler) 
http.ListenAndServe(&quot:8080&quot, mux)