server.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package handler
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "log"
  6. "net"
  7. "net/http"
  8. "time"
  9. "github.com/bjdgyc/anylink/base"
  10. "github.com/bjdgyc/anylink/pkg/proxyproto"
  11. "github.com/gorilla/mux"
  12. )
  13. func startTls() {
  14. var (
  15. err error
  16. addr = base.Cfg.ServerAddr
  17. certFile = base.Cfg.CertFile
  18. keyFile = base.Cfg.CertKey
  19. certs = make([]tls.Certificate, 1)
  20. ln net.Listener
  21. )
  22. // 判断证书文件
  23. //_, err = os.Stat(certFile)
  24. //if errors.Is(err, os.ErrNotExist) {
  25. // // 自动生成证书
  26. // certs[0], err = selfsign.GenerateSelfSignedWithDNS("vpn.anylink")
  27. //} else {
  28. // // 使用自定义证书
  29. // certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
  30. //}
  31. certs[0], err = tls.LoadX509KeyPair(certFile, keyFile)
  32. if err != nil {
  33. panic(err)
  34. }
  35. // 设置tls信息
  36. tlsConfig := &tls.Config{
  37. NextProtos: []string{"http/1.1"},
  38. MinVersion: tls.VersionTLS12,
  39. Certificates: certs,
  40. // InsecureSkipVerify: true,
  41. }
  42. srv := &http.Server{
  43. Addr: addr,
  44. Handler: initRoute(),
  45. TLSConfig: tlsConfig,
  46. ErrorLog: base.GetBaseLog(),
  47. }
  48. ln, err = net.Listen("tcp", addr)
  49. if err != nil {
  50. log.Fatal(err)
  51. }
  52. defer ln.Close()
  53. if base.Cfg.ProxyProtocol {
  54. ln = &proxyproto.Listener{Listener: ln, ProxyHeaderTimeout: time.Second * 5}
  55. }
  56. base.Info("listen server", addr)
  57. err = srv.ServeTLS(ln, "", "")
  58. if err != nil {
  59. base.Fatal(err)
  60. }
  61. }
  62. func initRoute() http.Handler {
  63. r := mux.NewRouter()
  64. r.HandleFunc("/", LinkHome).Methods(http.MethodGet)
  65. r.HandleFunc("/", LinkAuth).Methods(http.MethodPost)
  66. r.HandleFunc("/CSCOSSLC/tunnel", LinkTunnel).Methods(http.MethodConnect)
  67. r.HandleFunc("/otp_qr", LinkOtpQr).Methods(http.MethodGet)
  68. // r.HandleFunc("/profile.xml", func(w http.ResponseWriter, r *http.Request) {
  69. // w.Write([]byte(auth_profile))
  70. // }).Methods(http.MethodGet)
  71. r.PathPrefix("/files/").Handler(
  72. http.StripPrefix("/files/",
  73. http.FileServer(http.Dir(base.Cfg.FilesPath)),
  74. ),
  75. )
  76. r.NotFoundHandler = http.HandlerFunc(notFound)
  77. return r
  78. }
  79. func notFound(w http.ResponseWriter, r *http.Request) {
  80. // fmt.Println(r.RemoteAddr)
  81. // hu, _ := httputil.DumpRequest(r, true)
  82. // fmt.Println("NotFound: ", string(hu))
  83. w.WriteHeader(http.StatusNotFound)
  84. fmt.Fprintln(w, "404 page not found")
  85. }