transfer.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package httpsession
  2. import (
  3. "net/http"
  4. "net/url"
  5. "sync"
  6. "time"
  7. )
  8. // Transfer provide and set sessionid
  9. type Transfer interface {
  10. SetMaxAge(maxAge time.Duration)
  11. Get(req *http.Request) (Id, error)
  12. Set(req *http.Request, rw http.ResponseWriter, id Id)
  13. Clear(rw http.ResponseWriter)
  14. }
  15. // CookieRetriever provide sessionid from cookie
  16. type CookieTransfer struct {
  17. Name string
  18. MaxAge time.Duration
  19. Lock sync.Mutex
  20. Secure bool
  21. RootPath string
  22. Domain string
  23. }
  24. func NewCookieTransfer(name string, maxAge time.Duration, secure bool, rootPath, domain string) *CookieTransfer {
  25. return &CookieTransfer{
  26. Name: name,
  27. MaxAge: maxAge,
  28. Secure: secure,
  29. RootPath: rootPath,
  30. Domain: domain,
  31. }
  32. }
  33. func (transfer *CookieTransfer) SetMaxAge(maxAge time.Duration) {
  34. transfer.MaxAge = maxAge
  35. }
  36. func (transfer *CookieTransfer) Get(req *http.Request) (Id, error) {
  37. cookie, err := req.Cookie(transfer.Name)
  38. if err != nil {
  39. if err == http.ErrNoCookie {
  40. return "", nil
  41. }
  42. return "", err
  43. }
  44. if cookie.Value == "" {
  45. return Id(""), nil
  46. }
  47. id, _ := url.QueryUnescape(cookie.Value)
  48. return Id(id), nil
  49. }
  50. func (transfer *CookieTransfer) Set(req *http.Request, rw http.ResponseWriter, id Id) {
  51. sid := url.QueryEscape(string(id))
  52. transfer.Lock.Lock()
  53. defer transfer.Lock.Unlock()
  54. cookie, _ := req.Cookie(transfer.Name)
  55. if cookie == nil {
  56. cookie = &http.Cookie{
  57. Name: transfer.Name,
  58. Value: sid,
  59. Path: transfer.RootPath,
  60. Domain: transfer.Domain,
  61. HttpOnly: true,
  62. Secure: transfer.Secure,
  63. }
  64. if transfer.MaxAge > 0 {
  65. cookie.MaxAge = int(transfer.MaxAge / time.Second)
  66. //cookie.Expires = time.Now().Add(transfer.maxAge).UTC()
  67. }
  68. req.AddCookie(cookie)
  69. } else {
  70. cookie.Value = sid
  71. if transfer.MaxAge > 0 {
  72. cookie.MaxAge = int(transfer.MaxAge / time.Second)
  73. //cookie.Expires = time.Now().Add(transfer.maxAge)
  74. }
  75. cookie.Domain = transfer.Domain
  76. }
  77. http.SetCookie(rw, cookie)
  78. }
  79. func (transfer *CookieTransfer) Clear(rw http.ResponseWriter) {
  80. cookie := http.Cookie{
  81. Name: transfer.Name,
  82. Path: transfer.RootPath,
  83. Domain: transfer.Domain,
  84. HttpOnly: true,
  85. Secure: transfer.Secure,
  86. Expires: time.Date(0, 1, 1, 0, 0, 0, 0, time.Local),
  87. MaxAge: -1,
  88. }
  89. http.SetCookie(rw, &cookie)
  90. }
  91. var _ Transfer = NewCookieTransfer("test", 0, false, "/", Domain)
  92. // CookieRetriever provide sessionid from url
  93. /*type UrlTransfer struct {
  94. }
  95. func NewUrlTransfer() *UrlTransfer {
  96. return &UrlTransfer{}
  97. }
  98. func (transfer *UrlTransfer) Get(req *http.Request) (string, error) {
  99. return "", nil
  100. }
  101. func (transfer *UrlTransfer) Set(rw http.ResponseWriter, id Id) {
  102. }
  103. var (
  104. _ Transfer = NewUrlTransfer()
  105. )
  106. */
  107. //for SWFUpload ...
  108. func NewCookieUrlTransfer(name string, maxAge time.Duration, secure bool, rootPath string) *CookieUrlTransfer {
  109. return &CookieUrlTransfer{
  110. CookieTransfer: CookieTransfer{
  111. Name: name,
  112. MaxAge: maxAge,
  113. Secure: secure,
  114. RootPath: rootPath,
  115. },
  116. }
  117. }
  118. type CookieUrlTransfer struct {
  119. CookieTransfer
  120. }
  121. func (transfer *CookieUrlTransfer) Get(req *http.Request) (Id, error) {
  122. sessionId := req.URL.Query().Get(transfer.Name)
  123. if sessionId != "" {
  124. sessionId, _ = url.QueryUnescape(sessionId)
  125. return Id(sessionId), nil
  126. }
  127. return transfer.CookieTransfer.Get(req)
  128. }