util.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package tests
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "io/ioutil"
  8. "net"
  9. "net/http"
  10. "strings"
  11. "time"
  12. "github.com/fatedier/frp/client"
  13. frpNet "github.com/fatedier/frp/utils/net"
  14. )
  15. func getProxyStatus(name string) (status *client.ProxyStatusResp, err error) {
  16. req, err := http.NewRequest("GET", "http://"+ADMIN_ADDR+"/api/status", nil)
  17. if err != nil {
  18. return status, err
  19. }
  20. authStr := "Basic " + base64.StdEncoding.EncodeToString([]byte(ADMIN_USER+":"+ADMIN_PWD))
  21. req.Header.Add("Authorization", authStr)
  22. resp, err := http.DefaultClient.Do(req)
  23. if err != nil {
  24. return status, err
  25. } else {
  26. if resp.StatusCode != 200 {
  27. return status, fmt.Errorf("admin api status code [%d]", resp.StatusCode)
  28. }
  29. defer resp.Body.Close()
  30. body, err := ioutil.ReadAll(resp.Body)
  31. if err != nil {
  32. return status, err
  33. }
  34. allStatus := &client.StatusResp{}
  35. err = json.Unmarshal(body, &allStatus)
  36. if err != nil {
  37. return status, fmt.Errorf("unmarshal http response error: %s", strings.TrimSpace(string(body)))
  38. }
  39. for _, s := range allStatus.Tcp {
  40. if s.Name == name {
  41. return &s, nil
  42. }
  43. }
  44. for _, s := range allStatus.Udp {
  45. if s.Name == name {
  46. return &s, nil
  47. }
  48. }
  49. for _, s := range allStatus.Http {
  50. if s.Name == name {
  51. return &s, nil
  52. }
  53. }
  54. for _, s := range allStatus.Https {
  55. if s.Name == name {
  56. return &s, nil
  57. }
  58. }
  59. for _, s := range allStatus.Stcp {
  60. if s.Name == name {
  61. return &s, nil
  62. }
  63. }
  64. for _, s := range allStatus.Xtcp {
  65. if s.Name == name {
  66. return &s, nil
  67. }
  68. }
  69. }
  70. return status, errors.New("no proxy status found")
  71. }
  72. func sendTcpMsg(addr string, msg string) (res string, err error) {
  73. c, err := frpNet.ConnectTcpServer(addr)
  74. if err != nil {
  75. err = fmt.Errorf("connect to tcp server error: %v", err)
  76. return
  77. }
  78. defer c.Close()
  79. timer := time.Now().Add(5 * time.Second)
  80. c.SetDeadline(timer)
  81. c.Write([]byte(msg))
  82. buf := make([]byte, 2048)
  83. n, errRet := c.Read(buf)
  84. if errRet != nil {
  85. err = fmt.Errorf("read from tcp server error: %v", errRet)
  86. return
  87. }
  88. return string(buf[:n]), nil
  89. }
  90. func sendUdpMsg(addr string, msg string) (res string, err error) {
  91. udpAddr, errRet := net.ResolveUDPAddr("udp", addr)
  92. if errRet != nil {
  93. err = fmt.Errorf("resolve udp addr error: %v", err)
  94. return
  95. }
  96. conn, errRet := net.DialUDP("udp", nil, udpAddr)
  97. if errRet != nil {
  98. err = fmt.Errorf("dial udp server error: %v", err)
  99. return
  100. }
  101. defer conn.Close()
  102. _, err = conn.Write([]byte(msg))
  103. if err != nil {
  104. err = fmt.Errorf("write to udp server error: %v", err)
  105. return
  106. }
  107. buf := make([]byte, 2048)
  108. n, errRet := conn.Read(buf)
  109. if errRet != nil {
  110. err = fmt.Errorf("read from udp server error: %v", err)
  111. return
  112. }
  113. return string(buf[:n]), nil
  114. }
  115. func sendHttpMsg(method, url string, host string, header map[string]string) (code int, body string, err error) {
  116. req, errRet := http.NewRequest(method, url, nil)
  117. if errRet != nil {
  118. err = errRet
  119. return
  120. }
  121. if host != "" {
  122. req.Host = host
  123. }
  124. for k, v := range header {
  125. req.Header.Set(k, v)
  126. }
  127. resp, errRet := http.DefaultClient.Do(req)
  128. if errRet != nil {
  129. err = errRet
  130. return
  131. }
  132. code = resp.StatusCode
  133. buf, errRet := ioutil.ReadAll(resp.Body)
  134. if errRet != nil {
  135. err = errRet
  136. return
  137. }
  138. body = string(buf)
  139. return
  140. }
  141. func basicAuth(username, passwd string) string {
  142. auth := username + ":" + passwd
  143. return "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
  144. }