Non-discoverable resources cause bad JSON (trailing comma). By putting the comma...
authorErich Keane <erich.keane@intel.com>
Mon, 22 Sep 2014 18:16:33 +0000 (11:16 -0700)
committerErich Keane <erich.keane@intel.com>
Mon, 22 Sep 2014 18:16:33 +0000 (11:16 -0700)
Change-Id: Ie270c22e0f61c657f15ecf45fcbdb96de72d495f

csdk/stack/src/ocresource.c

index f9dbcdc..9c88e6e 100644 (file)
@@ -349,19 +349,31 @@ HandleVirtualResource (OCRequest *request, OCResource* resource)
                 if((resource->resourceProperties & OC_ACTIVE)
                         && (resource->resourceProperties & OC_DISCOVERABLE))
                 {
+                    // if there is data on the buffer, we have already added a response,
+                    // so we need to add a comma before we do anything
+                    if(buffer != request->entityHandlerRequest->resJSONPayload
+                        && remaining >= (sizeof(OC_JSON_SEPARATOR)+1))
+                    {
+                        *buffer = OC_JSON_SEPARATOR;
+                        buffer++;
+                        remaining--;
+                    }
+
                     result = BuildVirtualResourceResponse(resource, filterOn, filterValue,
                             (char*)buffer, &remaining);
                     if (result != OC_STACK_OK)
                     {
+                        // if this failed, we need to remove the comma added above.
+                        if(buffer != request->entityHandlerRequest->resJSONPayload)
+                        {
+                            buffer--;
+                            *buffer = '\0';
+                            remaining++;
+                        }
+
                         break;
                     }
                     buffer += strlen((char*)buffer);
-                    if ( resource->next && remaining >= (sizeof(OC_JSON_SEPARATOR) + 1) )
-                    {
-                        *buffer = OC_JSON_SEPARATOR;
-                        buffer++;
-                        remaining--;
-                    }
                 }
                 resource = resource->next;
             }