Update the stack to use the new CoAP return code 2.04/2.05 values.
authorStephane Lejeune <stlejeun@cisco.com>
Fri, 4 Sep 2015 20:06:45 +0000 (22:06 +0200)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Tue, 15 Sep 2015 17:39:56 +0000 (17:39 +0000)
Since draft-ietf-core-observe-02 (September 16, 2011),
the result value "2.00" was depricated and replaced with "2.05"
for GET a method and "2.04" for POST and PUT methods.

Change-Id: I8061089469609d5ad801fa0456fda326cbc1fc33
Signed-off-by: Stephane Lejeune <stlejeun@cisco.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2396
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
resource/csdk/connectivity/common/src/caremotehandler.c
resource/csdk/stack/src/ocserverrequest.c
resource/csdk/stack/src/ocstack.c

index 8c159d4..df7d7f7 100644 (file)
@@ -90,7 +90,6 @@ CAResponseInfo_t *CACloneResponseInfo(const CAResponseInfo_t *rep)
     switch (rep->result)
     {
         case CA_EMPTY:
-        case CA_SUCCESS:
         case CA_CREATED:
         case CA_DELETED:
         case CA_VALID:
@@ -109,6 +108,7 @@ CAResponseInfo_t *CACloneResponseInfo(const CAResponseInfo_t *rep)
         case CA_RETRANSMIT_TIMEOUT:
             break;
 
+        case CA_SUCCESS:
         default:
             OIC_LOG_V(ERROR, TAG, "Response code  %u is invalid", rep->result);
             return NULL;
index 82c3d05..d8e9877 100644 (file)
@@ -387,14 +387,32 @@ void FindAndDeleteServerRequest(OCServerRequest * serverRequest)
     }
 }
 
-CAResponseResult_t ConvertEHResultToCAResult (OCEntityHandlerResult result)
+CAResponseResult_t ConvertEHResultToCAResult (OCEntityHandlerResult result, OCMethod method)
 {
     CAResponseResult_t caResult = CA_BAD_REQ;
 
     switch (result)
     {
         case OC_EH_OK:
-            caResult = CA_SUCCESS;
+           switch (method)
+           {
+               case OC_REST_PUT: 
+               case OC_REST_POST:
+                   // This Response Code is like HTTP 204 "No Content" but only used in
+                   // response to POST and PUT requests.
+                   caResult = CA_CHANGED;
+                   break;
+               case OC_REST_GET:
+                   // This Response Code is like HTTP 200 "OK" but only used in response to
+                   // GET requests.
+                   caResult = CA_CONTENT;
+                   break;
+               default:
+                   // This should not happen but,
+                   // give it a value just in case but output an error
+                   caResult = CA_CONTENT;
+                   OC_LOG_V(ERROR, TAG, "Unexpected OC_EH_OK return code for method [d].", method);
+           }
             break;
         case OC_EH_ERROR:
             caResult = CA_BAD_REQ;
@@ -406,7 +424,7 @@ CAResponseResult_t ConvertEHResultToCAResult (OCEntityHandlerResult result)
             caResult = CA_DELETED;
             break;
         case OC_EH_SLOW:
-            caResult = CA_SUCCESS;
+            caResult = CA_CONTENT;
             break;
         case OC_EH_FORBIDDEN:
             caResult = CA_UNAUTHORIZED_REQ;
@@ -448,7 +466,7 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse)
     CopyDevAddrToEndpoint(&serverRequest->devAddr, &responseEndpoint);
 
     responseInfo.info.resourceUri = serverRequest->resourceUrl;
-    responseInfo.result = ConvertEHResultToCAResult(ehResponse->ehResult);
+    responseInfo.result = ConvertEHResultToCAResult(ehResponse->ehResult, serverRequest->method);
 
     if(serverRequest->notificationFlag && serverRequest->qos == OC_HIGH_QOS)
     {
index ae762af..6e04736 100644 (file)
@@ -293,9 +293,10 @@ static OCStackResult CAToOCStackResult(CAResponseResult_t caCode);
  * Convert OCStackResult to CAResponseResult_t.
  *
  * @param caCode OCStackResult code.
+ * @param method OCMethod method the return code replies to.
  * @return ::CA_SUCCESS on success, some other value upon failure.
  */
-static CAResponseResult_t OCToCAStackResult(OCStackResult ocCode);
+static CAResponseResult_t OCToCAStackResult(OCStackResult ocCode, OCMethod method);
 
 /**
  * Convert OCTransportFlags_t to CATransportModifiers_t.
@@ -567,15 +568,16 @@ OCStackResult CAToOCStackResult(CAResponseResult_t caCode)
 
     switch(caCode)
     {
-        case CA_SUCCESS:
-            ret = OC_STACK_OK;
-            break;
         case CA_CREATED:
             ret = OC_STACK_RESOURCE_CREATED;
             break;
         case CA_DELETED:
             ret = OC_STACK_RESOURCE_DELETED;
             break;
+        case CA_CHANGED:
+        case CA_CONTENT:
+            ret = OC_STACK_OK;
+            break;
         case CA_BAD_REQ:
             ret = OC_STACK_INVALID_QUERY;
             break;
@@ -597,14 +599,32 @@ OCStackResult CAToOCStackResult(CAResponseResult_t caCode)
     return ret;
 }
 
-CAResponseResult_t OCToCAStackResult(OCStackResult ocCode)
+CAResponseResult_t OCToCAStackResult(OCStackResult ocCode, OCMethod method)
 {
     CAResponseResult_t ret = CA_INTERNAL_SERVER_ERROR;
 
     switch(ocCode)
     {
         case OC_STACK_OK:
-            ret = CA_SUCCESS;
+           switch (method)
+           {
+               case OC_REST_PUT: 
+               case OC_REST_POST:
+                   // This Response Code is like HTTP 204 "No Content" but only used in
+                   // response to POST and PUT requests.
+                   ret = CA_CHANGED;
+                   break;
+               case OC_REST_GET:
+                   // This Response Code is like HTTP 200 "OK" but only used in response to
+                   // GET requests.
+                   ret = CA_CONTENT;
+                   break;
+               default:
+                   // This should not happen but,
+                   // give it a value just in case but output an error
+                   ret = CA_CONTENT;
+                   OC_LOG_V(ERROR, TAG, "Unexpected OC_STACK_OK return code for method [d].", method);
+            }
             break;
         case OC_STACK_RESOURCE_CREATED:
             ret = CA_CREATED;
@@ -808,7 +828,7 @@ OCStackResult HandlePresenceResponse(const CAEndpoint_t *endpoint,
     int presenceSubscribe = 0;
     int multicastPresenceSubscribe = 0;
 
-    if (responseInfo->result != CA_SUCCESS)
+    if (responseInfo->result != CA_CONTENT)
     {
         OC_LOG_V(ERROR, TAG, "HandlePresenceResponse failed %d", responseInfo->result);
         return OC_STACK_ERROR;
@@ -1466,7 +1486,8 @@ void HandleCARequests(const CAEndpoint_t* endPoint, const CARequestInfo_t* reque
     {
         OC_LOG_V(ERROR, TAG, "HandleStackRequests failed. error: %d", requestResult);
 
-        CAResponseResult_t stackResponse = OCToCAStackResult(requestResult);
+        CAResponseResult_t stackResponse =
+            OCToCAStackResult(requestResult, serverRequest.method);
 
         SendDirectStackResponse(endPoint, requestInfo->info.messageId, stackResponse,
                 requestInfo->info.type, requestInfo->info.numOptions,