dubbo.apache.org/dubbo-go/v3@v3.1.1/filter/echo/filter.go (about) 1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 // Package echo providers health check filter. 19 // RPCService need a Echo method in consumer, if you want to use Filter 20 // eg: Echo func(ctx context.Context, arg interface{}, rsp *Xxx) error 21 package echo 22 23 import ( 24 "context" 25 "sync" 26 ) 27 28 import ( 29 "dubbo.apache.org/dubbo-go/v3/common/constant" 30 "dubbo.apache.org/dubbo-go/v3/common/extension" 31 "dubbo.apache.org/dubbo-go/v3/filter" 32 "dubbo.apache.org/dubbo-go/v3/protocol" 33 ) 34 35 var ( 36 once sync.Once 37 echo *echoFilter 38 ) 39 40 func init() { 41 extension.SetFilter(constant.EchoFilterKey, newEchoFilter) 42 } 43 44 type echoFilter struct{} 45 46 func newEchoFilter() filter.Filter { 47 if echo == nil { 48 once.Do(func() { 49 echo = &echoFilter{} 50 }) 51 } 52 return echo 53 } 54 55 // Invoke response to the callers with its first argument. 56 func (f *echoFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result { 57 if invocation.MethodName() == constant.Echo && len(invocation.Arguments()) == 1 { 58 return &protocol.RPCResult{ 59 Rest: invocation.Arguments()[0], 60 Attrs: invocation.Attachments(), 61 } 62 } 63 64 return invoker.Invoke(ctx, invocation) 65 } 66 67 // OnResponse dummy process, returns the result directly 68 func (f *echoFilter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker, 69 _ protocol.Invocation) protocol.Result { 70 71 return result 72 }