util.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package common
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/binary"
  6. "github.com/cnlh/nps/lib/crypt"
  7. "github.com/cnlh/nps/lib/pool"
  8. "io"
  9. "io/ioutil"
  10. "net"
  11. "net/http"
  12. "os"
  13. "regexp"
  14. "strconv"
  15. "strings"
  16. )
  17. //Judging Compression Mode
  18. func GetCompressType(compress string) (int, int) {
  19. switch compress {
  20. case "":
  21. return COMPRESS_NONE_DECODE, COMPRESS_NONE_ENCODE
  22. case "snappy":
  23. return COMPRESS_SNAPY_DECODE, COMPRESS_SNAPY_ENCODE
  24. default:
  25. return COMPRESS_NONE_DECODE, COMPRESS_NONE_ENCODE
  26. }
  27. return COMPRESS_NONE_DECODE, COMPRESS_NONE_ENCODE
  28. }
  29. //Get the corresponding IP address through domain name
  30. func GetHostByName(hostname string) string {
  31. if !DomainCheck(hostname) {
  32. return hostname
  33. }
  34. ips, _ := net.LookupIP(hostname)
  35. if ips != nil {
  36. for _, v := range ips {
  37. if v.To4() != nil {
  38. return v.String()
  39. }
  40. }
  41. }
  42. return ""
  43. }
  44. //Check the legality of domain
  45. func DomainCheck(domain string) bool {
  46. var match bool
  47. IsLine := "^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/)"
  48. NotLine := "^((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}"
  49. match, _ = regexp.MatchString(IsLine, domain)
  50. if !match {
  51. match, _ = regexp.MatchString(NotLine, domain)
  52. }
  53. return match
  54. }
  55. //Check if the Request request is validated
  56. func CheckAuth(r *http.Request, user, passwd string) bool {
  57. s := strings.SplitN(r.Header.Get("Authorization"), " ", 2)
  58. if len(s) != 2 {
  59. return false
  60. }
  61. b, err := base64.StdEncoding.DecodeString(s[1])
  62. if err != nil {
  63. return false
  64. }
  65. pair := strings.SplitN(string(b), ":", 2)
  66. if len(pair) != 2 {
  67. return false
  68. }
  69. return pair[0] == user && pair[1] == passwd
  70. }
  71. //get bool by str
  72. func GetBoolByStr(s string) bool {
  73. switch s {
  74. case "1", "true":
  75. return true
  76. }
  77. return false
  78. }
  79. //get str by bool
  80. func GetStrByBool(b bool) string {
  81. if b {
  82. return "1"
  83. }
  84. return "0"
  85. }
  86. //int
  87. func GetIntNoErrByStr(str string) int {
  88. i, _ := strconv.Atoi(str)
  89. return i
  90. }
  91. //Get verify value
  92. func Getverifyval(vkey string) string {
  93. return crypt.Md5(vkey)
  94. }
  95. //Change headers and host of request
  96. func ChangeHostAndHeader(r *http.Request, host string, header string, addr string) {
  97. if host != "" {
  98. r.Host = host
  99. }
  100. if header != "" {
  101. h := strings.Split(header, "\n")
  102. for _, v := range h {
  103. hd := strings.Split(v, ":")
  104. if len(hd) == 2 {
  105. r.Header.Set(hd[0], hd[1])
  106. }
  107. }
  108. }
  109. addr = strings.Split(addr, ":")[0]
  110. r.Header.Set("X-Forwarded-For", addr)
  111. r.Header.Set("X-Real-IP", addr)
  112. }
  113. //Read file content by file path
  114. func ReadAllFromFile(filePath string) ([]byte, error) {
  115. f, err := os.Open(filePath)
  116. if err != nil {
  117. return nil, err
  118. }
  119. return ioutil.ReadAll(f)
  120. }
  121. // FileExists reports whether the named file or directory exists.
  122. func FileExists(name string) bool {
  123. if _, err := os.Stat(name); err != nil {
  124. if os.IsNotExist(err) {
  125. return false
  126. }
  127. }
  128. return true
  129. }
  130. //Judge whether the TCP port can open normally
  131. func TestTcpPort(port int) bool {
  132. l, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), port, ""})
  133. defer func() {
  134. if l != nil {
  135. l.Close()
  136. }
  137. }()
  138. if err != nil {
  139. return false
  140. }
  141. return true
  142. }
  143. //Judge whether the UDP port can open normally
  144. func TestUdpPort(port int) bool {
  145. l, err := net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), port, ""})
  146. defer func() {
  147. if l != nil {
  148. l.Close()
  149. }
  150. }()
  151. if err != nil {
  152. return false
  153. }
  154. return true
  155. }
  156. //Write length and individual byte data
  157. //Length prevents sticking
  158. //# Characters are used to separate data
  159. func BinaryWrite(raw *bytes.Buffer, v ...string) {
  160. buffer := new(bytes.Buffer)
  161. var l int32
  162. for _, v := range v {
  163. l += int32(len([]byte(v))) + int32(len([]byte(CONN_DATA_SEQ)))
  164. binary.Write(buffer, binary.LittleEndian, []byte(v))
  165. binary.Write(buffer, binary.LittleEndian, []byte(CONN_DATA_SEQ))
  166. }
  167. binary.Write(raw, binary.LittleEndian, l)
  168. binary.Write(raw, binary.LittleEndian, buffer.Bytes())
  169. }
  170. func InStrArr(arr []string, val string) bool {
  171. for _, v := range arr {
  172. if v == val {
  173. return true
  174. }
  175. }
  176. return false
  177. }
  178. func InIntArr(arr []int, val int) bool {
  179. for _, v := range arr {
  180. if v == val {
  181. return true
  182. }
  183. }
  184. return false
  185. }
  186. func GetPorts(p string) []int {
  187. var ps []int
  188. arr := strings.Split(p, ",")
  189. for _, v := range arr {
  190. fw := strings.Split(v, "-")
  191. if len(fw) == 2 {
  192. if IsPort(fw[0]) && IsPort(fw[1]) {
  193. start, _ := strconv.Atoi(fw[0])
  194. end, _ := strconv.Atoi(fw[1])
  195. for i := start; i <= end; i++ {
  196. ps = append(ps, i)
  197. }
  198. } else {
  199. continue
  200. }
  201. } else if IsPort(v) {
  202. p, _ := strconv.Atoi(v)
  203. ps = append(ps, p)
  204. }
  205. }
  206. return ps
  207. }
  208. func IsPort(p string) bool {
  209. pi, err := strconv.Atoi(p)
  210. if err != nil {
  211. return false
  212. }
  213. if pi > 65536 || pi < 1 {
  214. return false
  215. }
  216. return true
  217. }
  218. func FormatAddress(s string) string {
  219. if strings.Contains(s, ":") {
  220. return s
  221. }
  222. return "127.0.0.1:" + s
  223. }
  224. func GetIpByAddr(addr string) string {
  225. arr := strings.Split(addr, ":")
  226. return arr[0]
  227. }
  228. func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
  229. buf := pool.BufPoolCopy.Get().([]byte)
  230. for {
  231. nr, er := src.Read(buf)
  232. if nr > 0 {
  233. nw, ew := dst.Write(buf[0:nr])
  234. if nw > 0 {
  235. written += int64(nw)
  236. }
  237. if ew != nil {
  238. err = ew
  239. break
  240. }
  241. if nr != nw {
  242. err = io.ErrShortWrite
  243. break
  244. }
  245. }
  246. if er != nil {
  247. if er != io.EOF {
  248. err = er
  249. }
  250. break
  251. }
  252. }
  253. defer pool.PutBufPoolCopy(buf)
  254. return written, err
  255. }