github.com/wangyougui/gf/v2@v2.6.5/net/ghttp/ghttp_request_param_ctx.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/wangyougui/gf. 6 7 package ghttp 8 9 import ( 10 "context" 11 12 "github.com/wangyougui/gf/v2/container/gvar" 13 "github.com/wangyougui/gf/v2/os/gctx" 14 ) 15 16 // RequestFromCtx retrieves and returns the Request object from context. 17 func RequestFromCtx(ctx context.Context) *Request { 18 if v := ctx.Value(ctxKeyForRequest); v != nil { 19 return v.(*Request) 20 } 21 return nil 22 } 23 24 // Context is alias for function GetCtx. 25 // This function overwrites the http.Request.Context function. 26 // See GetCtx. 27 func (r *Request) Context() context.Context { 28 var ctx = r.Request.Context() 29 // Check and inject Request object into context. 30 if RequestFromCtx(ctx) == nil { 31 // Inject Request object into context. 32 ctx = context.WithValue(ctx, ctxKeyForRequest, r) 33 // Add default tracing info if using default tracing provider. 34 ctx = gctx.WithCtx(ctx) 35 // Update the values of the original HTTP request. 36 *r.Request = *r.Request.WithContext(ctx) 37 } 38 return ctx 39 } 40 41 // GetCtx retrieves and returns the request's context. 42 // Its alias of function Context,to be relevant with function SetCtx. 43 func (r *Request) GetCtx() context.Context { 44 return r.Context() 45 } 46 47 // GetNeverDoneCtx creates and returns a never done context object, 48 // which forbids the context manually done, to make the context can be propagated to asynchronous goroutines, 49 // which will not be affected by the HTTP request ends. 50 // 51 // This change is considered for common usage habits of developers for context propagation 52 // in multiple goroutines creation in one HTTP request. 53 func (r *Request) GetNeverDoneCtx() context.Context { 54 return gctx.NeverDone(r.Context()) 55 } 56 57 // SetCtx custom context for current request. 58 func (r *Request) SetCtx(ctx context.Context) { 59 *r.Request = *r.WithContext(ctx) 60 } 61 62 // GetCtxVar retrieves and returns a Var with a given key name. 63 // The optional parameter `def` specifies the default value of the Var if given `key` 64 // does not exist in the context. 65 func (r *Request) GetCtxVar(key interface{}, def ...interface{}) *gvar.Var { 66 value := r.Context().Value(key) 67 if value == nil && len(def) > 0 { 68 value = def[0] 69 } 70 return gvar.New(value) 71 } 72 73 // SetCtxVar sets custom parameter to context with key-value pairs. 74 func (r *Request) SetCtxVar(key interface{}, value interface{}) { 75 var ctx = r.Context() 76 ctx = context.WithValue(ctx, key, value) 77 *r.Request = *r.Request.WithContext(ctx) 78 }