...

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

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

     1  package server
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"sync"
     8  
     9  	"github.com/golang/glog"
    10  	"github.com/golang/protobuf/proto"
    11  	"github.com/golang/protobuf/ptypes/duration"
    12  	"github.com/golang/protobuf/ptypes/empty"
    13  	"github.com/golang/protobuf/ptypes/wrappers"
    14  	examples "github.com/grpc-ecosystem/grpc-gateway/examples/internal/proto/examplepb"
    15  	"github.com/grpc-ecosystem/grpc-gateway/examples/internal/proto/pathenum"
    16  	"github.com/grpc-ecosystem/grpc-gateway/examples/internal/proto/sub"
    17  	"github.com/grpc-ecosystem/grpc-gateway/examples/internal/proto/sub2"
    18  	"github.com/rogpeppe/fastuuid"
    19  	"google.golang.org/genproto/googleapis/rpc/errdetails"
    20  	"google.golang.org/grpc"
    21  	"google.golang.org/grpc/codes"
    22  	"google.golang.org/grpc/metadata"
    23  	"google.golang.org/grpc/status"
    24  )
    25  
    26  // Implements of ABitOfEverythingServiceServer
    27  
    28  var uuidgen = fastuuid.MustNewGenerator()
    29  
    30  type _ABitOfEverythingServer struct {
    31  	v map[string]*examples.ABitOfEverything
    32  	m sync.Mutex
    33  }
    34  
    35  type ABitOfEverythingServer interface {
    36  	examples.ABitOfEverythingServiceServer
    37  	examples.StreamServiceServer
    38  }
    39  
    40  func newABitOfEverythingServer() ABitOfEverythingServer {
    41  	return &_ABitOfEverythingServer{
    42  		v: make(map[string]*examples.ABitOfEverything),
    43  	}
    44  }
    45  
    46  func (s *_ABitOfEverythingServer) Create(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
    47  	s.m.Lock()
    48  	defer s.m.Unlock()
    49  
    50  	glog.Info(msg)
    51  	var uuid string
    52  	for {
    53  		uuid = fmt.Sprintf("%x", uuidgen.Next())
    54  		if _, ok := s.v[uuid]; !ok {
    55  			break
    56  		}
    57  	}
    58  	s.v[uuid] = msg
    59  	s.v[uuid].Uuid = uuid
    60  	glog.Infof("%v", s.v[uuid])
    61  	return s.v[uuid], nil
    62  }
    63  
    64  func (s *_ABitOfEverythingServer) CreateBody(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
    65  	return s.Create(ctx, msg)
    66  }
    67  
    68  func (s *_ABitOfEverythingServer) CreateBook(ctx context.Context, req *examples.CreateBookRequest) (*examples.Book, error) {
    69  	return &examples.Book{}, nil
    70  }
    71  
    72  func (s *_ABitOfEverythingServer) BulkCreate(stream examples.StreamService_BulkCreateServer) error {
    73  	ctx := stream.Context()
    74  
    75  	if header, ok := metadata.FromIncomingContext(ctx); ok {
    76  		if v, ok := header["error"]; ok {
    77  			return status.Errorf(codes.InvalidArgument, "error metadata: %v", v)
    78  		}
    79  	}
    80  
    81  	count := 0
    82  	for {
    83  		msg, err := stream.Recv()
    84  		if err == io.EOF {
    85  			break
    86  		}
    87  		if err != nil {
    88  			return err
    89  		}
    90  		count++
    91  		glog.Info(msg)
    92  		if _, err = s.Create(ctx, msg); err != nil {
    93  			return err
    94  		}
    95  	}
    96  
    97  	err := stream.SendHeader(metadata.New(map[string]string{
    98  		"count": fmt.Sprintf("%d", count),
    99  	}))
   100  	if err != nil {
   101  		return nil
   102  	}
   103  
   104  	stream.SetTrailer(metadata.New(map[string]string{
   105  		"foo": "foo2",
   106  		"bar": "bar2",
   107  	}))
   108  	return stream.SendAndClose(new(empty.Empty))
   109  }
   110  
   111  func (s *_ABitOfEverythingServer) Lookup(ctx context.Context, msg *sub2.IdMessage) (*examples.ABitOfEverything, error) {
   112  	s.m.Lock()
   113  	defer s.m.Unlock()
   114  	glog.Info(msg)
   115  
   116  	err := grpc.SendHeader(ctx, metadata.New(map[string]string{
   117  		"uuid": msg.Uuid,
   118  	}))
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  
   123  	if a, ok := s.v[msg.Uuid]; ok {
   124  		return a, nil
   125  	}
   126  
   127  	grpc.SetTrailer(ctx, metadata.New(map[string]string{
   128  		"foo": "foo2",
   129  		"bar": "bar2",
   130  	}))
   131  	return nil, status.Errorf(codes.NotFound, "not found")
   132  }
   133  
   134  func (s *_ABitOfEverythingServer) List(_ *empty.Empty, stream examples.StreamService_ListServer) error {
   135  	s.m.Lock()
   136  	defer s.m.Unlock()
   137  
   138  	err := stream.SendHeader(metadata.New(map[string]string{
   139  		"count": fmt.Sprintf("%d", len(s.v)),
   140  	}))
   141  	if err != nil {
   142  		return nil
   143  	}
   144  
   145  	for _, msg := range s.v {
   146  		if err := stream.Send(msg); err != nil {
   147  			return err
   148  		}
   149  	}
   150  
   151  	// return error when metadata includes error header
   152  	if header, ok := metadata.FromIncomingContext(stream.Context()); ok {
   153  		if v, ok := header["error"]; ok {
   154  			stream.SetTrailer(metadata.New(map[string]string{
   155  				"foo": "foo2",
   156  				"bar": "bar2",
   157  			}))
   158  			return status.Errorf(codes.InvalidArgument, "error metadata: %v", v)
   159  		}
   160  	}
   161  	return nil
   162  }
   163  
   164  func (s *_ABitOfEverythingServer) Update(ctx context.Context, msg *examples.ABitOfEverything) (*empty.Empty, error) {
   165  	s.m.Lock()
   166  	defer s.m.Unlock()
   167  
   168  	glog.Info(msg)
   169  	if _, ok := s.v[msg.Uuid]; ok {
   170  		s.v[msg.Uuid] = msg
   171  	} else {
   172  		return nil, status.Errorf(codes.NotFound, "not found")
   173  	}
   174  	return new(empty.Empty), nil
   175  }
   176  
   177  func (s *_ABitOfEverythingServer) UpdateV2(ctx context.Context, msg *examples.UpdateV2Request) (*empty.Empty, error) {
   178  	glog.Info(msg)
   179  	// If there is no update mask do a regular update
   180  	if msg.UpdateMask == nil || len(msg.UpdateMask.GetPaths()) == 0 {
   181  		return s.Update(ctx, msg.Abe)
   182  	}
   183  
   184  	s.m.Lock()
   185  	defer s.m.Unlock()
   186  	if a, ok := s.v[msg.Abe.Uuid]; ok {
   187  		applyFieldMask(a, msg.Abe, msg.UpdateMask)
   188  	} else {
   189  		return nil, status.Errorf(codes.NotFound, "not found")
   190  	}
   191  	return new(empty.Empty), nil
   192  }
   193  
   194  func (s *_ABitOfEverythingServer) Delete(ctx context.Context, msg *sub2.IdMessage) (*empty.Empty, error) {
   195  	s.m.Lock()
   196  	defer s.m.Unlock()
   197  
   198  	glog.Info(msg)
   199  	if _, ok := s.v[msg.Uuid]; ok {
   200  		delete(s.v, msg.Uuid)
   201  	} else {
   202  		return nil, status.Errorf(codes.NotFound, "not found")
   203  	}
   204  	return new(empty.Empty), nil
   205  }
   206  
   207  func (s *_ABitOfEverythingServer) GetQuery(ctx context.Context, msg *examples.ABitOfEverything) (*empty.Empty, error) {
   208  	s.m.Lock()
   209  	defer s.m.Unlock()
   210  
   211  	glog.Info(msg)
   212  	if _, ok := s.v[msg.Uuid]; ok {
   213  		s.v[msg.Uuid] = msg
   214  	} else {
   215  		return nil, status.Errorf(codes.NotFound, "not found")
   216  	}
   217  	return new(empty.Empty), nil
   218  }
   219  
   220  func (s *_ABitOfEverythingServer) GetRepeatedQuery(ctx context.Context, msg *examples.ABitOfEverythingRepeated) (*examples.ABitOfEverythingRepeated, error) {
   221  	s.m.Lock()
   222  	defer s.m.Unlock()
   223  
   224  	glog.Info(msg)
   225  	return msg, nil
   226  }
   227  
   228  func (s *_ABitOfEverythingServer) Echo(ctx context.Context, msg *sub.StringMessage) (*sub.StringMessage, error) {
   229  	s.m.Lock()
   230  	defer s.m.Unlock()
   231  
   232  	glog.Info(msg)
   233  	return msg, nil
   234  }
   235  
   236  func (s *_ABitOfEverythingServer) BulkEcho(stream examples.StreamService_BulkEchoServer) error {
   237  	var msgs []*sub.StringMessage
   238  	for {
   239  		msg, err := stream.Recv()
   240  		if err == io.EOF {
   241  			break
   242  		}
   243  		if err != nil {
   244  			return err
   245  		}
   246  		msgs = append(msgs, msg)
   247  	}
   248  
   249  	hmd := metadata.New(map[string]string{
   250  		"foo": "foo1",
   251  		"bar": "bar1",
   252  	})
   253  	if err := stream.SendHeader(hmd); err != nil {
   254  		return err
   255  	}
   256  
   257  	for _, msg := range msgs {
   258  		glog.Info(msg)
   259  		if err := stream.Send(msg); err != nil {
   260  			return err
   261  		}
   262  	}
   263  
   264  	stream.SetTrailer(metadata.New(map[string]string{
   265  		"foo": "foo2",
   266  		"bar": "bar2",
   267  	}))
   268  	return nil
   269  }
   270  
   271  func (s *_ABitOfEverythingServer) DeepPathEcho(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   272  	s.m.Lock()
   273  	defer s.m.Unlock()
   274  
   275  	glog.Info(msg)
   276  	return msg, nil
   277  }
   278  
   279  func (s *_ABitOfEverythingServer) NoBindings(ctx context.Context, msg *duration.Duration) (*empty.Empty, error) {
   280  	return nil, nil
   281  }
   282  
   283  func (s *_ABitOfEverythingServer) Timeout(ctx context.Context, msg *empty.Empty) (*empty.Empty, error) {
   284  	select {
   285  	case <-ctx.Done():
   286  		return nil, ctx.Err()
   287  	}
   288  }
   289  
   290  func (s *_ABitOfEverythingServer) ErrorWithDetails(ctx context.Context, msg *empty.Empty) (*empty.Empty, error) {
   291  	stat, err := status.New(codes.Unknown, "with details").
   292  		WithDetails(proto.Message(
   293  			&errdetails.DebugInfo{
   294  				StackEntries: []string{"foo:1"},
   295  				Detail:       "error debug details",
   296  			},
   297  		))
   298  	if err != nil {
   299  		return nil, status.Errorf(codes.Internal, "unexpected error adding details: %s", err)
   300  	}
   301  	return nil, stat.Err()
   302  }
   303  
   304  func (s *_ABitOfEverythingServer) GetMessageWithBody(ctx context.Context, msg *examples.MessageWithBody) (*empty.Empty, error) {
   305  	return &empty.Empty{}, nil
   306  }
   307  
   308  func (s *_ABitOfEverythingServer) PostWithEmptyBody(ctx context.Context, msg *examples.Body) (*empty.Empty, error) {
   309  	return &empty.Empty{}, nil
   310  }
   311  
   312  func (s *_ABitOfEverythingServer) CheckGetQueryParams(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   313  	return msg, nil
   314  }
   315  
   316  func (s *_ABitOfEverythingServer) CheckNestedEnumGetQueryParams(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   317  	return msg, nil
   318  }
   319  
   320  func (s *_ABitOfEverythingServer) CheckPostQueryParams(ctx context.Context, msg *examples.ABitOfEverything) (*examples.ABitOfEverything, error) {
   321  	return msg, nil
   322  }
   323  
   324  func (s *_ABitOfEverythingServer) OverwriteResponseContentType(ctx context.Context, msg *empty.Empty) (*wrappers.StringValue, error) {
   325  	return &wrappers.StringValue{}, nil
   326  }
   327  
   328  func (s *_ABitOfEverythingServer) CheckExternalPathEnum(ctx context.Context, msg *pathenum.MessageWithPathEnum) (*empty.Empty, error) {
   329  	return &empty.Empty{}, nil
   330  }
   331  
   332  func (s *_ABitOfEverythingServer) CheckExternalNestedPathEnum(ctx context.Context, msg *pathenum.MessageWithNestedPathEnum) (*empty.Empty, error) {
   333  	return &empty.Empty{}, nil
   334  }
   335  

View as plain text