Setting cookies with net/http

CookiesGo

Cookies Problem Overview


I'm trying to set cookies with Go's net/http package. I have:

package main

import "io"
import "net/http"
import "time"

func indexHandler(w http.ResponseWriter, req *http.Request) {
    expire := time.Now().AddDate(0, 0, 1)
    cookie := http.Cookie{"test", "tcookie", "/", "www.domain.com", expire, expire.Format(time.UnixDate), 86400, true, true, "test=tcookie", []string{"test=tcookie"}}
    req.AddCookie(&cookie)
    io.WriteString(w, "Hello world!")
}

func main() {
    http.HandleFunc("/", indexHandler)
    http.ListenAndServe(":80", nil)
}

I tried googling 'Golang' with 'cookies', but didn't get any good results. If anyone can point me in the right direction it would be greatly appreciated.

Cookies Solutions


Solution 1 - Cookies

I am not a Go expert, but I think you are setting the cookie on the request, aren't you? You might want to set it on the response. There is a setCookie function in net/http. This might help: http://golang.org/pkg/net/http/#SetCookie

func SetCookie(w ResponseWriter, cookie *Cookie)

Solution 2 - Cookies

//ShowAllTasksFunc is used to handle the "/" URL which is the default ons
func ShowAllTasksFunc(w http.ResponseWriter, r *http.Request){
    if r.Method == "GET" {
        context := db.GetTasks("pending") //true when you want non deleted notes
        if message != "" {
            context.Message = message
        }
        context.CSRFToken = "abcd"
        message = ""
        expiration := time.Now().Add(365 * 24 * time.Hour)
        cookie    :=    http.Cookie{Name: "csrftoken",Value:"abcd",Expires:expiration}
        http.SetCookie(w, &cookie)
        homeTemplate.Execute(w, context)
    } else {
        message = "Method not allowed"
        http.Redirect(w, r, "/", http.StatusFound)
    }
}

There is a basic difference between Requests and ResponseWriter, a Request is what a browser will send like

Host: 127.0.0.1:8081
User-Agent: ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://127.0.0.1:8081/
Cookie: csrftoken=abcd
Connection: keep-alive

and a response is what the handler will send, something like :

Content-Type: text/html; charset=utf-8
Date: Tue, 12 Jan 2016 16:43:53 GMT
Set-Cookie: csrftoken=abcd; Expires=Wed, 11 Jan 2017 16:43:53 GMT
Transfer-Encoding: chunked
<html>...</html>

When the browser will make a request, it'll include the cookie for that domain, since cookies are stored domain wise and can't be accessed from cross domains, if you set a cookie as HTTP only then it can only be accessed from the website which set it via HTTP and not via JS.

So when getting information from cookies you can do that from the r.Cookie method, like this

cookie, _ := r.Cookie("csrftoken")
if formToken == cookie.Value {

https://github.com/thewhitetulip/Tasks/blob/master/views/addViews.go#L72-L75

But when you are going to set a cookie, you have to do it in the response writer method, the request is a read only object which we respond to, think of it as a text message you get from someone, that is a request, you can only get it, what you type is a response, so you can type in a cookie at

for more details: https://thewhitetulip.gitbooks.io/webapp-with-golang-anti-textbook/content/content/2.4workingwithform.html

Solution 3 - Cookies

This Below code helps u

    cookie1 := &http.Cookie{Name: "sample", Value: "sample", HttpOnly: false}
	http.SetCookie(w, cookie1)

Solution 4 - Cookies

Below shows how we use cookie in our product:

func handleFoo(w http.ResponseWriter, r *http.Request) {
	
	// cookie will get expired after 1 year	
	expires := time.Now().AddDate(1, 0, 0)

	ck := http.Cookie{
		Name: "JSESSION_ID",
		Domain: "foo.com",
		Path: "/",
		Expires: expires,
	}

	// value of cookie    
	ck.Value = "value of this awesome cookie"

	// write the cookie to response
	http.SetCookie(w, &ck)

	// ...
}

Solution 5 - Cookies

It was not working for me in Safari until I added the Path and MaxAge. Both secure and regular cookies worked for me

Sharing so that it helps someone who is stuck like me for more than 2 days :)

expire := time.Now().Add(20 * time.Minute) // Expires in 20 minutes
cookie := http.Cookie{Name: "username", Value: "nonsecureuser", Path: "/", Expires: expire, MaxAge: 86400}
http.SetCookie(w, &cookie)
cookie = http.Cookie{Name: "secureusername", Value: "secureuser", Path: "/", Expires: expire, MaxAge: 86400, HttpOnly: true, Secure: true}
http.SetCookie(w, &cookie)

Solution 6 - Cookies

First, you need to create Cookie and then using http package's SetCookie() function you can set the cookie.

expire := time.Now().Add(10 * time.Minute) 
cookie := http.Cookie{Name: "User", Value: "John", Path: "/", Expires: expire, MaxAge: 90000}
http.SetCookie(w, &cookie)

Solution 7 - Cookies

You can use gorilla package for handling cookies or i would say secure cookies: http://www.gorillatoolkit.org/pkg/securecookie

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTech163View Question on Stackoverflow
Solution 1 - CookiesTobias N. SasseView Answer on Stackoverflow
Solution 2 - CookiesthewhitetulipView Answer on Stackoverflow
Solution 3 - CookiesDharani DharanView Answer on Stackoverflow
Solution 4 - CookiesBill XiongView Answer on Stackoverflow
Solution 5 - CookiesdeepakssnView Answer on Stackoverflow
Solution 6 - CookiesKabeer ShaikhView Answer on Stackoverflow
Solution 7 - CookiesA-kayView Answer on Stackoverflow