I am new here and a bit confused with setting cookie jar gloabally. I am using cookiejar from the http package and this is my implementation from other docs available in setting the cookies as jar in http.Client.
jar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: jar,
}
req, _ := http.NewRequest("GET", request_url, nil)
q := req.URL.Query()
q.Add("authtoken", token)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.URL.RawQuery = q.Encode()
res, _ := client.Do(req)
defer res.Body.Close()
fmt.Println(res.Cookies()) // can see the cookies here
What I am trying to achieve here is to have this declared gloabally so that once the jar is set the subsequent client request will have the cookies. If I place it in any other function it gets sets to nil again.
jar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: jar,
}
Any best practise available in how to do this? Thank you.
http.Client
is designed to be reused:
The Client's Transport typically has internal state (cached TCP connections), so Clients should be reused instead of created as needed. Clients are safe for concurrent use by multiple goroutines.
So simply just create / configure an http.Client
, and reuse it everywhere where you want your cookiejar to work.
If one configured http.Client
doesn't fit all your use cases, then create as many clients that do. To ensure the same cookiejar is used, you may create a client "factory" function which ensures the returned http.Client
will have the Jar set.
Undoable (at least you cannot force the use of your client).
Nearest is injecting your client into net/http.DefaultClient.
Most sensible is to use icza's solution.