mirror of
https://github.com/go-kratos/kratos.git
synced 2025-02-13 13:48:51 +02:00
Middleware/metadata v2 (#1050)
* add middleware metadata * add transport header * add transport carrier Co-authored-by: longXboy <longxboy@gmail.com>
This commit is contained in:
parent
7f2e3becbe
commit
8d8cd8c8a8
@ -6,7 +6,6 @@ package metadata
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
transport "github.com/go-kratos/kratos/v2/transport"
|
|
||||||
http "github.com/go-kratos/kratos/v2/transport/http"
|
http "github.com/go-kratos/kratos/v2/transport/http"
|
||||||
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
||||||
)
|
)
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
// This is a compile-time assertion to ensure that this generated file
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
// is compatible with the kratos package it is being compiled against.
|
// is compatible with the kratos package it is being compiled against.
|
||||||
var _ = new(context.Context)
|
var _ = new(context.Context)
|
||||||
var _ = new(transport.Transporter)
|
|
||||||
var _ = binding.EncodeURL
|
var _ = binding.EncodeURL
|
||||||
|
|
||||||
const _ = http.SupportPackageIsVersion1
|
const _ = http.SupportPackageIsVersion1
|
||||||
@ -36,7 +34,7 @@ func _Metadata_ListServices0_HTTP_Handler(srv MetadataHTTPServer) func(ctx http.
|
|||||||
if err := ctx.Bind(&in); err != nil {
|
if err := ctx.Bind(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/kratos.api.Metadata/ListServices")
|
http.SetOperation(ctx, "/kratos.api.Metadata/ListServices")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.ListServices(ctx, req.(*ListServicesRequest))
|
return srv.ListServices(ctx, req.(*ListServicesRequest))
|
||||||
})
|
})
|
||||||
@ -58,7 +56,7 @@ func _Metadata_GetServiceDesc0_HTTP_Handler(srv MetadataHTTPServer) func(ctx htt
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/kratos.api.Metadata/GetServiceDesc")
|
http.SetOperation(ctx, "/kratos.api.Metadata/GetServiceDesc")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.GetServiceDesc(ctx, req.(*GetServiceDescRequest))
|
return srv.GetServiceDesc(ctx, req.(*GetServiceDescRequest))
|
||||||
})
|
})
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
contextPackage = protogen.GoImportPath("context")
|
contextPackage = protogen.GoImportPath("context")
|
||||||
transportPackage = protogen.GoImportPath("github.com/go-kratos/kratos/v2/transport")
|
|
||||||
transportHTTPPackage = protogen.GoImportPath("github.com/go-kratos/kratos/v2/transport/http")
|
transportHTTPPackage = protogen.GoImportPath("github.com/go-kratos/kratos/v2/transport/http")
|
||||||
bindingPackage = protogen.GoImportPath("github.com/go-kratos/kratos/v2/transport/http/binding")
|
bindingPackage = protogen.GoImportPath("github.com/go-kratos/kratos/v2/transport/http/binding")
|
||||||
)
|
)
|
||||||
@ -44,7 +43,6 @@ func generateFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.
|
|||||||
g.P("// This is a compile-time assertion to ensure that this generated file")
|
g.P("// This is a compile-time assertion to ensure that this generated file")
|
||||||
g.P("// is compatible with the kratos package it is being compiled against.")
|
g.P("// is compatible with the kratos package it is being compiled against.")
|
||||||
g.P("var _ = new(", contextPackage.Ident("Context"), ")")
|
g.P("var _ = new(", contextPackage.Ident("Context"), ")")
|
||||||
g.P("var _ = new(", transportPackage.Ident("Transporter"), ")")
|
|
||||||
g.P("var _ = ", bindingPackage.Ident("EncodeURL"))
|
g.P("var _ = ", bindingPackage.Ident("EncodeURL"))
|
||||||
g.P("const _ = ", transportHTTPPackage.Ident("SupportPackageIsVersion1"))
|
g.P("const _ = ", transportHTTPPackage.Ident("SupportPackageIsVersion1"))
|
||||||
g.P()
|
g.P()
|
||||||
|
@ -34,7 +34,7 @@ func _{{$svrType}}_{{.Name}}{{.Num}}_HTTP_Handler(srv {{$svrType}}HTTPServer) fu
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
{{- end}}
|
{{- end}}
|
||||||
transport.SetOperation(ctx,"/{{$svrName}}/{{.Name}}")
|
http.SetOperation(ctx,"/{{$svrName}}/{{.Name}}")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.{{.Name}}(ctx, req.(*{{.Request}}))
|
return srv.{{.Name}}(ctx, req.(*{{.Request}}))
|
||||||
})
|
})
|
||||||
|
@ -6,7 +6,6 @@ package v1
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
transport "github.com/go-kratos/kratos/v2/transport"
|
|
||||||
http "github.com/go-kratos/kratos/v2/transport/http"
|
http "github.com/go-kratos/kratos/v2/transport/http"
|
||||||
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
||||||
)
|
)
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
// This is a compile-time assertion to ensure that this generated file
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
// is compatible with the kratos package it is being compiled against.
|
// is compatible with the kratos package it is being compiled against.
|
||||||
var _ = new(context.Context)
|
var _ = new(context.Context)
|
||||||
var _ = new(transport.Transporter)
|
|
||||||
var _ = binding.EncodeURL
|
var _ = binding.EncodeURL
|
||||||
|
|
||||||
const _ = http.SupportPackageIsVersion1
|
const _ = http.SupportPackageIsVersion1
|
||||||
@ -42,7 +40,7 @@ func _BlogService_CreateArticle0_HTTP_Handler(srv BlogServiceHTTPServer) func(ct
|
|||||||
if err := ctx.Bind(&in); err != nil {
|
if err := ctx.Bind(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/blog.api.v1.BlogService/CreateArticle")
|
http.SetOperation(ctx, "/blog.api.v1.BlogService/CreateArticle")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.CreateArticle(ctx, req.(*CreateArticleRequest))
|
return srv.CreateArticle(ctx, req.(*CreateArticleRequest))
|
||||||
})
|
})
|
||||||
@ -64,7 +62,7 @@ func _BlogService_UpdateArticle0_HTTP_Handler(srv BlogServiceHTTPServer) func(ct
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/blog.api.v1.BlogService/UpdateArticle")
|
http.SetOperation(ctx, "/blog.api.v1.BlogService/UpdateArticle")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.UpdateArticle(ctx, req.(*UpdateArticleRequest))
|
return srv.UpdateArticle(ctx, req.(*UpdateArticleRequest))
|
||||||
})
|
})
|
||||||
@ -86,7 +84,7 @@ func _BlogService_DeleteArticle0_HTTP_Handler(srv BlogServiceHTTPServer) func(ct
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/blog.api.v1.BlogService/DeleteArticle")
|
http.SetOperation(ctx, "/blog.api.v1.BlogService/DeleteArticle")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.DeleteArticle(ctx, req.(*DeleteArticleRequest))
|
return srv.DeleteArticle(ctx, req.(*DeleteArticleRequest))
|
||||||
})
|
})
|
||||||
@ -108,7 +106,7 @@ func _BlogService_GetArticle0_HTTP_Handler(srv BlogServiceHTTPServer) func(ctx h
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/blog.api.v1.BlogService/GetArticle")
|
http.SetOperation(ctx, "/blog.api.v1.BlogService/GetArticle")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.GetArticle(ctx, req.(*GetArticleRequest))
|
return srv.GetArticle(ctx, req.(*GetArticleRequest))
|
||||||
})
|
})
|
||||||
@ -127,7 +125,7 @@ func _BlogService_ListArticle0_HTTP_Handler(srv BlogServiceHTTPServer) func(ctx
|
|||||||
if err := ctx.Bind(&in); err != nil {
|
if err := ctx.Bind(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/blog.api.v1.BlogService/ListArticle")
|
http.SetOperation(ctx, "/blog.api.v1.BlogService/ListArticle")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.ListArticle(ctx, req.(*ListArticleRequest))
|
return srv.ListArticle(ctx, req.(*ListArticleRequest))
|
||||||
})
|
})
|
||||||
|
@ -6,7 +6,6 @@ package helloworld
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
transport "github.com/go-kratos/kratos/v2/transport"
|
|
||||||
http "github.com/go-kratos/kratos/v2/transport/http"
|
http "github.com/go-kratos/kratos/v2/transport/http"
|
||||||
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
||||||
)
|
)
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
// This is a compile-time assertion to ensure that this generated file
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
// is compatible with the kratos package it is being compiled against.
|
// is compatible with the kratos package it is being compiled against.
|
||||||
var _ = new(context.Context)
|
var _ = new(context.Context)
|
||||||
var _ = new(transport.Transporter)
|
|
||||||
var _ = binding.EncodeURL
|
var _ = binding.EncodeURL
|
||||||
|
|
||||||
const _ = http.SupportPackageIsVersion1
|
const _ = http.SupportPackageIsVersion1
|
||||||
@ -37,7 +35,7 @@ func _Greeter_SayHello0_HTTP_Handler(srv GreeterHTTPServer) func(ctx http.Contex
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/helloworld.Greeter/SayHello")
|
http.SetOperation(ctx, "/helloworld.Greeter/SayHello")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.SayHello(ctx, req.(*HelloRequest))
|
return srv.SayHello(ctx, req.(*HelloRequest))
|
||||||
})
|
})
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/go-kratos/kratos/examples/helloworld/helloworld"
|
"github.com/go-kratos/kratos/examples/helloworld/helloworld"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
|
||||||
"github.com/go-kratos/kratos/v2/transport/http"
|
"github.com/go-kratos/kratos/v2/transport/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -19,7 +18,7 @@ func sayHelloHandler(ctx http.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
transport.SetOperation(ctx, "/helloworld.Greeter/SayHello")
|
http.SetOperation(ctx, "/helloworld.Greeter/SayHello")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return &helloworld.HelloReply{Message: "test:" + req.(*helloworld.HelloRequest).Name}, nil
|
return &helloworld.HelloReply{Message: "test:" + req.(*helloworld.HelloRequest).Name}, nil
|
||||||
})
|
})
|
||||||
|
@ -6,11 +6,9 @@ import (
|
|||||||
|
|
||||||
"github.com/go-kratos/kratos/examples/helloworld/helloworld"
|
"github.com/go-kratos/kratos/examples/helloworld/helloworld"
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
"github.com/go-kratos/kratos/v2/metadata"
|
||||||
"github.com/go-kratos/kratos/v2/middleware"
|
mmd "github.com/go-kratos/kratos/v2/middleware/metadata"
|
||||||
"github.com/go-kratos/kratos/v2/middleware/recovery"
|
|
||||||
"github.com/go-kratos/kratos/v2/transport/grpc"
|
"github.com/go-kratos/kratos/v2/transport/grpc"
|
||||||
"github.com/go-kratos/kratos/v2/transport/http"
|
"github.com/go-kratos/kratos/v2/transport/http"
|
||||||
grpcmd "google.golang.org/grpc/metadata"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -22,7 +20,7 @@ func callHTTP() {
|
|||||||
conn, err := http.NewClient(
|
conn, err := http.NewClient(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
http.WithMiddleware(
|
http.WithMiddleware(
|
||||||
recovery.Recovery(),
|
mmd.Client(),
|
||||||
),
|
),
|
||||||
http.WithEndpoint("127.0.0.1:8000"),
|
http.WithEndpoint("127.0.0.1:8000"),
|
||||||
)
|
)
|
||||||
@ -30,12 +28,9 @@ func callHTTP() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
client := helloworld.NewGreeterHTTPClient(conn)
|
client := helloworld.NewGreeterHTTPClient(conn)
|
||||||
md := metadata.Metadata{"kratos-extra": "2233"}
|
ctx := context.Background()
|
||||||
reply, err := client.SayHello(context.Background(),
|
ctx = metadata.AppendToClientContext(ctx, "x-md-global-extra", "2233")
|
||||||
&helloworld.HelloRequest{Name: "kratos"},
|
reply, err := client.SayHello(ctx, &helloworld.HelloRequest{Name: "kratos"})
|
||||||
// call options
|
|
||||||
http.Metadata(md),
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -47,16 +42,15 @@ func callGRPC() {
|
|||||||
context.Background(),
|
context.Background(),
|
||||||
grpc.WithEndpoint("127.0.0.1:9000"),
|
grpc.WithEndpoint("127.0.0.1:9000"),
|
||||||
grpc.WithMiddleware(
|
grpc.WithMiddleware(
|
||||||
middleware.Chain(
|
mmd.Client(),
|
||||||
recovery.Recovery(),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
client := helloworld.NewGreeterClient(conn)
|
client := helloworld.NewGreeterClient(conn)
|
||||||
ctx := grpcmd.AppendToOutgoingContext(context.Background(), "kratos-extra", "2233")
|
ctx := context.Background()
|
||||||
|
ctx = metadata.AppendToClientContext(ctx, "x-md-global-extra", "2233")
|
||||||
reply, err := client.SayHello(ctx, &helloworld.HelloRequest{Name: "kratos"})
|
reply, err := client.SayHello(ctx, &helloworld.HelloRequest{Name: "kratos"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
@ -7,8 +7,8 @@ import (
|
|||||||
|
|
||||||
"github.com/go-kratos/kratos/examples/helloworld/helloworld"
|
"github.com/go-kratos/kratos/examples/helloworld/helloworld"
|
||||||
"github.com/go-kratos/kratos/v2"
|
"github.com/go-kratos/kratos/v2"
|
||||||
"github.com/go-kratos/kratos/v2/middleware/recovery"
|
"github.com/go-kratos/kratos/v2/metadata"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
mmd "github.com/go-kratos/kratos/v2/middleware/metadata"
|
||||||
"github.com/go-kratos/kratos/v2/transport/grpc"
|
"github.com/go-kratos/kratos/v2/transport/grpc"
|
||||||
"github.com/go-kratos/kratos/v2/transport/http"
|
"github.com/go-kratos/kratos/v2/transport/http"
|
||||||
)
|
)
|
||||||
@ -29,8 +29,8 @@ type server struct {
|
|||||||
// SayHello implements helloworld.GreeterServer
|
// SayHello implements helloworld.GreeterServer
|
||||||
func (s *server) SayHello(ctx context.Context, in *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
|
func (s *server) SayHello(ctx context.Context, in *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
|
||||||
var extra string
|
var extra string
|
||||||
if tr, ok := transport.FromServerContext(ctx); ok {
|
if md, ok := metadata.FromServerContext(ctx); ok {
|
||||||
extra = tr.Metadata().Get("kratos-extra")
|
extra = md.Get("x-md-global-extra")
|
||||||
}
|
}
|
||||||
return &helloworld.HelloReply{Message: fmt.Sprintf("Hello %s and %s", in.Name, extra)}, nil
|
return &helloworld.HelloReply{Message: fmt.Sprintf("Hello %s and %s", in.Name, extra)}, nil
|
||||||
}
|
}
|
||||||
@ -39,12 +39,12 @@ func main() {
|
|||||||
grpcSrv := grpc.NewServer(
|
grpcSrv := grpc.NewServer(
|
||||||
grpc.Address(":9000"),
|
grpc.Address(":9000"),
|
||||||
grpc.Middleware(
|
grpc.Middleware(
|
||||||
recovery.Recovery(),
|
mmd.Server(),
|
||||||
))
|
))
|
||||||
httpSrv := http.NewServer(
|
httpSrv := http.NewServer(
|
||||||
http.Address(":8000"),
|
http.Address(":8000"),
|
||||||
http.Middleware(
|
http.Middleware(
|
||||||
recovery.Recovery(),
|
mmd.Server(),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@ package v1
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
transport "github.com/go-kratos/kratos/v2/transport"
|
|
||||||
http "github.com/go-kratos/kratos/v2/transport/http"
|
http "github.com/go-kratos/kratos/v2/transport/http"
|
||||||
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
||||||
)
|
)
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
// This is a compile-time assertion to ensure that this generated file
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
// is compatible with the kratos package it is being compiled against.
|
// is compatible with the kratos package it is being compiled against.
|
||||||
var _ = new(context.Context)
|
var _ = new(context.Context)
|
||||||
var _ = new(transport.Transporter)
|
|
||||||
var _ = binding.EncodeURL
|
var _ = binding.EncodeURL
|
||||||
|
|
||||||
const _ = http.SupportPackageIsVersion1
|
const _ = http.SupportPackageIsVersion1
|
||||||
@ -37,7 +35,7 @@ func _MessageService_GetUserMessage0_HTTP_Handler(srv MessageServiceHTTPServer)
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/api.message.v1.MessageService/GetUserMessage")
|
http.SetOperation(ctx, "/api.message.v1.MessageService/GetUserMessage")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.GetUserMessage(ctx, req.(*GetUserMessageRequest))
|
return srv.GetUserMessage(ctx, req.(*GetUserMessageRequest))
|
||||||
})
|
})
|
||||||
|
@ -6,7 +6,6 @@ package v1
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
transport "github.com/go-kratos/kratos/v2/transport"
|
|
||||||
http "github.com/go-kratos/kratos/v2/transport/http"
|
http "github.com/go-kratos/kratos/v2/transport/http"
|
||||||
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
||||||
)
|
)
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
// This is a compile-time assertion to ensure that this generated file
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
// is compatible with the kratos package it is being compiled against.
|
// is compatible with the kratos package it is being compiled against.
|
||||||
var _ = new(context.Context)
|
var _ = new(context.Context)
|
||||||
var _ = new(transport.Transporter)
|
|
||||||
var _ = binding.EncodeURL
|
var _ = binding.EncodeURL
|
||||||
|
|
||||||
const _ = http.SupportPackageIsVersion1
|
const _ = http.SupportPackageIsVersion1
|
||||||
@ -37,7 +35,7 @@ func _User_GetMyMessages0_HTTP_Handler(srv UserHTTPServer) func(ctx http.Context
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/api.user.v1.User/GetMyMessages")
|
http.SetOperation(ctx, "/api.user.v1.User/GetMyMessages")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.GetMyMessages(ctx, req.(*GetMyMessagesRequest))
|
return srv.GetMyMessages(ctx, req.(*GetMyMessagesRequest))
|
||||||
})
|
})
|
||||||
|
@ -6,7 +6,6 @@ package testproto
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
transport "github.com/go-kratos/kratos/v2/transport"
|
|
||||||
http "github.com/go-kratos/kratos/v2/transport/http"
|
http "github.com/go-kratos/kratos/v2/transport/http"
|
||||||
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
binding "github.com/go-kratos/kratos/v2/transport/http/binding"
|
||||||
)
|
)
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
// This is a compile-time assertion to ensure that this generated file
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
// is compatible with the kratos package it is being compiled against.
|
// is compatible with the kratos package it is being compiled against.
|
||||||
var _ = new(context.Context)
|
var _ = new(context.Context)
|
||||||
var _ = new(transport.Transporter)
|
|
||||||
var _ = binding.EncodeURL
|
var _ = binding.EncodeURL
|
||||||
|
|
||||||
const _ = http.SupportPackageIsVersion1
|
const _ = http.SupportPackageIsVersion1
|
||||||
@ -49,7 +47,7 @@ func _EchoService_Echo0_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx http.Co
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/Echo")
|
http.SetOperation(ctx, "/testproto.EchoService/Echo")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.Echo(ctx, req.(*SimpleMessage))
|
return srv.Echo(ctx, req.(*SimpleMessage))
|
||||||
})
|
})
|
||||||
@ -71,7 +69,7 @@ func _EchoService_Echo1_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx http.Co
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/Echo")
|
http.SetOperation(ctx, "/testproto.EchoService/Echo")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.Echo(ctx, req.(*SimpleMessage))
|
return srv.Echo(ctx, req.(*SimpleMessage))
|
||||||
})
|
})
|
||||||
@ -93,7 +91,7 @@ func _EchoService_Echo2_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx http.Co
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/Echo")
|
http.SetOperation(ctx, "/testproto.EchoService/Echo")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.Echo(ctx, req.(*SimpleMessage))
|
return srv.Echo(ctx, req.(*SimpleMessage))
|
||||||
})
|
})
|
||||||
@ -115,7 +113,7 @@ func _EchoService_Echo3_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx http.Co
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/Echo")
|
http.SetOperation(ctx, "/testproto.EchoService/Echo")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.Echo(ctx, req.(*SimpleMessage))
|
return srv.Echo(ctx, req.(*SimpleMessage))
|
||||||
})
|
})
|
||||||
@ -137,7 +135,7 @@ func _EchoService_Echo4_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx http.Co
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/Echo")
|
http.SetOperation(ctx, "/testproto.EchoService/Echo")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.Echo(ctx, req.(*SimpleMessage))
|
return srv.Echo(ctx, req.(*SimpleMessage))
|
||||||
})
|
})
|
||||||
@ -156,7 +154,7 @@ func _EchoService_EchoBody0_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx htt
|
|||||||
if err := ctx.Bind(&in); err != nil {
|
if err := ctx.Bind(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/EchoBody")
|
http.SetOperation(ctx, "/testproto.EchoService/EchoBody")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.EchoBody(ctx, req.(*SimpleMessage))
|
return srv.EchoBody(ctx, req.(*SimpleMessage))
|
||||||
})
|
})
|
||||||
@ -175,7 +173,7 @@ func _EchoService_EchoResponseBody0_HTTP_Handler(srv EchoServiceHTTPServer) func
|
|||||||
if err := ctx.Bind(&in); err != nil {
|
if err := ctx.Bind(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/EchoResponseBody")
|
http.SetOperation(ctx, "/testproto.EchoService/EchoResponseBody")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.EchoResponseBody(ctx, req.(*DynamicMessageUpdate))
|
return srv.EchoResponseBody(ctx, req.(*DynamicMessageUpdate))
|
||||||
})
|
})
|
||||||
@ -197,7 +195,7 @@ func _EchoService_EchoDelete0_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx h
|
|||||||
if err := ctx.BindVars(&in); err != nil {
|
if err := ctx.BindVars(&in); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/EchoDelete")
|
http.SetOperation(ctx, "/testproto.EchoService/EchoDelete")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.EchoDelete(ctx, req.(*SimpleMessage))
|
return srv.EchoDelete(ctx, req.(*SimpleMessage))
|
||||||
})
|
})
|
||||||
@ -216,7 +214,7 @@ func _EchoService_EchoPatch0_HTTP_Handler(srv EchoServiceHTTPServer) func(ctx ht
|
|||||||
if err := ctx.Bind(&in.Body); err != nil {
|
if err := ctx.Bind(&in.Body); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
transport.SetOperation(ctx, "/testproto.EchoService/EchoPatch")
|
http.SetOperation(ctx, "/testproto.EchoService/EchoPatch")
|
||||||
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := ctx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.EchoPatch(ctx, req.(*DynamicMessageUpdate))
|
return srv.EchoPatch(ctx, req.(*DynamicMessageUpdate))
|
||||||
})
|
})
|
||||||
|
@ -9,23 +9,22 @@ import (
|
|||||||
|
|
||||||
"github.com/go-kratos/kratos/v2/encoding"
|
"github.com/go-kratos/kratos/v2/encoding"
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
"github.com/go-kratos/kratos/v2/metadata"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
mmd "github.com/go-kratos/kratos/v2/middleware/metadata"
|
||||||
"github.com/go-kratos/kratos/v2/transport/grpc"
|
"github.com/go-kratos/kratos/v2/transport/grpc"
|
||||||
"github.com/go-kratos/kratos/v2/transport/http"
|
"github.com/go-kratos/kratos/v2/transport/http"
|
||||||
|
|
||||||
_struct "github.com/golang/protobuf/ptypes/struct"
|
_struct "github.com/golang/protobuf/ptypes/struct"
|
||||||
grpcmd "google.golang.org/grpc/metadata"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var md = metadata.Metadata{"test_key": "test_value"}
|
var md = metadata.Metadata{"x-md-global-test": "test_value"}
|
||||||
|
|
||||||
type echoService struct {
|
type echoService struct {
|
||||||
UnimplementedEchoServiceServer
|
UnimplementedEchoServiceServer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *echoService) Echo(ctx context.Context, m *SimpleMessage) (*SimpleMessage, error) {
|
func (s *echoService) Echo(ctx context.Context, m *SimpleMessage) (*SimpleMessage, error) {
|
||||||
md := transport.Metadata(ctx)
|
md, _ := metadata.FromServerContext(ctx)
|
||||||
if v := md.Get("test_key"); v != "test_value" {
|
if v := md.Get("x-md-global-test"); v != "test_value" {
|
||||||
return nil, errors.New("md not match" + v)
|
return nil, errors.New("md not match" + v)
|
||||||
}
|
}
|
||||||
return m, nil
|
return m, nil
|
||||||
@ -53,7 +52,7 @@ type echoClient struct {
|
|||||||
|
|
||||||
// post: /v1/example/echo/{id}
|
// post: /v1/example/echo/{id}
|
||||||
func (c *echoClient) Echo(ctx context.Context, in *SimpleMessage) (out *SimpleMessage, err error) {
|
func (c *echoClient) Echo(ctx context.Context, in *SimpleMessage) (out *SimpleMessage, err error) {
|
||||||
return c.client.Echo(ctx, in, http.Metadata(md))
|
return c.client.Echo(ctx, in)
|
||||||
}
|
}
|
||||||
|
|
||||||
// post: /v1/example/echo_body
|
// post: /v1/example/echo_body
|
||||||
@ -104,7 +103,10 @@ func TestJSON(t *testing.T) {
|
|||||||
func TestEchoHTTPServer(t *testing.T) {
|
func TestEchoHTTPServer(t *testing.T) {
|
||||||
echo := &echoService{}
|
echo := &echoService{}
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
srv := http.NewServer(http.Address(":2333"))
|
srv := http.NewServer(
|
||||||
|
http.Address(":2333"),
|
||||||
|
http.Middleware(mmd.Server()),
|
||||||
|
)
|
||||||
RegisterEchoServiceHTTPServer(srv, echo)
|
RegisterEchoServiceHTTPServer(srv, echo)
|
||||||
go func() {
|
go func() {
|
||||||
if err := srv.Start(ctx); err != nil {
|
if err := srv.Start(ctx); err != nil {
|
||||||
@ -127,11 +129,16 @@ func testEchoHTTPClient(t *testing.T, addr string) {
|
|||||||
t.Errorf("[%s] expected %v got %v", name, in, out)
|
t.Errorf("[%s] expected %v got %v", name, in, out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cc, _ := http.NewClient(context.Background(), http.WithEndpoint(addr))
|
cc, _ := http.NewClient(context.Background(),
|
||||||
|
http.WithEndpoint(addr),
|
||||||
|
http.WithMiddleware(mmd.Client()),
|
||||||
|
)
|
||||||
|
|
||||||
cli := &echoClient{client: NewEchoServiceHTTPClient(cc)}
|
cli := &echoClient{client: NewEchoServiceHTTPClient(cc)}
|
||||||
|
|
||||||
if out, err = cli.Echo(context.Background(), in); err != nil {
|
ctx := context.Background()
|
||||||
|
ctx = metadata.NewClientContext(ctx, md)
|
||||||
|
if out, err = cli.Echo(ctx, in); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
check("echo", &SimpleMessage{Id: "test_id"}, out)
|
check("echo", &SimpleMessage{Id: "test_id"}, out)
|
||||||
@ -173,7 +180,10 @@ func testEchoHTTPClient(t *testing.T, addr string) {
|
|||||||
func TestEchoGRPCServer(t *testing.T) {
|
func TestEchoGRPCServer(t *testing.T) {
|
||||||
echo := &echoService{}
|
echo := &echoService{}
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
srv := grpc.NewServer(grpc.Address(":2233"))
|
srv := grpc.NewServer(
|
||||||
|
grpc.Address(":2233"),
|
||||||
|
grpc.Middleware(mmd.Server()),
|
||||||
|
)
|
||||||
RegisterEchoServiceServer(srv, echo)
|
RegisterEchoServiceServer(srv, echo)
|
||||||
go func() {
|
go func() {
|
||||||
if err := srv.Start(ctx); err != nil {
|
if err := srv.Start(ctx); err != nil {
|
||||||
@ -186,8 +196,11 @@ func TestEchoGRPCServer(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func testEchoGRPCClient(t *testing.T, addr string) {
|
func testEchoGRPCClient(t *testing.T, addr string) {
|
||||||
ctx := context.Background()
|
cc, err := grpc.DialInsecure(
|
||||||
cc, err := grpc.DialInsecure(ctx, grpc.WithEndpoint(addr))
|
context.Background(),
|
||||||
|
grpc.WithEndpoint(addr),
|
||||||
|
grpc.WithMiddleware(mmd.Client()),
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -196,7 +209,8 @@ func testEchoGRPCClient(t *testing.T, addr string) {
|
|||||||
out = &SimpleMessage{}
|
out = &SimpleMessage{}
|
||||||
)
|
)
|
||||||
client := NewEchoServiceClient(cc)
|
client := NewEchoServiceClient(cc)
|
||||||
ctx = grpcmd.NewOutgoingContext(ctx, grpcmd.New(md))
|
ctx := context.Background()
|
||||||
|
ctx = metadata.NewClientContext(ctx, md)
|
||||||
if out, err = client.Echo(ctx, in); err != nil {
|
if out, err = client.Echo(ctx, in); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
46
metadata/context.go
Normal file
46
metadata/context.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type serverMetadataKey struct{}
|
||||||
|
|
||||||
|
// NewServerContext creates a new context with client md attached.
|
||||||
|
func NewServerContext(ctx context.Context, md Metadata) context.Context {
|
||||||
|
return context.WithValue(ctx, serverMetadataKey{}, md)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromServerContext returns the server metadata in ctx if it exists.
|
||||||
|
func FromServerContext(ctx context.Context) (Metadata, bool) {
|
||||||
|
md, ok := ctx.Value(serverMetadataKey{}).(Metadata)
|
||||||
|
return md, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
type clientMetadataKey struct{}
|
||||||
|
|
||||||
|
// NewClientContext creates a new context with client md attached.
|
||||||
|
func NewClientContext(ctx context.Context, md Metadata) context.Context {
|
||||||
|
return context.WithValue(ctx, clientMetadataKey{}, md)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromClientContext returns the client metadata in ctx if it exists.
|
||||||
|
func FromClientContext(ctx context.Context) (Metadata, bool) {
|
||||||
|
md, ok := ctx.Value(clientMetadataKey{}).(Metadata)
|
||||||
|
return md, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendToClientContext returns a new context with the provided kv merged
|
||||||
|
// with any existing metadata in the context.
|
||||||
|
func AppendToClientContext(ctx context.Context, kv ...string) context.Context {
|
||||||
|
if len(kv)%2 == 1 {
|
||||||
|
panic(fmt.Sprintf("metadata: AppendToOutgoingContext got an odd number of input pairs for metadata: %d", len(kv)))
|
||||||
|
}
|
||||||
|
md, _ := FromClientContext(ctx)
|
||||||
|
md = md.Clone()
|
||||||
|
for i := 0; i < len(kv); i += 2 {
|
||||||
|
md.Set(kv[i], kv[i+1])
|
||||||
|
}
|
||||||
|
return NewClientContext(ctx, md)
|
||||||
|
}
|
@ -10,15 +10,17 @@ import (
|
|||||||
type Metadata map[string]string
|
type Metadata map[string]string
|
||||||
|
|
||||||
// New creates an MD from a given key-values map.
|
// New creates an MD from a given key-values map.
|
||||||
func New(m map[string][]string) Metadata {
|
func New(mds ...map[string]string) Metadata {
|
||||||
md := Metadata{}
|
md := Metadata{}
|
||||||
for k, v := range m {
|
for _, m := range mds {
|
||||||
if k == "" {
|
for k, v := range m {
|
||||||
continue
|
if k == "" {
|
||||||
}
|
continue
|
||||||
key := strings.ToLower(k)
|
}
|
||||||
if len(v) > 0 && v[0] != "" {
|
key := strings.ToLower(k)
|
||||||
md[key] = v[0]
|
if len(v) > 0 && v != "" {
|
||||||
|
md[key] = v
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return md
|
return md
|
||||||
@ -39,24 +41,6 @@ func (m Metadata) Set(key string, value string) {
|
|||||||
m[k] = value
|
m[k] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keys lists the keys stored in this carrier.
|
|
||||||
func (m Metadata) Keys() []string {
|
|
||||||
keys := make([]string, 0, len(m))
|
|
||||||
for k := range m {
|
|
||||||
keys = append(keys, k)
|
|
||||||
}
|
|
||||||
return keys
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pairs returns all metadata to key/value pairs.
|
|
||||||
func (m Metadata) Pairs() []string {
|
|
||||||
var kvs = make([]string, 0, len(m)*2)
|
|
||||||
for k, v := range m {
|
|
||||||
kvs = append(kvs, k, v)
|
|
||||||
}
|
|
||||||
return kvs
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clone returns a deep copy of Metadata
|
// Clone returns a deep copy of Metadata
|
||||||
func (m Metadata) Clone() Metadata {
|
func (m Metadata) Clone() Metadata {
|
||||||
md := Metadata{}
|
md := Metadata{}
|
||||||
|
@ -7,7 +7,6 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/go-kratos/kratos/v2/log"
|
"github.com/go-kratos/kratos/v2/log"
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
"github.com/go-kratos/kratos/v2/middleware"
|
"github.com/go-kratos/kratos/v2/middleware"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
)
|
)
|
||||||
@ -34,18 +33,10 @@ func (tr *Transport) Operation() string {
|
|||||||
return tr.operation
|
return tr.operation
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tr *Transport) SetOperation(operation string) {
|
func (tr *Transport) Header() transport.Header {
|
||||||
tr.operation = operation
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tr *Transport) Metadata() metadata.Metadata {
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tr *Transport) WithMetadata(md metadata.Metadata) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHTTP(t *testing.T) {
|
func TestHTTP(t *testing.T) {
|
||||||
var err = errors.New("reply.error")
|
var err = errors.New("reply.error")
|
||||||
var bf = bytes.NewBuffer(nil)
|
var bf = bytes.NewBuffer(nil)
|
||||||
|
95
middleware/metadata/metadata.go
Normal file
95
middleware/metadata/metadata.go
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
package metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-kratos/kratos/v2/metadata"
|
||||||
|
"github.com/go-kratos/kratos/v2/middleware"
|
||||||
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Option is metadata option.
|
||||||
|
type Option func(*options)
|
||||||
|
|
||||||
|
type options struct {
|
||||||
|
prefix []string
|
||||||
|
md metadata.Metadata
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithConstants is option with constant metadata key value.
|
||||||
|
func WithConstants(md metadata.Metadata) Option {
|
||||||
|
return func(o *options) {
|
||||||
|
o.md = md
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPropagatedPrefix is option with global propagated key prefix.
|
||||||
|
func WithPropagatedPrefix(prefix ...string) Option {
|
||||||
|
return func(o *options) {
|
||||||
|
o.prefix = prefix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server is middleware client-side metadata.
|
||||||
|
func Server(opts ...Option) middleware.Middleware {
|
||||||
|
options := options{
|
||||||
|
prefix: []string{"x-md-global-", "x-md-local-"},
|
||||||
|
}
|
||||||
|
for _, o := range opts {
|
||||||
|
o(&options)
|
||||||
|
}
|
||||||
|
return func(handler middleware.Handler) middleware.Handler {
|
||||||
|
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
|
||||||
|
if tr, ok := transport.FromServerContext(ctx); ok {
|
||||||
|
md := metadata.Metadata{}
|
||||||
|
for _, k := range tr.Header().Keys() {
|
||||||
|
key := strings.ToLower(k)
|
||||||
|
for _, prefix := range options.prefix {
|
||||||
|
if strings.HasPrefix(key, prefix) {
|
||||||
|
md.Set(k, tr.Header().Get(k))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx = metadata.NewServerContext(ctx, md)
|
||||||
|
}
|
||||||
|
return handler(ctx, req)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client is middleware client-side metadata.
|
||||||
|
func Client(opts ...Option) middleware.Middleware {
|
||||||
|
options := options{
|
||||||
|
prefix: []string{"x-md-global-"},
|
||||||
|
}
|
||||||
|
for _, o := range opts {
|
||||||
|
o(&options)
|
||||||
|
}
|
||||||
|
return func(handler middleware.Handler) middleware.Handler {
|
||||||
|
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
|
||||||
|
if tr, ok := transport.FromClientContext(ctx); ok {
|
||||||
|
for k, v := range options.md {
|
||||||
|
tr.Header().Set(k, v)
|
||||||
|
}
|
||||||
|
if md, ok := metadata.FromClientContext(ctx); ok {
|
||||||
|
for k, v := range md {
|
||||||
|
tr.Header().Set(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if md, ok := metadata.FromServerContext(ctx); ok {
|
||||||
|
for k, v := range md {
|
||||||
|
for _, prefix := range options.prefix {
|
||||||
|
if strings.HasPrefix(k, prefix) {
|
||||||
|
tr.Header().Set(k, v)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return handler(ctx, req)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -38,7 +38,7 @@ func Server(opts ...Option) middleware.Middleware {
|
|||||||
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
|
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
|
||||||
if tr, ok := transport.FromServerContext(ctx); ok {
|
if tr, ok := transport.FromServerContext(ctx); ok {
|
||||||
var span trace.Span
|
var span trace.Span
|
||||||
ctx, span = tracer.Start(ctx, tr.Kind(), tr.Operation(), tr.Metadata())
|
ctx, span = tracer.Start(ctx, tr.Kind(), tr.Operation(), tr.Header())
|
||||||
defer func() { tracer.End(ctx, span, err) }()
|
defer func() { tracer.End(ctx, span, err) }()
|
||||||
}
|
}
|
||||||
return handler(ctx, req)
|
return handler(ctx, req)
|
||||||
@ -53,7 +53,7 @@ func Client(opts ...Option) middleware.Middleware {
|
|||||||
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
|
return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
|
||||||
if tr, ok := transport.FromClientContext(ctx); ok {
|
if tr, ok := transport.FromClientContext(ctx); ok {
|
||||||
var span trace.Span
|
var span trace.Span
|
||||||
ctx, span = tracer.Start(ctx, tr.Kind(), tr.Operation(), tr.Metadata())
|
ctx, span = tracer.Start(ctx, tr.Kind(), tr.Operation(), tr.Header())
|
||||||
defer func() { tracer.End(ctx, span, err) }()
|
defer func() { tracer.End(ctx, span, err) }()
|
||||||
}
|
}
|
||||||
return handler(ctx, req)
|
return handler(ctx, req)
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
"github.com/go-kratos/kratos/v2/middleware"
|
"github.com/go-kratos/kratos/v2/middleware"
|
||||||
"github.com/go-kratos/kratos/v2/registry"
|
"github.com/go-kratos/kratos/v2/registry"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
@ -117,7 +116,7 @@ func unaryClientInterceptor(ms []middleware.Middleware, timeout time.Duration) g
|
|||||||
ctx = transport.NewClientContext(ctx, &Transport{
|
ctx = transport.NewClientContext(ctx, &Transport{
|
||||||
endpoint: cc.Target(),
|
endpoint: cc.Target(),
|
||||||
operation: method,
|
operation: method,
|
||||||
metadata: metadata.Metadata{},
|
header: headerCarrier{},
|
||||||
})
|
})
|
||||||
if timeout > 0 {
|
if timeout > 0 {
|
||||||
var cancel context.CancelFunc
|
var cancel context.CancelFunc
|
||||||
@ -126,7 +125,12 @@ func unaryClientInterceptor(ms []middleware.Middleware, timeout time.Duration) g
|
|||||||
}
|
}
|
||||||
h := func(ctx context.Context, req interface{}) (interface{}, error) {
|
h := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
if tr, ok := transport.FromClientContext(ctx); ok {
|
if tr, ok := transport.FromClientContext(ctx); ok {
|
||||||
ctx = grpcmd.AppendToOutgoingContext(ctx, tr.Metadata().Pairs()...)
|
keys := tr.Header().Keys()
|
||||||
|
keyvals := make([]string, 0, len(keys))
|
||||||
|
for _, k := range keys {
|
||||||
|
keyvals = append(keyvals, k, tr.Header().Get(k))
|
||||||
|
}
|
||||||
|
ctx = grpcmd.AppendToOutgoingContext(ctx, keyvals...)
|
||||||
}
|
}
|
||||||
return reply, invoker(ctx, method, req, reply, cc, opts...)
|
return reply, invoker(ctx, method, req, reply, cc, opts...)
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@ import (
|
|||||||
ic "github.com/go-kratos/kratos/v2/internal/context"
|
ic "github.com/go-kratos/kratos/v2/internal/context"
|
||||||
"github.com/go-kratos/kratos/v2/internal/host"
|
"github.com/go-kratos/kratos/v2/internal/host"
|
||||||
"github.com/go-kratos/kratos/v2/log"
|
"github.com/go-kratos/kratos/v2/log"
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
"github.com/go-kratos/kratos/v2/middleware"
|
"github.com/go-kratos/kratos/v2/middleware"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
|
|
||||||
@ -181,7 +180,7 @@ func (s *Server) unaryServerInterceptor() grpc.UnaryServerInterceptor {
|
|||||||
ctx = transport.NewServerContext(ctx, &Transport{
|
ctx = transport.NewServerContext(ctx, &Transport{
|
||||||
endpoint: s.endpoint.String(),
|
endpoint: s.endpoint.String(),
|
||||||
operation: info.FullMethod,
|
operation: info.FullMethod,
|
||||||
metadata: metadata.New(md),
|
header: headerCarrier(md),
|
||||||
})
|
})
|
||||||
if s.timeout > 0 {
|
if s.timeout > 0 {
|
||||||
var cancel context.CancelFunc
|
var cancel context.CancelFunc
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package grpc
|
package grpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
|
"google.golang.org/grpc/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -13,7 +13,7 @@ var (
|
|||||||
type Transport struct {
|
type Transport struct {
|
||||||
endpoint string
|
endpoint string
|
||||||
operation string
|
operation string
|
||||||
metadata metadata.Metadata
|
header headerCarrier
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kind returns the transport kind.
|
// Kind returns the transport kind.
|
||||||
@ -31,19 +31,32 @@ func (tr *Transport) Operation() string {
|
|||||||
return tr.operation
|
return tr.operation
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetOperation sets the transport operation.
|
// Header returns the transport header.
|
||||||
func (tr *Transport) SetOperation(operation string) {
|
func (tr *Transport) Header() transport.Header {
|
||||||
tr.operation = operation
|
return tr.header
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata returns the transport metadata.
|
type headerCarrier metadata.MD
|
||||||
func (tr *Transport) Metadata() metadata.Metadata {
|
|
||||||
return tr.metadata
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMetadata with a metadata into transport md.
|
// Get returns the value associated with the passed key.
|
||||||
func (tr *Transport) WithMetadata(md metadata.Metadata) {
|
func (mc headerCarrier) Get(key string) string {
|
||||||
for k, v := range md {
|
vals := metadata.MD(mc).Get(key)
|
||||||
tr.metadata.Set(k, v)
|
if len(vals) > 0 {
|
||||||
|
return vals[0]
|
||||||
}
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set stores the key-value pair.
|
||||||
|
func (mc headerCarrier) Set(key string, value string) {
|
||||||
|
metadata.MD(mc).Set(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keys lists the keys stored in this carrier.
|
||||||
|
func (mc headerCarrier) Keys() []string {
|
||||||
|
keys := make([]string, 0, len(mc))
|
||||||
|
for k := range metadata.MD(mc) {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
return keys
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package http
|
package http
|
||||||
|
|
||||||
import "github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
|
|
||||||
// CallOption configures a Call before it starts or extracts information from
|
// CallOption configures a Call before it starts or extracts information from
|
||||||
// a Call after it completes.
|
// a Call after it completes.
|
||||||
type CallOption interface {
|
type CallOption interface {
|
||||||
@ -17,7 +15,6 @@ type CallOption interface {
|
|||||||
type callInfo struct {
|
type callInfo struct {
|
||||||
contentType string
|
contentType string
|
||||||
operation string
|
operation string
|
||||||
metatada metadata.Metadata
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// EmptyCallOption does not alter the Call configuration.
|
// EmptyCallOption does not alter the Call configuration.
|
||||||
@ -50,7 +47,6 @@ func defaultCallInfo(path string) callInfo {
|
|||||||
return callInfo{
|
return callInfo{
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
operation: path,
|
operation: path,
|
||||||
metatada: metadata.Metadata{},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,19 +65,3 @@ func (o OperationCallOption) before(c *callInfo) error {
|
|||||||
c.operation = o.Operation
|
c.operation = o.Operation
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata is Metadata call option
|
|
||||||
func Metadata(metatada metadata.Metadata) CallOption {
|
|
||||||
return MetadataCallOption{Metatada: metatada}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MetadataCallOption is set Metadata for client call
|
|
||||||
type MetadataCallOption struct {
|
|
||||||
EmptyCallOption
|
|
||||||
Metatada metadata.Metadata
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o MetadataCallOption) before(c *callInfo) error {
|
|
||||||
c.metatada = o.Metatada
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
"github.com/go-kratos/kratos/v2/encoding"
|
"github.com/go-kratos/kratos/v2/encoding"
|
||||||
"github.com/go-kratos/kratos/v2/errors"
|
"github.com/go-kratos/kratos/v2/errors"
|
||||||
"github.com/go-kratos/kratos/v2/internal/httputil"
|
"github.com/go-kratos/kratos/v2/internal/httputil"
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
"github.com/go-kratos/kratos/v2/middleware"
|
"github.com/go-kratos/kratos/v2/middleware"
|
||||||
"github.com/go-kratos/kratos/v2/registry"
|
"github.com/go-kratos/kratos/v2/registry"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
@ -197,12 +196,9 @@ func (client *Client) Invoke(ctx context.Context, method, path string, args inte
|
|||||||
if client.opts.userAgent != "" {
|
if client.opts.userAgent != "" {
|
||||||
req.Header.Set("User-Agent", client.opts.userAgent)
|
req.Header.Set("User-Agent", client.opts.userAgent)
|
||||||
}
|
}
|
||||||
if c.metatada == nil {
|
|
||||||
c.metatada = metadata.Metadata{}
|
|
||||||
}
|
|
||||||
ctx = transport.NewClientContext(ctx, &Transport{
|
ctx = transport.NewClientContext(ctx, &Transport{
|
||||||
endpoint: client.opts.endpoint,
|
endpoint: client.opts.endpoint,
|
||||||
metadata: c.metatada,
|
header: headerCarrier(req.Header),
|
||||||
path: path,
|
path: path,
|
||||||
method: method,
|
method: method,
|
||||||
operation: c.operation,
|
operation: c.operation,
|
||||||
@ -230,11 +226,6 @@ func (client *Client) invoke(ctx context.Context, req *http.Request, args interf
|
|||||||
req.URL.Scheme = scheme
|
req.URL.Scheme = scheme
|
||||||
req.URL.Host = addr
|
req.URL.Host = addr
|
||||||
}
|
}
|
||||||
if tr, ok := transport.FromClientContext(ctx); ok {
|
|
||||||
for _, key := range tr.Metadata().Keys() {
|
|
||||||
req.Header.Set(key, tr.Metadata().Get(key))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
res, err := client.do(ctx, req, c)
|
res, err := client.do(ctx, req, c)
|
||||||
if done != nil {
|
if done != nil {
|
||||||
done(ctx, balancer.DoneInfo{Err: err})
|
done(ctx, balancer.DoneInfo{Err: err})
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
ic "github.com/go-kratos/kratos/v2/internal/context"
|
ic "github.com/go-kratos/kratos/v2/internal/context"
|
||||||
"github.com/go-kratos/kratos/v2/internal/host"
|
"github.com/go-kratos/kratos/v2/internal/host"
|
||||||
"github.com/go-kratos/kratos/v2/log"
|
"github.com/go-kratos/kratos/v2/log"
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
"github.com/go-kratos/kratos/v2/middleware"
|
"github.com/go-kratos/kratos/v2/middleware"
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
|
|
||||||
@ -168,7 +167,7 @@ func (s *Server) filter() mux.MiddlewareFunc {
|
|||||||
path: req.RequestURI,
|
path: req.RequestURI,
|
||||||
method: req.Method,
|
method: req.Method,
|
||||||
operation: req.RequestURI,
|
operation: req.RequestURI,
|
||||||
metadata: metadata.New(req.Header),
|
header: headerCarrier(req.Header),
|
||||||
}
|
}
|
||||||
if r := mux.CurrentRoute(req); r != nil {
|
if r := mux.CurrentRoute(req); r != nil {
|
||||||
if path, err := r.GetPathTemplate(); err == nil {
|
if path, err := r.GetPathTemplate(); err == nil {
|
||||||
|
@ -2,8 +2,8 @@ package http
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
"github.com/go-kratos/kratos/v2/transport"
|
"github.com/go-kratos/kratos/v2/transport"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ type Transport struct {
|
|||||||
path string
|
path string
|
||||||
method string
|
method string
|
||||||
operation string
|
operation string
|
||||||
metadata metadata.Metadata
|
header headerCarrier
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kind returns the transport kind.
|
// Kind returns the transport kind.
|
||||||
@ -35,21 +35,9 @@ func (tr *Transport) Operation() string {
|
|||||||
return tr.operation
|
return tr.operation
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetOperation sets the transport operation.
|
// Header returns the transport header.
|
||||||
func (tr *Transport) SetOperation(operation string) {
|
func (tr *Transport) Header() transport.Header {
|
||||||
tr.operation = operation
|
return tr.header
|
||||||
}
|
|
||||||
|
|
||||||
// Metadata returns the transport metadata.
|
|
||||||
func (tr *Transport) Metadata() metadata.Metadata {
|
|
||||||
return tr.metadata
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMetadata with a metadata into transport md.
|
|
||||||
func (tr *Transport) WithMetadata(md metadata.Metadata) {
|
|
||||||
for k, v := range md {
|
|
||||||
tr.metadata.Set(k, v)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path returns the Transport path from server context.
|
// Path returns the Transport path from server context.
|
||||||
@ -71,3 +59,33 @@ func Method(ctx context.Context) string {
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetOperation sets the transport operation.
|
||||||
|
func SetOperation(ctx context.Context, op string) {
|
||||||
|
if tr, ok := transport.FromServerContext(ctx); ok {
|
||||||
|
if tr, ok := tr.(*Transport); ok {
|
||||||
|
tr.operation = op
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type headerCarrier http.Header
|
||||||
|
|
||||||
|
// Get returns the value associated with the passed key.
|
||||||
|
func (hc headerCarrier) Get(key string) string {
|
||||||
|
return http.Header(hc).Get(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set stores the key-value pair.
|
||||||
|
func (hc headerCarrier) Set(key string, value string) {
|
||||||
|
http.Header(hc).Set(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keys lists the keys stored in this carrier.
|
||||||
|
func (hc headerCarrier) Keys() []string {
|
||||||
|
keys := make([]string, 0, len(hc))
|
||||||
|
for k := range http.Header(hc) {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
@ -9,7 +9,6 @@ import (
|
|||||||
_ "github.com/go-kratos/kratos/v2/encoding/proto"
|
_ "github.com/go-kratos/kratos/v2/encoding/proto"
|
||||||
_ "github.com/go-kratos/kratos/v2/encoding/xml"
|
_ "github.com/go-kratos/kratos/v2/encoding/xml"
|
||||||
_ "github.com/go-kratos/kratos/v2/encoding/yaml"
|
_ "github.com/go-kratos/kratos/v2/encoding/yaml"
|
||||||
"github.com/go-kratos/kratos/v2/metadata"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server is transport server.
|
// Server is transport server.
|
||||||
@ -23,18 +22,19 @@ type Endpointer interface {
|
|||||||
Endpoint() (*url.URL, error)
|
Endpoint() (*url.URL, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Header is the storage medium used by a Header.
|
||||||
|
type Header interface {
|
||||||
|
Get(key string) string
|
||||||
|
Set(key string, value string)
|
||||||
|
Keys() []string
|
||||||
|
}
|
||||||
|
|
||||||
// Transporter is transport context value interface.
|
// Transporter is transport context value interface.
|
||||||
type Transporter interface {
|
type Transporter interface {
|
||||||
Kind() string
|
Kind() string
|
||||||
Endpoint() string
|
Endpoint() string
|
||||||
|
|
||||||
Operation() string
|
Operation() string
|
||||||
SetOperation(string)
|
Header() Header
|
||||||
|
|
||||||
Metadata() metadata.Metadata
|
|
||||||
// WithMetadata merge new metadata into transport,
|
|
||||||
// it will override old metadata key value if key exists
|
|
||||||
WithMetadata(metadata.Metadata)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type serverTransportKey struct{}
|
type serverTransportKey struct{}
|
||||||
@ -61,26 +61,3 @@ func FromClientContext(ctx context.Context) (tr Transporter, ok bool) {
|
|||||||
tr, ok = ctx.Value(clientTransportKey{}).(Transporter)
|
tr, ok = ctx.Value(clientTransportKey{}).(Transporter)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetOperation set operation into context transport.
|
|
||||||
func SetOperation(ctx context.Context, method string) {
|
|
||||||
if tr, ok := FromServerContext(ctx); ok {
|
|
||||||
tr.SetOperation(method)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Operation returns the Transport operation from server context.
|
|
||||||
func Operation(ctx context.Context) string {
|
|
||||||
if tr, ok := FromServerContext(ctx); ok {
|
|
||||||
return tr.Operation()
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Metadata returns incoming metadata from server transport.
|
|
||||||
func Metadata(ctx context.Context) metadata.Metadata {
|
|
||||||
if tr, ok := FromServerContext(ctx); ok {
|
|
||||||
return tr.Metadata()
|
|
||||||
}
|
|
||||||
return metadata.Metadata{}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user