From 1f1ea9daf7f8e874ce24bdf17c17694da4f27325 Mon Sep 17 00:00:00 2001 From: Stephane Lejeune Date: Fri, 4 Sep 2015 22:06:45 +0200 Subject: [PATCH] Update the stack to use the new CoAP return code 2.04/2.05 values. 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 Reviewed-on: https://gerrit.iotivity.org/gerrit/2396 Tested-by: jenkins-iotivity Reviewed-by: Hauke Mehrtens Reviewed-by: Patrick Lankswert --- .../csdk/connectivity/common/src/caremotehandler.c | 2 +- resource/csdk/stack/src/ocserverrequest.c | 26 ++++++++++++--- resource/csdk/stack/src/ocstack.c | 37 +++++++++++++++++----- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/resource/csdk/connectivity/common/src/caremotehandler.c b/resource/csdk/connectivity/common/src/caremotehandler.c index 8c159d4..df7d7f7 100644 --- a/resource/csdk/connectivity/common/src/caremotehandler.c +++ b/resource/csdk/connectivity/common/src/caremotehandler.c @@ -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; diff --git a/resource/csdk/stack/src/ocserverrequest.c b/resource/csdk/stack/src/ocserverrequest.c index 82c3d05..d8e9877 100644 --- a/resource/csdk/stack/src/ocserverrequest.c +++ b/resource/csdk/stack/src/ocserverrequest.c @@ -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) { diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index ae762af..6e04736 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -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, -- 2.7.4