cookie.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package lxrod
  2. import (
  3. "net/http"
  4. "net/http/cookiejar"
  5. "net/url"
  6. "time"
  7. "github.com/go-rod/rod"
  8. "github.com/go-rod/rod/lib/proto"
  9. )
  10. // 将 p 中所有 cookie 提取到 jar 中。cookie 的 domain 设置为 u。
  11. // TODO: 双向绑定
  12. func SetCookieFor(p *rod.Page, u *url.URL) (http.CookieJar, error) {
  13. jar, _ := cookiejar.New(nil)
  14. cookies, err := p.Cookies(nil)
  15. if err != nil {
  16. return nil, err
  17. }
  18. cs := make([]*http.Cookie, len(cookies))
  19. for i, c := range cookies {
  20. cs[i] = CookieFrom(c)
  21. }
  22. jar.SetCookies(u, cs)
  23. return jar, nil
  24. }
  25. // 将 rod 的 cookie 格式转换为 go http 的 cookie。
  26. // go 1.19 以后的新字段不支持。
  27. func CookieFrom(c *proto.NetworkCookie) *http.Cookie {
  28. var t time.Time
  29. if c.Expires != -1 {
  30. t = c.Expires.Time()
  31. }
  32. return &http.Cookie{
  33. Name: c.Name,
  34. Value: c.Value,
  35. Path: c.Path,
  36. Domain: c.Domain,
  37. Expires: t,
  38. Secure: c.Secure,
  39. HttpOnly: c.HTTPOnly,
  40. SameSite: SameSite(c.SameSite),
  41. }
  42. }
  43. // 从 rod cookie 中提取创建 go cookie 所用的 SameSite 数据
  44. func SameSite(s proto.NetworkCookieSameSite) http.SameSite {
  45. switch s {
  46. case proto.NetworkCookieSameSiteStrict:
  47. return http.SameSiteStrictMode
  48. case proto.NetworkCookieSameSiteLax:
  49. return http.SameSiteLaxMode
  50. case proto.NetworkCookieSameSiteNone:
  51. return http.SameSiteNoneMode
  52. default:
  53. return http.SameSiteDefaultMode
  54. }
  55. }