Source file blog/context/gorilla/gorilla.go

     1  // +build OMIT
     2  
     3  // Package gorilla provides a go.net/context.Context implementation whose Value
     4  // method returns the values associated with a specific HTTP request in the
     5  // github.com/gorilla/context package.
     6  package gorilla
     7  
     8  import (
     9  	"net/http"
    10  
    11  	gcontext "github.com/gorilla/context"
    12  	"golang.org/x/net/context"
    13  )
    14  
    15  // NewContext returns a Context whose Value method returns values associated
    16  // with req using the Gorilla context package:
    17  // http://www.gorillatoolkit.org/pkg/context
    18  func NewContext(parent context.Context, req *http.Request) context.Context {
    19  	return &wrapper{parent, req}
    20  }
    21  
    22  type wrapper struct {
    23  	context.Context
    24  	req *http.Request
    25  }
    26  
    27  type key int
    28  
    29  const reqKey key = 0
    30  
    31  // Value returns Gorilla's context package's value for this Context's request
    32  // and key. It delegates to the parent Context if there is no such value.
    33  func (ctx *wrapper) Value(key interface{}) interface{} {
    34  	if key == reqKey {
    35  		return ctx.req
    36  	}
    37  	if val, ok := gcontext.GetOk(ctx.req, key); ok {
    38  		return val
    39  	}
    40  	return ctx.Context.Value(key)
    41  }
    42  
    43  // HTTPRequest returns the *http.Request associated with ctx using NewContext,
    44  // if any.
    45  func HTTPRequest(ctx context.Context) (*http.Request, bool) {
    46  	// We cannot use ctx.(*wrapper).req to get the request because ctx may
    47  	// be a Context derived from a *wrapper. Instead, we use Value to
    48  	// access the request if it is anywhere up the Context tree.
    49  	req, ok := ctx.Value(reqKey).(*http.Request)
    50  	return req, ok
    51  }
    52  

View as plain text