Сохраняйте куки для поддерживаемого сеанса с помощью библиотеки fasthttp - PullRequest
0 голосов
/ 08 февраля 2020

Я недавно вытащил свои волосы, мне нужно найти способ сохранить куки после отправки запроса на URI, чтобы я мог отправлять запросы другим конечным точкам и поддерживать этот сеанс. Я пытаюсь добавить товар в корзину, но без сохранения файлов cookie корзина будет пуста. (корзина) В настоящее время я использую это для обработки файлов cookie, но, похоже, не пересылает файлы cookie на следующий запрос:

func (c *CookieClient) Do(req *fasthttp.Request, resp *fasthttp.Response) error {
for {
    zap.S().Info("Saving Cookie")
    if err := c.Client.Do(req, resp); err != nil {
        return err
    }

    statusCode := resp.Header.StatusCode()
    if statusCode != fasthttp.StatusMovedPermanently &&
        statusCode != fasthttp.StatusFound &&
        statusCode != fasthttp.StatusSeeOther &&
        statusCode != fasthttp.StatusTemporaryRedirect &&
        statusCode != fasthttp.StatusPermanentRedirect {
        break
    }

    location := resp.Header.PeekBytes(strLocation)
    if len(location) == 0 {
        return fmt.Errorf("Redirect with missing Location header")
    }

    u := req.URI()
    u.UpdateBytes(location)

    resp.Header.VisitAllCookie(func(key, value []byte) {
        c := fasthttp.AcquireCookie()
        defer fasthttp.ReleaseCookie(c)

        c.ParseBytes(value)

        if expire := c.Expire(); expire != fasthttp.CookieExpireUnlimited && expire.Before(time.Now()) {
            zap.S().Info("Deleting Expired Cookie")
            req.Header.DelCookieBytes(key)
        } else {
            req.Header.SetCookieBytesKV(key, c.Value())
        }
    })
}
return nil

}

1 Ответ

0 голосов
/ 08 февраля 2020

Вероятно, у авторов может быть эффективный способ:

Вы можете получить повара ie следующим способом, а затем переназначить его на другой запрос.

func ParseTokenFromRequest(ctx *fasthttp.RequestCtx) string {
    token := string(ctx.Request.Header.Cookie("GoLog-Token")) // GoLog-Token is the hardcoded name of the cookie
    return token
}

Тогда Вы можете создать повара ie с уже полученным значением:

//CreateCookie Method that return a cookie valorized as input (GoLog-Token as key)
func CreateCookie(key string, value string, expire int) *fasthttp.Cookie {
    if strings.Compare(key, "") == 0 {
        key = "GoLog-Token"
    }
    log.Debug("CreateCookie | Creating Cookie | Key: ", key, " | Val: ", value)
    authCookie := fasthttp.Cookie{}
    authCookie.SetKey(key)
    authCookie.SetValue(value)
    authCookie.SetMaxAge(expire)
    authCookie.SetHTTPOnly(true)
    authCookie.SetSameSite(fasthttp.CookieSameSiteLaxMode)
    return &authCookie
}

И затем вы можете переслать повара ie или сохранить его в (возможно, в памяти) БД:

authcookie := CreateCookie("GoLog-Token", token, cfg.Redis.Token.Expire)
ctx.Response.Header.SetCookie(authcookie)
// store cookie here
...