#include "oic_string.h"
#include "ocpayload.h"
#include "ocpayloadcbor.h"
+#include "logger.h"
+
+#if defined (ROUTING_GATEWAY) || defined (ROUTING_EP)
+#include "routingutility.h"
+#endif
#include "cacommon.h"
#include "cainterface.h"
*/
static OCStackResult AddServerResponse (OCServerResponse ** response, OCRequestHandle requestHandle)
{
+ if (!response)
+ {
+ return OC_STACK_INVALID_PARAM;
+ }
+
OCServerResponse * serverResponse = NULL;
serverResponse = (OCServerResponse *) OICCalloc(1, sizeof(OCServerResponse));
}
/**
- * Ensure no accept header option is included when sending responses
+ * Ensure no accept header option is included when sending responses and add routing info to
+ * outgoing response.
*
* @param object CA remote endpoint.
* @param requestInfo CA request info.
*/
static OCStackResult OCSendResponse(const CAEndpoint_t *object, CAResponseInfo_t *responseInfo)
{
+#if defined (ROUTING_GATEWAY) || defined (ROUTING_EP)
+ // Add route info in RM option.
+ OCStackResult rmResult = RMAddInfo(object->routeData, &(responseInfo->info.options),
+ &(responseInfo->info.numOptions));
+ if(OC_STACK_OK != rmResult)
+ {
+ OC_LOG(ERROR, TAG, "Add option failed");
+ return rmResult;
+ }
+#endif
+
// Do not include the accept header option
responseInfo->info.acceptFormat = CA_FORMAT_UNDEFINED;
CAResult_t result = CASendResponse(object, responseInfo);
char * resourceUrl, size_t reqTotalSize, OCPayloadFormat acceptFormat,
const OCDevAddr *devAddr)
{
+ if (!request)
+ {
+ return OC_STACK_INVALID_PARAM;
+ }
+
OCServerRequest * serverRequest = NULL;
+ OC_LOG_V(INFO, TAG, "addserverrequest entry!! [%s:%u]", devAddr->addr, devAddr->port);
+
serverRequest = (OCServerRequest *) OICCalloc(1, sizeof(OCServerRequest) +
(reqTotalSize ? reqTotalSize : 1) - 1);
VERIFY_NON_NULL(devAddr);
OCDevAddr *endpoint,
OCResourceHandle resource,
char * queryBuf,
+ OCPayloadType payloadType,
uint8_t * payload,
size_t payloadSize,
uint8_t numVendorOptions,
if(payload && payloadSize)
{
- if(OCParsePayload(&entityHandlerRequest->payload, payload, payloadSize) != OC_STACK_OK)
+ if(OCParsePayload(&entityHandlerRequest->payload, payloadType,
+ payload, payloadSize) != OC_STACK_OK)
{
return OC_STACK_ERROR;
}
}
}
-CAResponseResult_t ConvertEHResultToCAResult (OCEntityHandlerResult result)
+CAResponseResult_t ConvertEHResultToCAResult (OCEntityHandlerResult result, OCMethod method)
{
- CAResponseResult_t caResult = CA_BAD_REQ;
+ CAResponseResult_t caResult;
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;
caResult = CA_DELETED;
break;
case OC_EH_SLOW:
- caResult = CA_SUCCESS;
+ caResult = CA_CONTENT;
break;
case OC_EH_FORBIDDEN:
caResult = CA_UNAUTHORIZED_REQ;
* @return
* OCStackResult
*/
-
OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse)
{
OCStackResult result = OC_STACK_ERROR;
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)
{
{
responseInfo.info.type = CA_MSG_NONCONFIRM;
}
+ else
+ {
+ OC_LOG(ERROR, TAG, "default responseInfo type is NON");
+ responseInfo.info.type = CA_MSG_NONCONFIRM;
+ }
char rspToken[CA_MAX_TOKEN_LEN + 1] = {};
responseInfo.info.messageId = serverRequest->coapID;
responseInfo.info.options[0].optionLength = sizeof(uint32_t);
uint8_t* observationData = (uint8_t*)responseInfo.info.options[0].optionData;
uint32_t observationOption= serverRequest->observationOption;
- size_t i;
- for (i=sizeof(uint32_t); i; --i)
+
+ for (size_t i=sizeof(uint32_t); i; --i)
{
observationData[i-1] = observationOption & 0xFF;
observationOption >>=8;
#endif
};
- int size = sizeof(CAConnTypes)/ sizeof(CATransportAdapter_t);
+ size_t size = sizeof(CAConnTypes)/ sizeof(CATransportAdapter_t);
CATransportAdapter_t adapter = responseEndpoint.adapter;
// Default adapter, try to send response out on all adapters.
result = OC_STACK_OK;
OCStackResult tempResult = OC_STACK_OK;
- for(int i = 0; i < size; i++ )
+ for(size_t i = 0; i < size; i++ )
{
responseEndpoint.adapter = (CATransportAdapter_t)(adapter & CAConnTypes[i]);
if(responseEndpoint.adapter)
*/
OCStackResult HandleAggregateResponse(OCEntityHandlerResponse * ehResponse)
{
- OCStackResult stackRet = OC_STACK_ERROR;
- OCServerRequest * serverRequest = NULL;
- OCServerResponse * serverResponse = NULL;
-
if(!ehResponse || !ehResponse->payload)
{
OC_LOG(ERROR, TAG, "HandleAggregateResponse invalid parameters");
OC_LOG(INFO, TAG, "Inside HandleAggregateResponse");
- serverRequest = GetServerRequestUsingHandle((OCServerRequest *)ehResponse->requestHandle);
- serverResponse = GetServerResponseUsingHandle((OCServerRequest *)ehResponse->requestHandle);
+ OCServerRequest *serverRequest = GetServerRequestUsingHandle((OCServerRequest *)
+ ehResponse->requestHandle);
+ OCServerResponse *serverResponse = GetServerResponseUsingHandle((OCServerRequest *)
+ ehResponse->requestHandle);
+ OCStackResult stackRet = OC_STACK_ERROR;
if(serverRequest)
{
if(!serverResponse)