func main() { o := ParseOpts() if o.ShowVersion { fmt.Println("sms-api-server", Version) os.Exit(0) } tx := &smpp.Transceiver{ Addr: o.SMPPAddr, User: os.Getenv("SMPP_USER"), Passwd: os.Getenv("SMPP_PASSWD"), } exit := make(chan os.Signal, 1) signal.Notify(exit, os.Interrupt, os.Kill) go func() { <-exit tx.Close() os.Exit(0) }() if o.ClientTLS { host, _, _ := net.SplitHostPort(tx.Addr) tx.TLS = &tls.Config{ ServerName: host, } if o.ClientTLSInsecure { tx.TLS.InsecureSkipVerify = true } } api := &apiserver.Handler{Prefix: o.APIPrefix, Tx: tx} conn := api.Register(http.DefaultServeMux) go func() { for c := range conn { m := fmt.Sprintf("SMPP connection status to %s: %s", o.SMPPAddr, c.Status()) if err := c.Error(); err != nil { m = fmt.Sprintf("%s (%v)", m, err) } log.Println(m) } }() if o.PublicDir != "" { fs := http.FileServer(http.Dir(o.PublicDir)) http.Handle("/", http.StripPrefix(o.APIPrefix, fs)) } mux := http.Handler(http.DefaultServeMux) if o.Log { var l *log.Logger if o.LogTS { l = log.New(os.Stderr, "", log.LstdFlags) } else { l = log.New(os.Stderr, "", 0) } mux = httplog.ApacheCombinedFormat(l)(mux.ServeHTTP) } err := ListenAndServe(o, mux) if err != nil { log.Fatal(err) } }
func (f *apiHandler) config(mc *httpmux.Config) error { mc.Prefix = f.conf.APIPrefix if f.conf.PublicDir != "" { mc.NotFound = f.publicDir() } if f.conf.UseXForwardedFor { mc.UseFunc(httplog.UseXForwardedFor) } if !f.conf.Silent { mc.UseFunc(httplog.ApacheCombinedFormat(f.conf.accessLogger())) } mc.UseFunc(f.metrics) if f.conf.RateLimitLimit > 0 { rl, err := newRateLimiter(f.conf) if err != nil { return fmt.Errorf("failed to create rate limiter: %v", err) } mc.Use(rl.Handle) } return nil }