helper.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package server
  2. import (
  3. "crypto/md5"
  4. "fmt"
  5. "time"
  6. "github.com/giuem/ga-proxy/ga"
  7. "github.com/gin-gonic/gin"
  8. "github.com/gofrs/uuid"
  9. )
  10. func getUUID(c *gin.Context) string {
  11. uid, err := c.Cookie("uuid")
  12. if err != nil { // cookie no found
  13. uid = generateUUID(c.Request.UserAgent())
  14. c.SetCookie("uuid", uid, 2147483647, "/", "", false, false)
  15. }
  16. return uid
  17. }
  18. func generateUUID(name string) string {
  19. ns, err := uuid.NewV4()
  20. if err != nil {
  21. // error fallback
  22. unix32bits := uint32(time.Now().UTC().Unix())
  23. nameBytes := md5.Sum([]byte(name))
  24. return fmt.Sprintf("%x-%x-%x-%x-%x\n", unix32bits, nameBytes[0:2], nameBytes[2:4], nameBytes[4:6], nameBytes[6:12])
  25. }
  26. return uuid.NewV5(ns, name).String()
  27. }
  28. func getCommonData(c *gin.Context) ga.CommonData {
  29. return ga.CommonData{
  30. Version: 1,
  31. TrackingID: c.Query("ga"),
  32. ClientID: getUUID(c),
  33. UserIP: c.ClientIP(),
  34. UserAgent: c.Request.UserAgent(),
  35. DocumentReferer: c.Query("dr"),
  36. ScreenResolution: c.Query("sr"),
  37. ViewportSize: c.Query("vp"),
  38. DocumentEncoding: c.Query("de"),
  39. ScreenColors: c.Query("sd"),
  40. UserLanguage: c.Query("ul"),
  41. DocumentLink: c.Request.Referer(),
  42. DocumentTitle: c.Query("dt"),
  43. }
  44. }
  45. func getTimingData(c *gin.Context) ga.TimingData {
  46. return ga.TimingData{
  47. PageLoadedTime: c.Query("plt"),
  48. DNSTime: c.Query("dns"),
  49. PageDownloadedTime: c.Query("pdt"),
  50. RedirectTime: c.Query("rrt"),
  51. TCPTime: c.Query("tcp"),
  52. ServerResponseTime: c.Query("srt"),
  53. DomInteractiveTime: c.Query("dit"),
  54. ContentLoadedTime: c.Query("clt"),
  55. }
  56. }