server.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package main
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "log"
  5. "net/http"
  6. "proxy/internal/dto"
  7. "proxy/internal/model"
  8. "proxy/internal/util"
  9. "sync"
  10. "time"
  11. )
  12. var nodes = make([]*model.Node, 0)
  13. var locker = sync.RWMutex{}
  14. func register(c *gin.Context) {
  15. locker.Lock()
  16. defer locker.Unlock()
  17. ip := c.RemoteIP()
  18. var request dto.RegisterRequest
  19. if err := c.ShouldBindJSON(&request); err != nil {
  20. dto.BadRequest(c, err)
  21. return
  22. }
  23. for _, node := range nodes {
  24. if node.Ip == ip {
  25. node.Ip = ip
  26. node.Secret = request.Secret
  27. node.CountryCode = request.CountryCode
  28. node.LastUpdateTime = time.Now()
  29. c.JSON(http.StatusOK, dto.RegisterResponse{
  30. Response: dto.NewOkResponse(),
  31. Data: dto.RegisterResult{
  32. Success: true,
  33. },
  34. })
  35. return
  36. }
  37. }
  38. node := &model.Node{
  39. Ip: ip,
  40. Secret: request.Secret,
  41. LastUpdateTime: time.Now(),
  42. }
  43. nodes = append(nodes, node)
  44. log.Printf("update nodes: %+v", nodes)
  45. }
  46. func list(c *gin.Context) {
  47. locker.RLock()
  48. defer locker.RUnlock()
  49. dtoNodes := make(map[string][]dto.Node)
  50. for _, node := range nodes {
  51. if _, ok := dtoNodes[node.CountryCode]; !ok {
  52. dtoNodes[node.CountryCode] = make([]dto.Node, 0)
  53. }
  54. if node.LastUpdateTime.Add(10 * time.Second).After(time.Now()) {
  55. dtoNodes[node.CountryCode] = append(dtoNodes[node.CountryCode], dto.Node{
  56. Ip: node.Ip,
  57. })
  58. }
  59. }
  60. listResult := make([]dto.ListResult, len(dtoNodes))
  61. i := 0
  62. for countryCode, itemNodes := range dtoNodes {
  63. listResult[i] = dto.ListResult{
  64. CountryCode: countryCode,
  65. Nodes: itemNodes,
  66. }
  67. i++
  68. }
  69. c.JSON(http.StatusOK, dto.ListResponse{
  70. Response: dto.NewOkResponse(),
  71. Data: listResult,
  72. })
  73. }
  74. func detail(c *gin.Context) {
  75. locker.RLock()
  76. defer locker.RUnlock()
  77. var request dto.DetailRequest
  78. if err := c.ShouldBindQuery(&request); err != nil {
  79. dto.BadRequest(c, err)
  80. return
  81. }
  82. for _, node := range nodes {
  83. if node.Ip == request.Ip {
  84. secret, err := util.RsaEncrypt([]byte(node.Secret))
  85. if err != nil {
  86. dto.Error(c, err)
  87. return
  88. }
  89. c.Data(http.StatusOK, "application/octet-stream", secret)
  90. return
  91. }
  92. }
  93. c.JSON(http.StatusNotFound, gin.H{
  94. "message": "not found ip",
  95. })
  96. }
  97. func health(c *gin.Context) {
  98. c.JSON(http.StatusOK, gin.H{"status": "up"})
  99. }