...

Source file src/github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/server/a_bit_of_everything.go

Documentation: github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/server

     1  package server
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"sync"
     8  	"time"
     9  
    10  	examples "github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/proto/examplepb"
    11  	"github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/proto/oneofenum"
    12  	"github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/proto/pathenum"
    13  	"github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/proto/sub"
    14  	"github.com/grpc-ecosystem/grpc-gateway/v2/examples/internal/proto/sub2"
    15  	"github.com/rogpeppe/fastuuid"
    16  	"google.golang.org/genproto/googleapis/api/httpbody"
    17  	"google.golang.org/genproto/googleapis/rpc/errdetails"
    18  	statuspb "google.golang.org/genproto/googleapis/rpc/status"
    19  	"google.golang.org/grpc"
    20  	"google.golang.org/grpc/codes"
    21  	"google.golang.org/grpc/grpclog"
    22  	"google.golang.org/grpc/metadata"
    23  	"google.golang.org/grpc/status"
    24  	"google.golang.org/protobuf/types/known/durationpb"
    25  	"google.golang.org/protobuf/types/known/emptypb"
    26  	"google.golang.org/protobuf/types/known/wrapperspb"
    27  )
    28  
    29  // Implements of ABitOfEverythingServiceServer
    30  
    31  var uuidgen = fastuuid.MustNewGenerator()
    32  
    33  type _ABitOfEverythingServer struct {
    34  	v map[string]*examples.ABitOfEverything
    35  	m sync.Mutex
    36  }
    37  
    38  type ABitOfEverythingServer interface {
    39  	examples.ABitOfEverythingServiceServer
    40  	examples.StreamServiceServer
    41  }
    42  
    43  func newABitOfEverythingServer() ABitOfEverythingServer {
    44  	return &_ABitOfEverythingServer{
    45  		v: make(map[string]*examples.ABitOfEverything),
    46  	}
    47  }
    48  
    49  func (s *_ABitOfEverythingServer) Create(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
    50  	s.m.Lock()
    51  	defer s.m.Unlock()
    52  
    53  	grpclog.Info(msg)
    54  	var uuid string
    55  	for {
    56  		uuid = fmt.Sprintf("%x", uuidgen.Next())
    57  		if _, ok := s.v[uuid]; !ok {
    58  			break
    59  		}
    60  	}
    61  	s.v[uuid] = msg
    62  	s.v[uuid].Uuid = uuid
    63  	grpclog.Infof("%v", s.v[uuid])
    64  	return s.v[uuid], nil
    65  }
    66  
    67  func (s *_ABitOfEverythingServer) CreateBody(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
    68  	return s.Create(ctx, msg)
    69  }
    70  
    71  func (s *_ABitOfEverythingServer) CreateBook(ctx context.Context, req *examples.CreateBookRequest) (*examples.Book, error) {
    72  	return &examples.Book{}, nil
    73  }
    74  
    75  func (s *_ABitOfEverythingServer) UpdateBook(ctx context.Context, req *examples.UpdateBookRequest) (*examples.Book, error) {
    76  	return &examples.Book{}, nil
    77  }
    78  
    79  func (s *_ABitOfEverythingServer) BulkCreate(stream examples.StreamService_BulkCreateServer) error {
    80  	ctx := stream.Context()
    81  
    82  	if header, ok := metadata.FromIncomingContext(ctx); ok {
    83  		if v, ok := header["error"]; ok {
    84  			return status.Errorf(codes.InvalidArgument, "error metadata: %v", v)
    85  		}
    86  	}
    87  
    88  	count := 0
    89  	for {
    90  		msg, err := stream.Recv()
    91  		if err == io.EOF {
    92  			break
    93  		}
    94  		if err != nil {
    95  			return err
    96  		}
    97  		count++
    98  		grpclog.Info(msg)
    99  		if _, err = s.Create(ctx, msg); err != nil {
   100  			return err
   101  		}
   102  	}
   103  
   104  	err := stream.SendHeader(metadata.New(map[string]string{
   105  		"count": fmt.Sprintf("%d", count),
   106  	}))
   107  	if err != nil {
   108  		return nil
   109  	}
   110  
   111  	stream.SetTrailer(metadata.New(map[string]string{
   112  		"foo": "foo2",
   113  		"bar": "bar2",
   114  	}))
   115  	return stream.SendAndClose(new(emptypb.Empty))
   116  }
   117  
   118  func (s *_ABitOfEverythingServer) Lookup(ctx context.Context, msg *sub2.IdMessage) (*examples.ABitOfEverything, error) {
   119  	s.m.Lock()
   120  	defer s.m.Unlock()
   121  	grpclog.Info(msg)
   122  
   123  	err := grpc.SendHeader(ctx, metadata.New(map[string]string{
   124  		"uuid": msg.Uuid,
   125  	}))
   126  	if err != nil {
   127  		return nil, err
   128  	}
   129  
   130  	if a, ok := s.v[msg.Uuid]; ok {
   131  		return a, nil
   132  	}
   133  
   134  	grpc.SetTrailer(ctx, metadata.New(map[string]string{
   135  		"foo": "foo2",
   136  		"bar": "bar2",
   137  	}))
   138  	return nil, status.Errorf(codes.NotFound, "not found")
   139  }
   140  
   141  func (s *_ABitOfEverythingServer) List(opt *examples.Options, stream examples.StreamService_ListServer) error {
   142  	s.m.Lock()
   143  	defer s.m.Unlock()
   144  
   145  	err := stream.SendHeader(metadata.New(map[string]string{
   146  		"count": fmt.Sprintf("%d", len(s.v)),
   147  	}))
   148  	if err != nil {
   149  		return nil
   150  	}
   151  
   152  	for _, msg := range s.v {
   153  		if err := stream.Send(msg); err != nil {
   154  			return err
   155  		}
   156  	}
   157  
   158  	if opt.Error {
   159  		stream.SetTrailer(metadata.New(map[string]string{
   160  			"foo": "foo2",
   161  			"bar": "bar2",
   162  		}))
   163  		return status.Error(codes.InvalidArgument, "error")
   164  	}
   165  	return nil
   166  }
   167  
   168  func (s *_ABitOfEverythingServer) Download(opt *examples.Options, stream examples.StreamService_DownloadServer) error {
   169  	msgs := []*httpbody.HttpBody{{
   170  		ContentType: "text/html",
   171  		Data:        []byte("Hello 1"),
   172  	}, {
   173  		ContentType: "text/html",
   174  		Data:        []byte("Hello 2"),
   175  	}}
   176  
   177  	for _, msg := range msgs {
   178  		if err := stream.Send(msg); err != nil {
   179  			return err
   180  		}
   181  
   182  		time.Sleep(5 * time.Millisecond)
   183  	}
   184  
   185  	if opt.Error {
   186  		stream.SetTrailer(metadata.New(map[string]string{
   187  			"foo": "foo2",
   188  			"bar": "bar2",
   189  		}))
   190  		return status.Error(codes.InvalidArgument, "error")
   191  	}
   192  	return nil
   193  }
   194  
   195  func (s *_ABitOfEverythingServer) Custom(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   196  	s.m.Lock()
   197  	defer s.m.Unlock()
   198  
   199  	grpclog.Info(msg)
   200  	if _, ok := s.v[msg.Uuid]; ok {
   201  		s.v[msg.Uuid] = msg
   202  	} else {
   203  		return nil, status.Errorf(codes.NotFound, "not found")
   204  	}
   205  	return msg, nil
   206  }
   207  
   208  func (s *_ABitOfEverythingServer) DoubleColon(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   209  	s.m.Lock()
   210  	defer s.m.Unlock()
   211  
   212  	grpclog.Info(msg)
   213  	if _, ok := s.v[msg.Uuid]; ok {
   214  		s.v[msg.Uuid] = msg
   215  	} else {
   216  		return nil, status.Errorf(codes.NotFound, "not found")
   217  	}
   218  	return msg, nil
   219  }
   220  
   221  func (s *_ABitOfEverythingServer) Update(ctx context.Context, msg *examples.ABitOfEverything) (*emptypb.Empty, error) {
   222  	s.m.Lock()
   223  	defer s.m.Unlock()
   224  
   225  	grpclog.Info(msg)
   226  	if _, ok := s.v[msg.Uuid]; ok {
   227  		s.v[msg.Uuid] = msg
   228  	} else {
   229  		return nil, status.Errorf(codes.NotFound, "not found")
   230  	}
   231  	return new(emptypb.Empty), nil
   232  }
   233  
   234  func (s *_ABitOfEverythingServer) UpdateV2(ctx context.Context, msg *examples.UpdateV2Request) (*emptypb.Empty, error) {
   235  	grpclog.Info(msg)
   236  	// If there is no update mask do a regular update
   237  	if msg.UpdateMask == nil || len(msg.UpdateMask.GetPaths()) == 0 {
   238  		return s.Update(ctx, msg.Abe)
   239  	}
   240  
   241  	s.m.Lock()
   242  	defer s.m.Unlock()
   243  	if a, ok := s.v[msg.Abe.Uuid]; ok {
   244  		applyFieldMask(a, msg.Abe, msg.UpdateMask)
   245  	} else {
   246  		return nil, status.Errorf(codes.NotFound, "not found")
   247  	}
   248  	return new(emptypb.Empty), nil
   249  }
   250  
   251  func (s *_ABitOfEverythingServer) Delete(ctx context.Context, msg *sub2.IdMessage) (*emptypb.Empty, error) {
   252  	s.m.Lock()
   253  	defer s.m.Unlock()
   254  
   255  	grpclog.Info(msg)
   256  	if _, ok := s.v[msg.Uuid]; ok {
   257  		delete(s.v, msg.Uuid)
   258  	} else {
   259  		return nil, status.Errorf(codes.NotFound, "not found")
   260  	}
   261  	return new(emptypb.Empty), nil
   262  }
   263  
   264  func (s *_ABitOfEverythingServer) GetQuery(ctx context.Context, msg *examples.ABitOfEverything) (*emptypb.Empty, error) {
   265  	s.m.Lock()
   266  	defer s.m.Unlock()
   267  
   268  	grpclog.Info(msg)
   269  	if _, ok := s.v[msg.Uuid]; ok {
   270  		s.v[msg.Uuid] = msg
   271  	} else {
   272  		return nil, status.Errorf(codes.NotFound, "not found")
   273  	}
   274  	return new(emptypb.Empty), nil
   275  }
   276  
   277  func (s *_ABitOfEverythingServer) GetRepeatedQuery(ctx context.Context, msg *examples.ABitOfEverythingRepeated) (*examples.ABitOfEverythingRepeated, error) {
   278  	s.m.Lock()
   279  	defer s.m.Unlock()
   280  
   281  	grpclog.Info(msg)
   282  	return msg, nil
   283  }
   284  
   285  func (s *_ABitOfEverythingServer) Echo(ctx context.Context, msg *sub.StringMessage) (*sub.StringMessage, error) {
   286  	s.m.Lock()
   287  	defer s.m.Unlock()
   288  
   289  	grpclog.Info(msg)
   290  	return msg, nil
   291  }
   292  
   293  func (s *_ABitOfEverythingServer) BulkEcho(stream examples.StreamService_BulkEchoServer) error {
   294  	var msgs []*sub.StringMessage
   295  	for {
   296  		msg, err := stream.Recv()
   297  		if err == io.EOF {
   298  			break
   299  		}
   300  		if err != nil {
   301  			return err
   302  		}
   303  		msgs = append(msgs, msg)
   304  	}
   305  
   306  	hmd := metadata.New(map[string]string{
   307  		"foo": "foo1",
   308  		"bar": "bar1",
   309  	})
   310  	if err := stream.SendHeader(hmd); err != nil {
   311  		return err
   312  	}
   313  
   314  	for _, msg := range msgs {
   315  		grpclog.Info(msg)
   316  		if err := stream.Send(msg); err != nil {
   317  			return err
   318  		}
   319  	}
   320  
   321  	stream.SetTrailer(metadata.New(map[string]string{
   322  		"foo": "foo2",
   323  		"bar": "bar2",
   324  	}))
   325  	return nil
   326  }
   327  
   328  func (s *_ABitOfEverythingServer) DeepPathEcho(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   329  	s.m.Lock()
   330  	defer s.m.Unlock()
   331  
   332  	grpclog.Info(msg)
   333  	return msg, nil
   334  }
   335  
   336  func (s *_ABitOfEverythingServer) NoBindings(ctx context.Context, msg *durationpb.Duration) (*emptypb.Empty, error) {
   337  	return nil, nil
   338  }
   339  
   340  func (s *_ABitOfEverythingServer) Timeout(ctx context.Context, msg *emptypb.Empty) (*emptypb.Empty, error) {
   341  	<-ctx.Done()
   342  	return nil, status.FromContextError(ctx.Err()).Err()
   343  }
   344  
   345  func (s *_ABitOfEverythingServer) ErrorWithDetails(ctx context.Context, msg *emptypb.Empty) (*emptypb.Empty, error) {
   346  	stat, err := status.New(codes.Unknown, "with details").
   347  		WithDetails(&errdetails.DebugInfo{
   348  			StackEntries: []string{"foo:1"},
   349  			Detail:       "error debug details",
   350  		})
   351  	if err != nil {
   352  		return nil, status.Errorf(codes.Internal, "unexpected error adding details: %s", err)
   353  	}
   354  	return nil, stat.Err()
   355  }
   356  
   357  func (s *_ABitOfEverythingServer) GetMessageWithBody(ctx context.Context, msg *examples.MessageWithBody) (*emptypb.Empty, error) {
   358  	return &emptypb.Empty{}, nil
   359  }
   360  
   361  func (s *_ABitOfEverythingServer) PostWithEmptyBody(ctx context.Context, msg *examples.Body) (*emptypb.Empty, error) {
   362  	return &emptypb.Empty{}, nil
   363  }
   364  
   365  func (s *_ABitOfEverythingServer) CheckGetQueryParams(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   366  	return msg, nil
   367  }
   368  
   369  func (s *_ABitOfEverythingServer) CheckNestedEnumGetQueryParams(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   370  	return msg, nil
   371  }
   372  
   373  func (s *_ABitOfEverythingServer) CheckPostQueryParams(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   374  	return msg, nil
   375  }
   376  
   377  func (s *_ABitOfEverythingServer) OverwriteRequestContentType(ctx context.Context, msg *examples.Body) (*emptypb.Empty, error) {
   378  	return &emptypb.Empty{}, nil
   379  }
   380  
   381  func (s *_ABitOfEverythingServer) OverwriteResponseContentType(ctx context.Context, msg *emptypb.Empty) (*wrapperspb.StringValue, error) {
   382  	return &wrapperspb.StringValue{}, nil
   383  }
   384  
   385  func (s *_ABitOfEverythingServer) CheckExternalPathEnum(ctx context.Context, msg *pathenum.MessageWithPathEnum) (*emptypb.Empty, error) {
   386  	return &emptypb.Empty{}, nil
   387  }
   388  
   389  func (s *_ABitOfEverythingServer) CheckExternalNestedPathEnum(ctx context.Context, msg *pathenum.MessageWithNestedPathEnum) (*emptypb.Empty, error) {
   390  	return &emptypb.Empty{}, nil
   391  }
   392  
   393  func (s *_ABitOfEverythingServer) CheckStatus(ctx context.Context, empty *emptypb.Empty) (*examples.CheckStatusResponse, error) {
   394  	return &examples.CheckStatusResponse{Status: &statuspb.Status{}}, nil
   395  }
   396  
   397  func (s *_ABitOfEverythingServer) Exists(ctx context.Context, msg *examples.ABitOfEverything) (*emptypb.Empty, error) {
   398  	if _, ok := s.v[msg.Uuid]; ok {
   399  		return new(emptypb.Empty), nil
   400  	}
   401  
   402  	return nil, status.Errorf(codes.NotFound, "not found")
   403  }
   404  
   405  func (s *_ABitOfEverythingServer) CustomOptionsRequest(ctx context.Context, msg *examples.ABitOfEverything) (*emptypb.Empty, error) {
   406  	err := grpc.SendHeader(ctx, metadata.New(map[string]string{
   407  		"Allow": "OPTIONS, GET, HEAD, POST, PUT, TRACE",
   408  	}))
   409  	if err != nil {
   410  		return nil, err
   411  	}
   412  	return new(emptypb.Empty), nil
   413  }
   414  
   415  func (s *_ABitOfEverythingServer) TraceRequest(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   416  	return msg, nil
   417  }
   418  
   419  func (s *_ABitOfEverythingServer) PostOneofEnum(ctx context.Context, msg *oneofenum.OneofEnumMessage) (*emptypb.Empty, error) {
   420  	return new(emptypb.Empty), nil
   421  }
   422  
   423  func (s *_ABitOfEverythingServer) PostRequiredMessageType(ctx context.Context, req *examples.RequiredMessageTypeRequest) (*emptypb.Empty, error) {
   424  	return new(emptypb.Empty), nil
   425  }
   426  

View as plain text