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