|
- // Copyright 2012 The Gorilla Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
-
- /*
- Package context stores values shared during a request lifetime.
-
- Note: gorilla/context, having been born well before `context.Context` existed,
- does not play well > with the shallow copying of the request that
- [`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext)
- (added to net/http Go 1.7 onwards) performs. You should either use *just*
- gorilla/context, or moving forward, the new `http.Request.Context()`.
-
- For example, a router can set variables extracted from the URL and later
- application handlers can access those values, or it can be used to store
- sessions values to be saved at the end of a request. There are several
- others common uses.
-
- The idea was posted by Brad Fitzpatrick to the go-nuts mailing list:
-
- http://groups.google.com/group/golang-nuts/msg/e2d679d303aa5d53
-
- Here's the basic usage: first define the keys that you will need. The key
- type is interface{} so a key can be of any type that supports equality.
- Here we define a key using a custom int type to avoid name collisions:
-
- package foo
-
- import (
- "github.com/gorilla/context"
- )
-
- type key int
-
- const MyKey key = 0
-
- Then set a variable. Variables are bound to an http.Request object, so you
- need a request instance to set a value:
-
- context.Set(r, MyKey, "bar")
-
- The application can later access the variable using the same key you provided:
-
- func MyHandler(w http.ResponseWriter, r *http.Request) {
- // val is "bar".
- val := context.Get(r, foo.MyKey)
-
- // returns ("bar", true)
- val, ok := context.GetOk(r, foo.MyKey)
- // ...
- }
-
- And that's all about the basic usage. We discuss some other ideas below.
-
- Any type can be stored in the context. To enforce a given type, make the key
- private and wrap Get() and Set() to accept and return values of a specific
- type:
-
- type key int
-
- const mykey key = 0
-
- // GetMyKey returns a value for this package from the request values.
- func GetMyKey(r *http.Request) SomeType {
- if rv := context.Get(r, mykey); rv != nil {
- return rv.(SomeType)
- }
- return nil
- }
-
- // SetMyKey sets a value for this package in the request values.
- func SetMyKey(r *http.Request, val SomeType) {
- context.Set(r, mykey, val)
- }
-
- Variables must be cleared at the end of a request, to remove all values
- that were stored. This can be done in an http.Handler, after a request was
- served. Just call Clear() passing the request:
-
- context.Clear(r)
-
- ...or use ClearHandler(), which conveniently wraps an http.Handler to clear
- variables at the end of a request lifetime.
-
- The Routers from the packages gorilla/mux and gorilla/pat call Clear()
- so if you are using either of them you don't need to clear the context manually.
- */
- package context
|