client.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package client
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net"
  7. "net/http"
  8. "strconv"
  9. "strings"
  10. "github.com/fatedier/frp/client"
  11. "github.com/fatedier/frp/pkg/util/util"
  12. )
  13. type Client struct {
  14. address string
  15. authUser string
  16. authPwd string
  17. }
  18. func New(host string, port int) *Client {
  19. return &Client{
  20. address: net.JoinHostPort(host, strconv.Itoa(port)),
  21. }
  22. }
  23. func (c *Client) SetAuth(user, pwd string) {
  24. c.authUser = user
  25. c.authPwd = pwd
  26. }
  27. func (c *Client) GetProxyStatus(name string) (*client.ProxyStatusResp, error) {
  28. req, err := http.NewRequest("GET", "http://"+c.address+"/api/status", nil)
  29. if err != nil {
  30. return nil, err
  31. }
  32. content, err := c.do(req)
  33. if err != nil {
  34. return nil, err
  35. }
  36. allStatus := make(client.StatusResp)
  37. if err = json.Unmarshal([]byte(content), &allStatus); err != nil {
  38. return nil, fmt.Errorf("unmarshal http response error: %s", strings.TrimSpace(content))
  39. }
  40. for _, pss := range allStatus {
  41. for _, ps := range pss {
  42. if ps.Name == name {
  43. return &ps, nil
  44. }
  45. }
  46. }
  47. return nil, fmt.Errorf("no proxy status found")
  48. }
  49. func (c *Client) GetAllProxyStatus() (client.StatusResp, error) {
  50. req, err := http.NewRequest("GET", "http://"+c.address+"/api/status", nil)
  51. if err != nil {
  52. return nil, err
  53. }
  54. content, err := c.do(req)
  55. if err != nil {
  56. return nil, err
  57. }
  58. allStatus := make(client.StatusResp)
  59. if err = json.Unmarshal([]byte(content), &allStatus); err != nil {
  60. return nil, fmt.Errorf("unmarshal http response error: %s", strings.TrimSpace(content))
  61. }
  62. return allStatus, nil
  63. }
  64. func (c *Client) Reload() error {
  65. req, err := http.NewRequest("GET", "http://"+c.address+"/api/reload", nil)
  66. if err != nil {
  67. return err
  68. }
  69. _, err = c.do(req)
  70. return err
  71. }
  72. func (c *Client) Stop() error {
  73. req, err := http.NewRequest("POST", "http://"+c.address+"/api/stop", nil)
  74. if err != nil {
  75. return err
  76. }
  77. _, err = c.do(req)
  78. return err
  79. }
  80. func (c *Client) GetConfig() (string, error) {
  81. req, err := http.NewRequest("GET", "http://"+c.address+"/api/config", nil)
  82. if err != nil {
  83. return "", err
  84. }
  85. return c.do(req)
  86. }
  87. func (c *Client) UpdateConfig(content string) error {
  88. req, err := http.NewRequest("PUT", "http://"+c.address+"/api/config", strings.NewReader(content))
  89. if err != nil {
  90. return err
  91. }
  92. _, err = c.do(req)
  93. return err
  94. }
  95. func (c *Client) setAuthHeader(req *http.Request) {
  96. if c.authUser != "" || c.authPwd != "" {
  97. req.Header.Set("Authorization", util.BasicAuth(c.authUser, c.authPwd))
  98. }
  99. }
  100. func (c *Client) do(req *http.Request) (string, error) {
  101. c.setAuthHeader(req)
  102. resp, err := http.DefaultClient.Do(req)
  103. if err != nil {
  104. return "", err
  105. }
  106. defer resp.Body.Close()
  107. if resp.StatusCode != 200 {
  108. return "", fmt.Errorf("api status code [%d]", resp.StatusCode)
  109. }
  110. buf, err := io.ReadAll(resp.Body)
  111. if err != nil {
  112. return "", err
  113. }
  114. return string(buf), nil
  115. }