@@ -21,7 +21,6 @@ import (
2121 "compress/gzip"
2222 "context"
2323 "encoding/json"
24- "fmt"
2524 "io"
2625 "io/ioutil"
2726 "net/http"
@@ -158,6 +157,26 @@ func writeResponse(w http.ResponseWriter, r *http.Request, b []byte) (int, error
158157 return out .Write (b )
159158}
160159
160+ func writeEntry (out * bytes.Buffer , key string , js []byte ) error {
161+ if _ , err := out .WriteRune ('"' ); err != nil {
162+ return err
163+ }
164+ if _ , err := out .WriteString (key ); err != nil {
165+ return err
166+ }
167+ if _ , err := out .WriteRune ('"' ); err != nil {
168+ return err
169+ }
170+ if _ , err := out .WriteRune (':' ); err != nil {
171+ return err
172+ }
173+ if _ , err := out .Write (js ); err != nil {
174+ return err
175+ }
176+
177+ return nil
178+ }
179+
161180// This method should just build the request and proxy it to the Query method of dgraph.Server.
162181// It can then encode the response as appropriate before sending it back to the user.
163182func queryHandler (w http.ResponseWriter , r * http.Request ) {
@@ -254,25 +273,6 @@ func queryHandler(w http.ResponseWriter, r *http.Request) {
254273 }
255274
256275 var out bytes.Buffer
257- writeEntry := func (key string , js []byte ) error {
258- if _ , err := out .WriteRune ('"' ); err != nil {
259- return err
260- }
261- if _ , err := out .WriteString (key ); err != nil {
262- return err
263- }
264- if _ , err := out .WriteRune ('"' ); err != nil {
265- return err
266- }
267- if _ , err := out .WriteRune (':' ); err != nil {
268- return err
269- }
270- if _ , err := out .Write (js ); err != nil {
271- return err
272- }
273- return nil
274- }
275-
276276 e := query.Extensions {
277277 Txn : resp .Txn ,
278278 Latency : resp .Latency ,
@@ -288,15 +288,15 @@ func queryHandler(w http.ResponseWriter, r *http.Request) {
288288 x .SetStatusWithData (w , x .Error , err .Error ())
289289 return
290290 }
291- if err := writeEntry ("data" , resp .Json ); err != nil {
291+ if err := writeEntry (& out , "data" , resp .Json ); err != nil {
292292 x .SetStatusWithData (w , x .Error , err .Error ())
293293 return
294294 }
295295 if _ , err := out .WriteRune (',' ); err != nil {
296296 x .SetStatusWithData (w , x .Error , err .Error ())
297297 return
298298 }
299- if err := writeEntry ("extensions" , js ); err != nil {
299+ if err := writeEntry (& out , "extensions" , js ); err != nil {
300300 x .SetStatusWithData (w , x .Error , err .Error ())
301301 return
302302 }
@@ -409,22 +409,61 @@ func mutationHandler(w http.ResponseWriter, r *http.Request) {
409409 e .Txn .Keys = e .Txn .Keys [:0 ]
410410 }
411411
412- response := map [string ]interface {}{}
413- response ["extensions" ] = e
414- mp := map [string ]interface {}{}
415- mp ["code" ] = x .Success
416- mp ["message" ] = "Done"
417- mp ["uids" ] = resp .Uids
418- if len (resp .Vars ) > 0 {
419- vars := make (map [string ][]string )
420- // Flatten the mutated map so that it is easier to parse for the client.
421- for v , uids := range resp .Vars {
422- vars [fmt .Sprintf ("uid(%s)" , v )] = uids .GetUids ()
412+ var out bytes.Buffer
413+ // If response is either empty or only contains empty braces {}, it's a no-op
414+ if len (resp .Json ) > 2 {
415+ var i int
416+ for i = len (resp .Json ) - 1 ; i >= 0 ; i -- {
417+ if resp .Json [i ] == '}' {
418+ break
419+ }
420+ }
421+
422+ out = * bytes .NewBuffer (resp .Json [:i ])
423+ if _ , err := out .WriteRune (',' ); err != nil {
424+ x .SetStatusWithData (w , x .Error , err .Error ())
425+ return
426+ }
427+ } else {
428+ if _ , err := out .WriteRune ('{' ); err != nil {
429+ x .SetStatusWithData (w , x .Error , err .Error ())
430+ return
423431 }
424- mp ["vars" ] = vars
425432 }
426- response ["data" ] = mp
427433
434+ if err := writeEntry (& out , "code" , []byte ("\" " + x .Success + "\" " )); err != nil {
435+ x .SetStatusWithData (w , x .Error , err .Error ())
436+ return
437+ }
438+ if _ , err := out .WriteRune (',' ); err != nil {
439+ x .SetStatusWithData (w , x .Error , err .Error ())
440+ return
441+ }
442+ if err := writeEntry (& out , "message" , []byte ("\" Done\" " )); err != nil {
443+ x .SetStatusWithData (w , x .Error , err .Error ())
444+ return
445+ }
446+ if _ , err := out .WriteRune (',' ); err != nil {
447+ x .SetStatusWithData (w , x .Error , err .Error ())
448+ return
449+ }
450+ uids , err := json .Marshal (resp .Uids )
451+ if err != nil {
452+ x .SetStatusWithData (w , x .Error , err .Error ())
453+ return
454+ }
455+ if err := writeEntry (& out , "uids" , uids ); err != nil {
456+ x .SetStatusWithData (w , x .Error , err .Error ())
457+ return
458+ }
459+ if _ , err := out .WriteRune ('}' ); err != nil {
460+ x .SetStatusWithData (w , x .Error , err .Error ())
461+ return
462+ }
463+
464+ response := map [string ]interface {}{}
465+ response ["extensions" ] = e
466+ response ["data" ] = json .RawMessage (out .Bytes ())
428467 js , err := json .Marshal (response )
429468 if err != nil {
430469 x .SetStatusWithData (w , x .Error , err .Error ())
0 commit comments