unary_handler.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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. return nil
  20. }
  21. httpCtx := ctx
  22. interceptor := func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
  23. ctx = middleware.NewOptionContext(ctx, option)
  24. h := httpCtx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
  25. return handler(ctx, req)
  26. })
  27. return h(ctx, req)
  28. }
  29. out, err := method.Handler(srv, ctx, dec, interceptor)
  30. if err != nil {
  31. return err
  32. }
  33. f := reply.DefaultFunc(out)
  34. if f != nil {
  35. success := reply.GetReplyFunc()(out)
  36. return ctx.Result(200, success)
  37. }
  38. return ctx.Result(200, out)
  39. }
  40. }