provider.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package clashapi
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/go-chi/chi/v5"
  7. "github.com/go-chi/render"
  8. )
  9. func proxyProviderRouter(server *Server, router adapter.Router) http.Handler {
  10. r := chi.NewRouter()
  11. r.Get("/", getProviders(server, router))
  12. r.Route("/{name}", func(r chi.Router) {
  13. r.Use(parseProviderName, findProviderByName)
  14. r.Get("/", getProvider)
  15. r.Put("/", updateProvider)
  16. r.Get("/healthcheck", healthCheckProvider)
  17. })
  18. return r
  19. }
  20. func getProviders(server *Server, router adapter.Router) func(w http.ResponseWriter, r *http.Request) {
  21. return func(w http.ResponseWriter, r *http.Request) {
  22. var proxies []any
  23. proxies = append(proxies, render.M{
  24. "history": []*DelayHistory{},
  25. "name": "DIRECT",
  26. "type": "Direct",
  27. "udp": true,
  28. })
  29. proxies = append(proxies, render.M{
  30. "history": []*DelayHistory{},
  31. "name": "REJECT",
  32. "type": "Reject",
  33. "udp": true,
  34. })
  35. for _, detour := range router.Outbounds() {
  36. proxies = append(proxies, proxyInfo(server, detour))
  37. }
  38. render.JSON(w, r, render.M{
  39. "providers": render.M{
  40. "default": render.M{
  41. "name": "default",
  42. "type": "Proxy",
  43. "proxies": proxies,
  44. "vehicleType": "Compatible",
  45. },
  46. },
  47. })
  48. }
  49. }
  50. func getProvider(w http.ResponseWriter, r *http.Request) {
  51. /*provider := r.Context().Value(CtxKeyProvider).(provider.ProxyProvider)
  52. render.JSON(w, r, provider)*/
  53. render.NoContent(w, r)
  54. }
  55. func updateProvider(w http.ResponseWriter, r *http.Request) {
  56. /*provider := r.Context().Value(CtxKeyProvider).(provider.ProxyProvider)
  57. if err := provider.Update(); err != nil {
  58. render.Status(r, http.StatusServiceUnavailable)
  59. render.JSON(w, r, newError(err.Error()))
  60. return
  61. }*/
  62. render.NoContent(w, r)
  63. }
  64. func healthCheckProvider(w http.ResponseWriter, r *http.Request) {
  65. /*provider := r.Context().Value(CtxKeyProvider).(provider.ProxyProvider)
  66. provider.HealthCheck()*/
  67. render.NoContent(w, r)
  68. }
  69. func parseProviderName(next http.Handler) http.Handler {
  70. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  71. name := getEscapeParam(r, "name")
  72. ctx := context.WithValue(r.Context(), CtxKeyProviderName, name)
  73. next.ServeHTTP(w, r.WithContext(ctx))
  74. })
  75. }
  76. func findProviderByName(next http.Handler) http.Handler {
  77. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  78. /*name := r.Context().Value(CtxKeyProviderName).(string)
  79. providers := tunnel.ProxyProviders()
  80. provider, exist := providers[name]
  81. if !exist {*/
  82. render.Status(r, http.StatusNotFound)
  83. render.JSON(w, r, ErrNotFound)
  84. //return
  85. //}
  86. // ctx := context.WithValue(r.Context(), CtxKeyProvider, provider)
  87. // next.ServeHTTP(w, r.WithContext(ctx))
  88. })
  89. }