Removed the OCPayloadType from the payload
authorErich Keane <erich.keane@intel.com>
Thu, 10 Sep 2015 21:51:32 +0000 (14:51 -0700)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Wed, 16 Sep 2015 19:34:14 +0000 (19:34 +0000)
Previously, the CBOR container included the type of the message to make
parsing of the CBOR items easier.  This is unfortunately against the
spec, so this patch removes it and requires the caller to ensure that
the expected message type is sent.  Incorrectly formatted messages will
result in the message not passed back via the callback.

Change-Id: If1ca9eed65b5274239b670e8a2bd6cadce763c19
Signed-off-by: Erich Keane <erich.keane@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2482
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
resource/csdk/stack/include/internal/ocpayloadcbor.h
resource/csdk/stack/src/ocpayloadconvert.c
resource/csdk/stack/src/ocpayloadparse.c
resource/csdk/stack/src/ocserverrequest.c
resource/csdk/stack/src/ocstack.c

index 5d3c16eab58095d213f121dd149bdad9dbd791d5..3e39742a567f1c1df5b3e1a25c36101a8c0c4838 100644 (file)
@@ -23,7 +23,8 @@
 
 #include "octypes.h"
 
-OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, size_t payloadSize);
+OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType type,
+        const uint8_t* payload, size_t payloadSize);
 
 OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* size);
 #endif
index 5584a0bf5e0d4f3811002df067385b935618cba2..603a7f61168f74fabe4b1a6ddaf61432f47fe7b3 100644 (file)
@@ -176,9 +176,7 @@ static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* out
     cbor_encoder_init(&encoder, outPayload, *size, 0);
 
     CborEncoder rootArray;
-    err = err | cbor_encoder_create_array(&encoder, &rootArray, 2);
-    err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_SECURITY);
-
+    err = err | cbor_encoder_create_array(&encoder, &rootArray, 1);
     CborEncoder map;
 
     err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength);
@@ -207,8 +205,7 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* o
     cbor_encoder_init(&encoder, outPayload, *size, 0);
 
     CborEncoder rootArray;
-    err = err | cbor_encoder_create_array(&encoder, &rootArray, 1 + resourceCount);
-    err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_DISCOVERY);
+    err = err | cbor_encoder_create_array(&encoder, &rootArray, resourceCount);
 
     for(size_t i = 0; i < resourceCount; ++i)
     {
@@ -320,8 +317,7 @@ static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayl
 
     cbor_encoder_init(&encoder, outPayload, *size, 0);
     CborEncoder rootArray;
-    err = err | cbor_encoder_create_array(&encoder, &rootArray, 2);
-    err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_DEVICE);
+    err = err | cbor_encoder_create_array(&encoder, &rootArray, 1);
 
     {
         CborEncoder map;
@@ -379,8 +375,7 @@ static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* out
 
     cbor_encoder_init(&encoder, outPayload, *size, 0);
     CborEncoder rootArray;
-    err = err | cbor_encoder_create_array(&encoder, &rootArray, 2);
-    err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_PLATFORM);
+    err = err | cbor_encoder_create_array(&encoder, &rootArray, 1);
     {
         CborEncoder map;
         err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength);
@@ -678,7 +673,6 @@ static int64_t OCConvertRepPayload(OCRepPayload* payload, uint8_t* outPayload, s
     cbor_encoder_init(&encoder, outPayload, *size, 0);
     CborEncoder rootArray;
     err = err | cbor_encoder_create_array(&encoder, &rootArray, CborIndefiniteLength);
-    err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_REPRESENTATION);
 
     while(payload != NULL && (err == 0 || err == CborErrorOutOfMemory))
     {
@@ -701,9 +695,7 @@ static int64_t OCConvertPresencePayload(OCPresencePayload* payload,
     cbor_encoder_init(&encoder, outPayload, *size, 0);
     CborEncoder rootArray;
 
-    err = err | cbor_encoder_create_array(&encoder, &rootArray, 2);
-    err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_PRESENCE);
-
+    err = err | cbor_encoder_create_array(&encoder, &rootArray, 1);
 
     CborEncoder map;
     err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength);
index d7ed58adfc4b404aec578c6a68a77f9938ee731a..81dede5c07ecd251fabdff34134d95a2643e9f92 100644 (file)
@@ -36,7 +36,8 @@ static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* arrayV
 static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* arrayVal);
 static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* arrayVal);
 
-OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, size_t payloadSize)
+OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType payloadType,
+        const uint8_t* payload, size_t payloadSize)
 {
     CborParser parser;
     CborValue rootValue;
@@ -59,11 +60,7 @@ OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, siz
     // enter the array
     err = err || cbor_value_enter_container(&rootValue, &arrayValue);
 
-    int payloadType = 0;
-    err = err || cbor_value_get_int(&arrayValue, &payloadType);
-    err = err || cbor_value_advance_fixed(&arrayValue);
-
-    if(err)
+    if(err || arrayValue.type != CborMapType)
     {
         OC_LOG_V(ERROR, TAG, "CBOR payload parse failed :%d", err);
         return OC_STACK_MALFORMED_RESPONSE;
index d8e9877f68f2d62b06daba4af9f6662f0f5775e5..4122a3366b00b5f7e5147cd6471dd0c5b4230fb9 100644 (file)
@@ -347,7 +347,8 @@ OCStackResult FormOCEntityHandlerRequest(
 
         if(payload && payloadSize)
         {
-            if(OCParsePayload(&entityHandlerRequest->payload, payload, payloadSize) != OC_STACK_OK)
+            if(OCParsePayload(&entityHandlerRequest->payload, PAYLOAD_TYPE_REPRESENTATION,
+                        payload, payloadSize) != OC_STACK_OK)
             {
                 return OC_STACK_ERROR;
             }
index 6e0473602ed89273da39f28a0b077087bf103c82..3e1d40478e2694543ee309b2e66ad05dc58393e4 100644 (file)
@@ -875,7 +875,9 @@ OCStackResult HandlePresenceResponse(const CAEndpoint_t *endpoint,
 
     if (responseInfo->info.payload)
     {
-        result = OCParsePayload(&response.payload,  responseInfo->info.payload,
+        result = OCParsePayload(&response.payload,
+                PAYLOAD_TYPE_PRESENCE,
+                responseInfo->info.payload,
                 responseInfo->info.payloadSize);
 
         if(result != OC_STACK_OK)
@@ -1088,14 +1090,60 @@ void HandleCAResponses(const CAEndpoint_t* endPoint, const CAResponseInfo_t* res
             response.identity.id_length = responseInfo->info.identity.id_length;
 
             response.result = CAToOCStackResult(responseInfo->result);
+
             if(responseInfo->info.payload &&
-               responseInfo->info.payloadSize &&
-               OC_STACK_OK != OCParsePayload(&response.payload, responseInfo->info.payload,
-                                           responseInfo->info.payloadSize))
+               responseInfo->info.payloadSize)
             {
-                OC_LOG(ERROR, TAG, "Error converting payload");
-                OCPayloadDestroy(response.payload);
-                return;
+                OCPayloadType type = PAYLOAD_TYPE_INVALID;
+                if (cbNode->method == OC_REST_DISCOVER)
+                {
+                    if (strncmp(OC_RSRVD_WELL_KNOWN_URI,cbNode->requestUri,
+                                sizeof(OC_RSRVD_WELL_KNOWN_URI) - 1) == 0)
+                    {
+                        type = PAYLOAD_TYPE_DISCOVERY;
+                    }
+                    else if (strcmp(cbNode->requestUri, OC_RSRVD_DEVICE_URI) == 0)
+                    {
+                        type = PAYLOAD_TYPE_DEVICE;
+                    }
+                    else if (strcmp(cbNode->requestUri, OC_RSRVD_PLATFORM_URI) == 0)
+                    {
+                        type = PAYLOAD_TYPE_PLATFORM;
+                    }
+                    else
+                    {
+                        OC_LOG_V(ERROR, TAG, "Unknown Payload type in Discovery: %d %s",
+                                cbNode->method, cbNode->requestUri);
+                        return;
+                    }
+                }
+                else if (cbNode->method == OC_REST_GET ||
+                         cbNode->method == OC_REST_PUT ||
+                         cbNode->method == OC_REST_POST ||
+                         cbNode->method == OC_REST_OBSERVE ||
+                         cbNode->method == OC_REST_OBSERVE_ALL ||
+                         cbNode->method == OC_REST_DELETE)
+                {
+                    OC_LOG_V(INFO, TAG, "Assuming PAYLOAD_TYPE_REPRESENTATION: %d %s",
+                            cbNode->method, cbNode->requestUri);
+                    type = PAYLOAD_TYPE_REPRESENTATION;
+                }
+                else
+                {
+                    OC_LOG_V(ERROR, TAG, "Unknown Payload type: %d %s",
+                            cbNode->method, cbNode->requestUri);
+                    return;
+                }
+
+                if(OC_STACK_OK != OCParsePayload(&response.payload,
+                            type,
+                            responseInfo->info.payload,
+                            responseInfo->info.payloadSize))
+                {
+                    OC_LOG(ERROR, TAG, "Error converting payload");
+                    OCPayloadDestroy(response.payload);
+                    return;
+                }
             }
 
             response.numRcvdVendorSpecificHeaderOptions = 0;