trpc.group/trpc-go/trpc-go@v1.0.2/codec/message_impl.go (about)

     1  //
     2  //
     3  // Tencent is pleased to support the open source community by making tRPC available.
     4  //
     5  // Copyright (C) 2023 THL A29 Limited, a Tencent company.
     6  // All rights reserved.
     7  //
     8  // If you have downloaded a copy of the tRPC source code from Tencent,
     9  // please note that tRPC source code is licensed under the  Apache 2.0 License,
    10  // A copy of the Apache 2.0 License is included in this file.
    11  //
    12  //
    13  
    14  package codec
    15  
    16  import (
    17  	"context"
    18  	"net"
    19  	"strings"
    20  	"time"
    21  
    22  	"trpc.group/trpc-go/trpc-go/errs"
    23  )
    24  
    25  // msg is the context of rpc.
    26  type msg struct {
    27  	context             context.Context
    28  	frameHead           interface{}
    29  	requestTimeout      time.Duration
    30  	serializationType   int
    31  	compressType        int
    32  	streamID            uint32
    33  	dyeing              bool
    34  	dyeingKey           string
    35  	serverRPCName       string
    36  	clientRPCName       string
    37  	serverMetaData      MetaData
    38  	clientMetaData      MetaData
    39  	callerServiceName   string
    40  	calleeServiceName   string
    41  	calleeContainerName string
    42  	serverRspErr        error
    43  	clientRspErr        error
    44  	serverReqHead       interface{}
    45  	serverRspHead       interface{}
    46  	clientReqHead       interface{}
    47  	clientRspHead       interface{}
    48  	localAddr           net.Addr
    49  	remoteAddr          net.Addr
    50  	logger              interface{}
    51  	callerApp           string
    52  	callerServer        string
    53  	callerService       string
    54  	callerMethod        string
    55  	calleeApp           string
    56  	calleeServer        string
    57  	calleeService       string
    58  	calleeMethod        string
    59  	namespace           string
    60  	setName             string
    61  	envName             string
    62  	envTransfer         string
    63  	requestID           uint32
    64  	calleeSetName       string
    65  	streamFrame         interface{}
    66  	commonMeta          CommonMeta
    67  	callType            RequestType
    68  }
    69  
    70  // resetDefault reset all fields of msg to default value.
    71  func (m *msg) resetDefault() {
    72  	m.context = nil
    73  	m.frameHead = nil
    74  	m.requestTimeout = 0
    75  	m.serializationType = 0
    76  	m.compressType = 0
    77  	m.dyeing = false
    78  	m.dyeingKey = ""
    79  	m.serverRPCName = ""
    80  	m.clientRPCName = ""
    81  	m.serverMetaData = nil
    82  	m.clientMetaData = nil
    83  	m.callerServiceName = ""
    84  	m.calleeServiceName = ""
    85  	m.calleeContainerName = ""
    86  	m.serverRspErr = nil
    87  	m.clientRspErr = nil
    88  	m.serverReqHead = nil
    89  	m.serverRspHead = nil
    90  	m.clientReqHead = nil
    91  	m.clientRspHead = nil
    92  	m.localAddr = nil
    93  	m.remoteAddr = nil
    94  	m.logger = nil
    95  	m.callerApp = ""
    96  	m.callerServer = ""
    97  	m.callerService = ""
    98  	m.callerMethod = ""
    99  	m.calleeApp = ""
   100  	m.calleeServer = ""
   101  	m.calleeService = ""
   102  	m.calleeMethod = ""
   103  	m.namespace = ""
   104  	m.setName = ""
   105  	m.envName = ""
   106  	m.envTransfer = ""
   107  	m.requestID = 0
   108  	m.streamFrame = nil
   109  	m.streamID = 0
   110  	m.calleeSetName = ""
   111  	m.commonMeta = nil
   112  	m.callType = 0
   113  }
   114  
   115  // Context restores old context when create new msg.
   116  func (m *msg) Context() context.Context {
   117  	return m.context
   118  }
   119  
   120  // WithNamespace set server's namespace.
   121  func (m *msg) WithNamespace(namespace string) {
   122  	m.namespace = namespace
   123  }
   124  
   125  // Namespace returns namespace.
   126  func (m *msg) Namespace() string {
   127  	return m.namespace
   128  }
   129  
   130  // WithEnvName sets environment.
   131  func (m *msg) WithEnvName(envName string) {
   132  	m.envName = envName
   133  }
   134  
   135  // WithSetName sets set name.
   136  func (m *msg) WithSetName(setName string) {
   137  	m.setName = setName
   138  }
   139  
   140  // SetName returns set name.
   141  func (m *msg) SetName() string {
   142  	return m.setName
   143  }
   144  
   145  // WithCalleeSetName sets the callee set name.
   146  func (m *msg) WithCalleeSetName(s string) {
   147  	m.calleeSetName = s
   148  }
   149  
   150  // CalleeSetName returns the callee set name.
   151  func (m *msg) CalleeSetName() string {
   152  	return m.calleeSetName
   153  }
   154  
   155  // EnvName returns environment.
   156  func (m *msg) EnvName() string {
   157  	return m.envName
   158  }
   159  
   160  // WithEnvTransfer sets environment transfer value.
   161  func (m *msg) WithEnvTransfer(envTransfer string) {
   162  	m.envTransfer = envTransfer
   163  }
   164  
   165  // EnvTransfer returns environment transfer value.
   166  func (m *msg) EnvTransfer() string {
   167  	return m.envTransfer
   168  }
   169  
   170  // WithRemoteAddr sets remote address.
   171  func (m *msg) WithRemoteAddr(addr net.Addr) {
   172  	m.remoteAddr = addr
   173  }
   174  
   175  // WithLocalAddr set local address.
   176  func (m *msg) WithLocalAddr(addr net.Addr) {
   177  	m.localAddr = addr
   178  }
   179  
   180  // RemoteAddr returns remote address.
   181  func (m *msg) RemoteAddr() net.Addr {
   182  	return m.remoteAddr
   183  }
   184  
   185  // LocalAddr returns local address.
   186  func (m *msg) LocalAddr() net.Addr {
   187  	return m.localAddr
   188  }
   189  
   190  // RequestTimeout returns request timeout set by
   191  // upstream business protocol.
   192  func (m *msg) RequestTimeout() time.Duration {
   193  	return m.requestTimeout
   194  }
   195  
   196  // WithRequestTimeout sets request timeout.
   197  func (m *msg) WithRequestTimeout(t time.Duration) {
   198  	m.requestTimeout = t
   199  }
   200  
   201  // FrameHead returns frame head.
   202  func (m *msg) FrameHead() interface{} {
   203  	return m.frameHead
   204  }
   205  
   206  // WithFrameHead sets frame head.
   207  func (m *msg) WithFrameHead(f interface{}) {
   208  	m.frameHead = f
   209  }
   210  
   211  // SerializationType returns the value of body serialization, which is
   212  // defined in serialization.go.
   213  func (m *msg) SerializationType() int {
   214  	return m.serializationType
   215  }
   216  
   217  // WithSerializationType sets body serialization type of body.
   218  func (m *msg) WithSerializationType(t int) {
   219  	m.serializationType = t
   220  }
   221  
   222  // CompressType returns compress type value, which is defined in compress.go.
   223  func (m *msg) CompressType() int {
   224  	return m.compressType
   225  }
   226  
   227  // WithCompressType sets compress type.
   228  func (m *msg) WithCompressType(t int) {
   229  	m.compressType = t
   230  }
   231  
   232  // ServerRPCName returns server rpc name.
   233  func (m *msg) ServerRPCName() string {
   234  	return m.serverRPCName
   235  }
   236  
   237  // WithServerRPCName sets server rpc name.
   238  func (m *msg) WithServerRPCName(s string) {
   239  	if m.serverRPCName == s {
   240  		return
   241  	}
   242  	m.serverRPCName = s
   243  	m.updateMethodNameUsingRPCName(s)
   244  }
   245  
   246  // ClientRPCName returns client rpc name.
   247  func (m *msg) ClientRPCName() string {
   248  	return m.clientRPCName
   249  }
   250  
   251  // WithClientRPCName sets client rpc name, which will be called
   252  // by client stub.
   253  func (m *msg) WithClientRPCName(s string) {
   254  	if m.clientRPCName == s {
   255  		return
   256  	}
   257  	m.clientRPCName = s
   258  	m.updateMethodNameUsingRPCName(s)
   259  }
   260  
   261  func (m *msg) updateMethodNameUsingRPCName(s string) {
   262  	if m.CalleeMethod() == "" {
   263  		m.WithCalleeMethod(s)
   264  	}
   265  }
   266  
   267  // ServerMetaData returns server meta data, which is passed to server.
   268  func (m *msg) ServerMetaData() MetaData {
   269  	return m.serverMetaData
   270  }
   271  
   272  // WithServerMetaData sets server meta data.
   273  func (m *msg) WithServerMetaData(d MetaData) {
   274  	if d == nil {
   275  		d = MetaData{}
   276  	}
   277  	m.serverMetaData = d
   278  }
   279  
   280  // ClientMetaData returns client meta data, which will pass to downstream.
   281  func (m *msg) ClientMetaData() MetaData {
   282  	return m.clientMetaData
   283  }
   284  
   285  // WithClientMetaData set client meta data.
   286  func (m *msg) WithClientMetaData(d MetaData) {
   287  	if d == nil {
   288  		d = MetaData{}
   289  	}
   290  	m.clientMetaData = d
   291  }
   292  
   293  // CalleeServiceName returns callee service name.
   294  func (m *msg) CalleeServiceName() string {
   295  	return m.calleeServiceName
   296  }
   297  
   298  // WithCalleeServiceName sets callee service name.
   299  func (m *msg) WithCalleeServiceName(s string) {
   300  	if m.calleeServiceName == s {
   301  		return
   302  	}
   303  	m.calleeServiceName = s
   304  	if s == "*" {
   305  		return
   306  	}
   307  	app, server, service := getAppServerService(s)
   308  	m.WithCalleeApp(app)
   309  	m.WithCalleeServer(server)
   310  	m.WithCalleeService(service)
   311  }
   312  
   313  // CalleeContainerName returns callee container name.
   314  func (m *msg) CalleeContainerName() string {
   315  	return m.calleeContainerName
   316  }
   317  
   318  // WithCalleeContainerName sets callee container name.
   319  func (m *msg) WithCalleeContainerName(s string) {
   320  	m.calleeContainerName = s
   321  }
   322  
   323  // WithStreamFrame sets stream frame.
   324  func (m *msg) WithStreamFrame(i interface{}) {
   325  	m.streamFrame = i
   326  }
   327  
   328  // StreamFrame returns stream frame.
   329  func (m *msg) StreamFrame() interface{} {
   330  	return m.streamFrame
   331  }
   332  
   333  // CallerServiceName returns caller service name.
   334  func (m *msg) CallerServiceName() string {
   335  	return m.callerServiceName
   336  }
   337  
   338  // WithCallerServiceName sets caller service name.
   339  func (m *msg) WithCallerServiceName(s string) {
   340  	if m.callerServiceName == s {
   341  		return
   342  	}
   343  	m.callerServiceName = s
   344  	if s == "*" {
   345  		return
   346  	}
   347  	app, server, service := getAppServerService(s)
   348  	m.WithCallerApp(app)
   349  	m.WithCallerServer(server)
   350  	m.WithCallerService(service)
   351  }
   352  
   353  // ServerRspErr returns server response error, which is created
   354  // by handler.
   355  func (m *msg) ServerRspErr() *errs.Error {
   356  	if m.serverRspErr == nil {
   357  		return nil
   358  	}
   359  	e, ok := m.serverRspErr.(*errs.Error)
   360  	if !ok {
   361  		return &errs.Error{
   362  			Type: errs.ErrorTypeBusiness,
   363  			Code: errs.RetUnknown,
   364  			Msg:  m.serverRspErr.Error(),
   365  		}
   366  	}
   367  	return e
   368  }
   369  
   370  // WithServerRspErr sets server response error.
   371  func (m *msg) WithServerRspErr(e error) {
   372  	m.serverRspErr = e
   373  }
   374  
   375  // WithStreamID sets stream id.
   376  func (m *msg) WithStreamID(streamID uint32) {
   377  	m.streamID = streamID
   378  }
   379  
   380  // StreamID returns stream id.
   381  func (m *msg) StreamID() uint32 {
   382  	return m.streamID
   383  }
   384  
   385  // ClientRspErr returns client response error, which created when client call downstream.
   386  func (m *msg) ClientRspErr() error {
   387  	return m.clientRspErr
   388  }
   389  
   390  // WithClientRspErr sets client response err, this method will called
   391  // when client parse response package.
   392  func (m *msg) WithClientRspErr(e error) {
   393  	m.clientRspErr = e
   394  }
   395  
   396  // ServerReqHead returns the package head of request
   397  func (m *msg) ServerReqHead() interface{} {
   398  	return m.serverReqHead
   399  }
   400  
   401  // WithServerReqHead sets the package head of request
   402  func (m *msg) WithServerReqHead(h interface{}) {
   403  	m.serverReqHead = h
   404  }
   405  
   406  // ServerRspHead returns the package head of response
   407  func (m *msg) ServerRspHead() interface{} {
   408  	return m.serverRspHead
   409  }
   410  
   411  // WithServerRspHead sets the package head returns to upstream
   412  func (m *msg) WithServerRspHead(h interface{}) {
   413  	m.serverRspHead = h
   414  }
   415  
   416  // ClientReqHead returns the request package head of client,
   417  // this is set only when cross protocol call.
   418  func (m *msg) ClientReqHead() interface{} {
   419  	return m.clientReqHead
   420  }
   421  
   422  // WithClientReqHead sets the request package head of client.
   423  func (m *msg) WithClientReqHead(h interface{}) {
   424  	m.clientReqHead = h
   425  }
   426  
   427  // ClientRspHead returns the request package head of client.
   428  func (m *msg) ClientRspHead() interface{} {
   429  	return m.clientRspHead
   430  }
   431  
   432  // WithClientRspHead sets the response package head of client.
   433  func (m *msg) WithClientRspHead(h interface{}) {
   434  	m.clientRspHead = h
   435  }
   436  
   437  // Dyeing return the dyeing mark.
   438  func (m *msg) Dyeing() bool {
   439  	return m.dyeing
   440  }
   441  
   442  // WithDyeing sets the dyeing mark.
   443  func (m *msg) WithDyeing(dyeing bool) {
   444  	m.dyeing = dyeing
   445  }
   446  
   447  // DyeingKey returns the dyeing key.
   448  func (m *msg) DyeingKey() string {
   449  	return m.dyeingKey
   450  }
   451  
   452  // WithDyeingKey sets the dyeing key.
   453  func (m *msg) WithDyeingKey(key string) {
   454  	m.dyeingKey = key
   455  }
   456  
   457  // CallerApp returns caller app.
   458  func (m *msg) CallerApp() string {
   459  	return m.callerApp
   460  }
   461  
   462  // WithCallerApp sets caller app.
   463  func (m *msg) WithCallerApp(app string) {
   464  	m.callerApp = app
   465  }
   466  
   467  // CallerServer returns caller server.
   468  func (m *msg) CallerServer() string {
   469  	return m.callerServer
   470  }
   471  
   472  // WithCallerServer sets caller server.
   473  func (m *msg) WithCallerServer(s string) {
   474  	m.callerServer = s
   475  }
   476  
   477  // CallerService returns caller service.
   478  func (m *msg) CallerService() string {
   479  	return m.callerService
   480  }
   481  
   482  // WithCallerService sets caller service.
   483  func (m *msg) WithCallerService(s string) {
   484  	m.callerService = s
   485  }
   486  
   487  // WithCallerMethod sets caller method.
   488  func (m *msg) WithCallerMethod(s string) {
   489  	m.callerMethod = s
   490  }
   491  
   492  // CallerMethod returns caller method.
   493  func (m *msg) CallerMethod() string {
   494  	return m.callerMethod
   495  }
   496  
   497  // CalleeApp returns caller app.
   498  func (m *msg) CalleeApp() string {
   499  	return m.calleeApp
   500  }
   501  
   502  // WithCalleeApp sets callee app.
   503  func (m *msg) WithCalleeApp(app string) {
   504  	m.calleeApp = app
   505  }
   506  
   507  // CalleeServer returns callee server.
   508  func (m *msg) CalleeServer() string {
   509  	return m.calleeServer
   510  }
   511  
   512  // WithCalleeServer sets callee server.
   513  func (m *msg) WithCalleeServer(s string) {
   514  	m.calleeServer = s
   515  }
   516  
   517  // CalleeService returns callee service.
   518  func (m *msg) CalleeService() string {
   519  	return m.calleeService
   520  }
   521  
   522  // WithCalleeService sets callee service.
   523  func (m *msg) WithCalleeService(s string) {
   524  	m.calleeService = s
   525  }
   526  
   527  // WithCalleeMethod sets callee method.
   528  func (m *msg) WithCalleeMethod(s string) {
   529  	m.calleeMethod = s
   530  }
   531  
   532  // CalleeMethod returns callee method.
   533  func (m *msg) CalleeMethod() string {
   534  	return m.calleeMethod
   535  }
   536  
   537  // WithLogger sets logger into context message. Generally, the logger is
   538  // created from WithFields() method.
   539  func (m *msg) WithLogger(l interface{}) {
   540  	m.logger = l
   541  }
   542  
   543  // Logger returns logger from context message.
   544  func (m *msg) Logger() interface{} {
   545  	return m.logger
   546  }
   547  
   548  // WithRequestID sets request id.
   549  func (m *msg) WithRequestID(id uint32) {
   550  	m.requestID = id
   551  }
   552  
   553  // RequestID returns request id.
   554  func (m *msg) RequestID() uint32 {
   555  	return m.requestID
   556  }
   557  
   558  // WithCommonMeta sets common meta data.
   559  func (m *msg) WithCommonMeta(c CommonMeta) {
   560  	m.commonMeta = c
   561  }
   562  
   563  // CommonMeta returns common meta data.
   564  func (m *msg) CommonMeta() CommonMeta {
   565  	return m.commonMeta
   566  }
   567  
   568  // WithCallType sets type of call.
   569  func (m *msg) WithCallType(t RequestType) {
   570  	m.callType = t
   571  }
   572  
   573  // CallType returns type of call.
   574  func (m *msg) CallType() RequestType {
   575  	return m.callType
   576  }
   577  
   578  // WithNewMessage create a new empty message, and put it into ctx,
   579  func WithNewMessage(ctx context.Context) (context.Context, Msg) {
   580  
   581  	m := msgPool.Get().(*msg)
   582  	ctx = context.WithValue(ctx, ContextKeyMessage, m)
   583  	m.context = ctx
   584  	return ctx, m
   585  }
   586  
   587  // PutBackMessage return struct Message to sync pool,
   588  // and reset all the members of Message to default
   589  func PutBackMessage(sourceMsg Msg) {
   590  	m, ok := sourceMsg.(*msg)
   591  	if !ok {
   592  		return
   593  	}
   594  	m.resetDefault()
   595  	msgPool.Put(m)
   596  }
   597  
   598  // WithCloneContextAndMessage creates a new context, then copy the message of current context
   599  // into new context, this method will return the new context and message for stream mod.
   600  func WithCloneContextAndMessage(ctx context.Context) (context.Context, Msg) {
   601  	newMsg := msgPool.Get().(*msg)
   602  	newCtx := context.Background()
   603  	val := ctx.Value(ContextKeyMessage)
   604  	m, ok := val.(*msg)
   605  	if !ok {
   606  		newCtx = context.WithValue(newCtx, ContextKeyMessage, newMsg)
   607  		newMsg.context = newCtx
   608  		return newCtx, newMsg
   609  	}
   610  	newCtx = context.WithValue(newCtx, ContextKeyMessage, newMsg)
   611  	newMsg.context = newCtx
   612  	copyCommonMessage(m, newMsg)
   613  	copyServerToServerMessage(m, newMsg)
   614  	return newCtx, newMsg
   615  }
   616  
   617  // copyCommonMessage copy common data of message.
   618  func copyCommonMessage(m *msg, newMsg *msg) {
   619  	newMsg.frameHead = m.frameHead
   620  	newMsg.requestTimeout = m.requestTimeout
   621  	newMsg.serializationType = m.serializationType
   622  	newMsg.serverRPCName = m.serverRPCName
   623  	newMsg.clientRPCName = m.clientRPCName
   624  	newMsg.serverReqHead = m.serverReqHead
   625  	newMsg.serverRspHead = m.serverRspHead
   626  	newMsg.dyeing = m.dyeing
   627  	newMsg.dyeingKey = m.dyeingKey
   628  	newMsg.serverMetaData = m.serverMetaData.Clone()
   629  	newMsg.logger = m.logger
   630  	newMsg.namespace = m.namespace
   631  	newMsg.envName = m.envName
   632  	newMsg.setName = m.setName
   633  	newMsg.envTransfer = m.envTransfer
   634  	newMsg.commonMeta = m.commonMeta.Clone()
   635  }
   636  
   637  // copyClientMessage copy the message transferred from server to client.
   638  func copyServerToClientMessage(m *msg, newMsg *msg) {
   639  	newMsg.clientMetaData = m.serverMetaData.Clone()
   640  	// clone this message for downstream client, so caller is equal to callee.
   641  	newMsg.callerServiceName = m.calleeServiceName
   642  	newMsg.callerApp = m.calleeApp
   643  	newMsg.callerServer = m.calleeServer
   644  	newMsg.callerService = m.calleeService
   645  	newMsg.callerMethod = m.calleeMethod
   646  }
   647  
   648  func copyServerToServerMessage(m *msg, newMsg *msg) {
   649  	newMsg.callerServiceName = m.callerServiceName
   650  	newMsg.callerApp = m.callerApp
   651  	newMsg.callerServer = m.callerServer
   652  	newMsg.callerService = m.callerService
   653  	newMsg.callerMethod = m.callerMethod
   654  
   655  	newMsg.calleeServiceName = m.calleeServiceName
   656  	newMsg.calleeService = m.calleeService
   657  	newMsg.calleeApp = m.calleeApp
   658  	newMsg.calleeServer = m.calleeServer
   659  	newMsg.calleeMethod = m.calleeMethod
   660  }
   661  
   662  // WithCloneMessage copy a new message and put into context, each rpc call should
   663  // create a new message, this method will be called by client stub.
   664  func WithCloneMessage(ctx context.Context) (context.Context, Msg) {
   665  	newMsg := msgPool.Get().(*msg)
   666  	val := ctx.Value(ContextKeyMessage)
   667  	m, ok := val.(*msg)
   668  	if !ok {
   669  		ctx = context.WithValue(ctx, ContextKeyMessage, newMsg)
   670  		newMsg.context = ctx
   671  		return ctx, newMsg
   672  	}
   673  	ctx = context.WithValue(ctx, ContextKeyMessage, newMsg)
   674  	newMsg.context = ctx
   675  	copyCommonMessage(m, newMsg)
   676  	copyServerToClientMessage(m, newMsg)
   677  	return ctx, newMsg
   678  }
   679  
   680  // Message returns the message of context.
   681  func Message(ctx context.Context) Msg {
   682  	val := ctx.Value(ContextKeyMessage)
   683  	m, ok := val.(*msg)
   684  	if !ok {
   685  		return &msg{context: ctx}
   686  	}
   687  	return m
   688  }
   689  
   690  // EnsureMessage returns context and message, if there is a message in context,
   691  // returns the original one, if not, returns a new one.
   692  func EnsureMessage(ctx context.Context) (context.Context, Msg) {
   693  	val := ctx.Value(ContextKeyMessage)
   694  	if m, ok := val.(*msg); ok {
   695  		return ctx, m
   696  	}
   697  	return WithNewMessage(ctx)
   698  }
   699  
   700  // getAppServerService returns app, server and service parsed from service name.
   701  // service name example: trpc.app.server.service
   702  func getAppServerService(s string) (app, server, service string) {
   703  	if strings.Count(s, ".") >= ServiceSectionLength-1 {
   704  		i := strings.Index(s, ".") + 1
   705  		j := strings.Index(s[i:], ".") + i + 1
   706  		k := strings.Index(s[j:], ".") + j + 1
   707  		app = s[i : j-1]
   708  		server = s[j : k-1]
   709  		service = s[k:]
   710  		return
   711  	}
   712  	// app
   713  	i := strings.Index(s, ".")
   714  	if i == -1 {
   715  		app = s
   716  		return
   717  	}
   718  	app = s[:i]
   719  	// server
   720  	i++
   721  	j := strings.Index(s[i:], ".")
   722  	if j == -1 {
   723  		server = s[i:]
   724  		return
   725  	}
   726  	j += i + 1
   727  	server = s[i : j-1]
   728  	// service
   729  	service = s[j:]
   730  	return
   731  }