Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.2 KiB
104 lines
2.2 KiB
// Copyright 2020 The Gitea Authors. All rights reserved. |
|
// Use of this source code is governed by a MIT-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package middlewares |
|
|
|
import ( |
|
"net/http" |
|
"net/url" |
|
"time" |
|
|
|
"code.gitea.io/gitea/modules/setting" |
|
) |
|
|
|
// NewCookie creates a cookie |
|
func NewCookie(name, value string, maxAge int) *http.Cookie { |
|
return &http.Cookie{ |
|
Name: name, |
|
Value: value, |
|
HttpOnly: true, |
|
Path: setting.SessionConfig.CookiePath, |
|
Domain: setting.SessionConfig.Domain, |
|
MaxAge: maxAge, |
|
Secure: setting.SessionConfig.Secure, |
|
} |
|
} |
|
|
|
// SetCookie set the cookies |
|
// TODO: Copied from gitea.com/macaron/macaron and should be improved after macaron removed. |
|
func SetCookie(resp http.ResponseWriter, name string, value string, others ...interface{}) { |
|
cookie := http.Cookie{} |
|
cookie.Name = name |
|
cookie.Value = url.QueryEscape(value) |
|
|
|
if len(others) > 0 { |
|
switch v := others[0].(type) { |
|
case int: |
|
cookie.MaxAge = v |
|
case int64: |
|
cookie.MaxAge = int(v) |
|
case int32: |
|
cookie.MaxAge = int(v) |
|
case func(*http.Cookie): |
|
v(&cookie) |
|
} |
|
} |
|
|
|
cookie.Path = "/" |
|
if len(others) > 1 { |
|
if v, ok := others[1].(string); ok && len(v) > 0 { |
|
cookie.Path = v |
|
} else if v, ok := others[1].(func(*http.Cookie)); ok { |
|
v(&cookie) |
|
} |
|
} |
|
|
|
if len(others) > 2 { |
|
if v, ok := others[2].(string); ok && len(v) > 0 { |
|
cookie.Domain = v |
|
} else if v, ok := others[1].(func(*http.Cookie)); ok { |
|
v(&cookie) |
|
} |
|
} |
|
|
|
if len(others) > 3 { |
|
switch v := others[3].(type) { |
|
case bool: |
|
cookie.Secure = v |
|
case func(*http.Cookie): |
|
v(&cookie) |
|
default: |
|
if others[3] != nil { |
|
cookie.Secure = true |
|
} |
|
} |
|
} |
|
|
|
if len(others) > 4 { |
|
if v, ok := others[4].(bool); ok && v { |
|
cookie.HttpOnly = true |
|
} else if v, ok := others[1].(func(*http.Cookie)); ok { |
|
v(&cookie) |
|
} |
|
} |
|
|
|
if len(others) > 5 { |
|
if v, ok := others[5].(time.Time); ok { |
|
cookie.Expires = v |
|
cookie.RawExpires = v.Format(time.UnixDate) |
|
} else if v, ok := others[1].(func(*http.Cookie)); ok { |
|
v(&cookie) |
|
} |
|
} |
|
|
|
if len(others) > 6 { |
|
for _, other := range others[6:] { |
|
if v, ok := other.(func(*http.Cookie)); ok { |
|
v(&cookie) |
|
} |
|
} |
|
} |
|
|
|
resp.Header().Add("Set-Cookie", cookie.String()) |
|
}
|
|
|