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 }