Home > OS >  Named cookie not present
Named cookie not present

Time:11-08

I am building a website that will rely on cookies for various things. Then I decided to have a function that sets a cookie then read the same cookie in order to see if the browser allows cookies. But this fails.

The template in ./views/index.html

{{define "index"}}template{{end}}

The main code:

package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"

    "strconv"
    "time"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
)

var tmpl *template.Template

func main(){
    port :=":8088"
    router := mux.NewRouter()
    router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        //Set test cookie
        cookieName := strconv.FormatInt(time.Now().UnixNano(), 10)
        cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)

        fmt.Println("cookieName:"   cookieName)
        fmt.Println("cookieValue:"   cookieValue)
        cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}
        http.SetCookie(w, &cookie)

        //Get cookies
        fmt.Println("Range over cookies")
        for _, c := range r.Cookies() {
            fmt.Println(c)
        }

        //Get test cookie by name
        c, err := r.Cookie(cookieName)
        if err != nil {
            fmt.Println("Error: "   err.Error())
        } else {
            fmt.Println(c.Value)
        }


        err = tmpl.ExecuteTemplate(w, "index", "")
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    })


    var err error
    tmpl, err = template.ParseGlob("views/*")
    if err != nil {
        panic(err.Error())
    }

    router.PathPrefix("/").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
        http.FileServer(http.Dir("./static/")).ServeHTTP(res, req)
    })

    fmt.Println("Server running on localhost"   port)

    err = http.ListenAndServe(port, handlers.CompressHandler(router))
    if err != nil {
        log.Fatal(err)
    }
}

This is terminal output:

Server running on localhost:8088
cookieName:1636243636497412077
cookieValue:1636243636497413613
Range over cookies
Error: http: named cookie not present

Any pointers to what my issue might be?

CodePudding user response:

You are checking r.Cookies before you have sent the cookie to the client. You must send the cookie and then if you want to check their cookie, send a second request. It would be much easier to just open the browser and look to see if your cookie is there after you send your first response.

CodePudding user response:

The method Request.Cookie gets a cookie from request Cookie headers.

The function http.SetCookie adds a Set-Cookie header to the response headers. You can observe the result of http.SetCookie using this code:

 fmt.Println(w.Header()["Set-Cookie"])

The named cookie is not present in the current request because http.SetCookie does not modify the current request.

The flow of cookie values is this:

  1. The server sets cookies in a response using the Set-Cookie header.
  2. The client stores the cookies in a "cookie jar".
  3. The client adds matching cookies from the jar to requests using the Cookie request header.
  4. The server gets the cookies form the request headers.

Try this code. Load the page in the browser and refresh to observe the flow of cookie values.

    const cookieName = "example"
    cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)
    fmt.Printf("Set cookie %s=%s\n", cookieName, cookieValue)

    cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}
    http.SetCookie(w, &cookie)

    c, err := r.Cookie(cookieName)
    if err != nil {
        fmt.Printf("Get cookie %s error: %v\n", cookieName, err)
    } else {
        fmt.Printf("Get cookie %s=%s\n", cookieName, c.Value)
    }
  • Related