github.com/grpc-ecosystem/grpc-gateway/v2@v2.19.1/examples/internal/server/a_bit_of_everything.go (about) 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 }