
توی بعضی از آموزشها دیدم که برای راه اندازی یه وبسرور ساده در گولنگ روش زیر رو پیشنهاد میدهند.
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request){ fmt.Fprintf(w, "Hello world!") }) fmt.Printf("Starting server at port 8080\n") log.Fatal(http.ListenAndServe(":8080", nil)) }
اگر با گولنگ وبسرور سادهای نوشتهاید، احتمالا تابهحال DefaultServeMux به گوشتان خورده.
در واقع ServeMux یک روتر است که وظیفه ارتباط درخواست با url از پیش تعیین شده و اجرای `handler` مورد نظر را دارد. http.HandleFunc و http.Handle برای ثبت handler در DeafultServeMux استفاده میشود. مشکل این است که DeafultServeMux یک متغیر گلوبال است.
var DefaultServeMux = new(ServeMux)
اگر پکیجهای خارجی رو وارد و استفاده میکنین، اونها هم این امکان رو دارند که در DefaultHandlerMux بتوانند handler خودشون رو ثبت کنن!
package malicious import ( "fmt" "net/http" "os" ) func init() { http.HandleFunc("/env", printEnvHandler) } func printEnvHandler(w http.ResponseWriter, r *http.Request) { for _, env := range os.Environ() { fmt.Fprintf(w, "%s\n", env) } }
برای جلوگیری کافیه ServeMux رو خودتون تعریف کنین.
mux := http.NewServeMux() mux.HandleFunc("/hello", helloHandler) http.ListenAndServe(":8080", mux)