unary_handler.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package handler
  2. import (
  3. "context"
  4. "git.ikuban.com/server/kratos-utils/v2/transport/http/reply"
  5. "git.ikuban.com/server/kratos-utils/v2/transport/middleware"
  6. "github.com/go-kratos/kratos/v2/transport/http"
  7. "google.golang.org/grpc"
  8. )
  9. func unaryHandler(srv any, method grpc.MethodDesc, option *middleware.Option) http.HandlerFunc {
  10. return func(ctx http.Context) error {
  11. http.SetOperation(ctx, option.Path)
  12. dec := func(in any) error {
  13. if err := ctx.Bind(&in); err != nil {
  14. return err
  15. }
  16. if err := ctx.BindQuery(&in); err != nil {
  17. return err
  18. }
  19. // Bind URL path variables
  20. if err := ctx.BindVars(&in); err != nil {
  21. return err
  22. }
  23. return nil
  24. }
  25. httpCtx := ctx
  26. interceptor := func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
  27. ctx = middleware.NewOptionContext(ctx, option)
  28. h := httpCtx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
  29. return handler(ctx, req)
  30. })
  31. return h(ctx, req)
  32. }
  33. out, err := method.Handler(srv, ctx, dec, interceptor)
  34. if err != nil {
  35. return err
  36. }
  37. return ctx.Result(200, reply.WrapReply(out))
  38. }
  39. }