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
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
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