#include "cacommon.h"
#include "cainterface.h"
-#include "utlist.h"
-#include "pdu.h"
+#include <coap/utlist.h>
+#include <coap/pdu.h>
// Module Name
#define VERIFY_NON_NULL(arg) { if (!arg) {OIC_LOG(FATAL, TAG, #arg " is NULL"); goto exit;} }
{
if(serverRequest)
{
+ OIC_LOG_V(WARNING, TAG, "Server request ID = [%u]", serverRequest->requestId);
LL_DELETE(serverRequestList, serverRequest);
OICFree(serverRequest->requestToken);
+ OICFree(serverRequest->rcvdVendorSpecificHeaderOptions);
OICFree(serverRequest);
serverRequest = NULL;
OIC_LOG(INFO, TAG, "Server Request Removed!!");
OIC_LOG(INFO, TAG,"Get server request with token");
OIC_LOG_BUFFER(INFO, TAG, (const uint8_t *)token, tokenLength);
- OIC_LOG(INFO, TAG,"Found token");
+ OIC_LOG(INFO, TAG, "Found token");
LL_FOREACH (serverRequestList, out)
{
- OIC_LOG_BUFFER(INFO, TAG, (const uint8_t *)out->requestToken, tokenLength);
- if(memcmp(out->requestToken, token, tokenLength) == 0)
+ if(out)
{
- return out;
+ OIC_LOG_BUFFER(INFO, TAG, (const uint8_t *)out->requestToken, out->tokenLength);
+ if((tokenLength == out->tokenLength) &&
+ memcmp(out->requestToken, token, tokenLength) == 0)
+ {
+ return out;
+ }
}
}
- OIC_LOG(ERROR, TAG, "Server Request not found!!");
+ OIC_LOG(INFO, TAG, "Server Request not found!!");
return NULL;
}
* @return
* OCServerRequest*
*/
-OCServerRequest * GetServerRequestUsingHandle (const OCServerRequest * handle)
+OCServerRequest * GetServerRequestUsingHandle (const OCRequestHandle handle)
{
OCServerRequest * out = NULL;
LL_FOREACH (serverRequestList, out)
{
- if(out == handle)
+ if(out->requestId == handle)
{
return out;
}
* @return
* OCServerResponse*
*/
-OCServerResponse * GetServerResponseUsingHandle (const OCServerRequest * handle)
+OCServerResponse * GetServerResponseUsingHandle (const OCRequestHandle handle)
{
OCServerResponse * out = NULL;
LL_FOREACH (serverResponseList, out)
return out;
}
}
- OIC_LOG(ERROR, TAG, "Server Response not found!!");
+ OIC_LOG(INFO, TAG, "Server Response not found!!");
return NULL;
}
serverRequest->acceptFormat = acceptFormat;
serverRequest->ehResponseHandler = HandleSingleResponse;
serverRequest->numResponses = 1;
+ serverRequest->requestId = OCGetRandom();
+
+ // checking same id exist
+ while(serverRequest->requestId == 0 || GetServerRequestUsingHandle(serverRequest->requestId) != NULL)
+ {
+ serverRequest->requestId = OCGetRandom();
+ }
if(query)
{
if(rcvdVendorSpecificHeaderOptions)
{
+ serverRequest->rcvdVendorSpecificHeaderOptions =
+ (OCHeaderOption *) OICCalloc(numRcvdVendorSpecificHeaderOptions, sizeof(OCHeaderOption));
+ VERIFY_NON_NULL(serverRequest->rcvdVendorSpecificHeaderOptions);
+
memcpy(serverRequest->rcvdVendorSpecificHeaderOptions, rcvdVendorSpecificHeaderOptions,
- MAX_HEADER_OPTIONS * sizeof(OCHeaderOption));
+ numRcvdVendorSpecificHeaderOptions * sizeof(OCHeaderOption));
}
if(payload && reqTotalSize)
{
- // destination is at least 1 greater than the source, so a NULL always exists in the
+ // destination is at least 1 greater than the source, so a NULL always exists in the
// last character
memcpy(serverRequest->payload, payload, reqTotalSize);
serverRequest->payloadSize = reqTotalSize;
serverRequest->requestComplete = 0;
if(requestToken)
{
- // If tokenLength is zero, the return value depends on the
- // particular library implementation (it may or may not be a null pointer).
+ // If tokenLength is zero, the return value depends on the
+ // particular library implementation (it may or may not be a null pointer).
if (tokenLength)
{
serverRequest->requestToken = (CAToken_t) OICMalloc(tokenLength);
VERIFY_NON_NULL(serverRequest->requestToken);
memcpy(serverRequest->requestToken, requestToken, tokenLength);
}
-
}
serverRequest->tokenLength = tokenLength;
exit:
if (serverRequest)
{
+ OICFree(serverRequest->requestToken);
+ OICFree(serverRequest->rcvdVendorSpecificHeaderOptions);
OICFree(serverRequest);
serverRequest = NULL;
}
case OC_EH_NOT_ACCEPTABLE: // 4.06
caResult = CA_NOT_ACCEPTABLE;
break;
+ case OC_EH_TOO_MANY_REQUESTS: // 4.29
+ caResult = CA_TOO_MANY_REQUESTS;
+ break;
case OC_EH_INTERNAL_SERVER_ERROR: // 5.00
caResult = CA_INTERNAL_SERVER_ERROR;
break;
+ case OC_EH_NOT_IMPLEMENTED: // 5.01
+ caResult = CA_NOT_IMPLEMENTED;
+ break;
+ case OC_EH_BAD_GATEWAY: // 5.02
+ caResult = CA_BAD_GATEWAY;
+ break;
+ case OC_EH_SERVICE_UNAVAILABLE: // 5.03
+ caResult = CA_SERVICE_UNAVAILABLE;
+ break;
case OC_EH_RETRANSMIT_TIMEOUT: // 5.04
caResult = CA_RETRANSMIT_TIMEOUT;
break;
+ case OC_EH_PROXY_NOT_SUPPORTED: // 5.05
+ caResult = CA_PROXY_NOT_SUPPORTED;
+ break;
default:
caResult = CA_BAD_REQ;
break;
return OC_STACK_ERROR;
}
- OCServerRequest *serverRequest = (OCServerRequest *)ehResponse->requestHandle;
+ OCServerRequest *serverRequest = GetServerRequestUsingHandle(ehResponse->requestHandle);
+ if (NULL == serverRequest)
+ {
+ OIC_LOG(ERROR, TAG, "No serverRequest matching with ehResponse");
+ return OC_STACK_ERROR;
+ }
CopyDevAddrToEndpoint(&serverRequest->devAddr, &responseEndpoint);
// Put the JSON prefix and suffix around the payload
if(ehResponse->payload)
{
+#ifdef WITH_PRESENCE
if (ehResponse->payload->type == PAYLOAD_TYPE_PRESENCE)
{
responseInfo.isMulticast = true;
}
else
+#endif
{
responseInfo.isMulticast = false;
}
OICFree(responseInfo.info.options);
return result;
}
- //Add CONTENT_FORMAT OPT if payload exist
+ // Add CONTENT_FORMAT OPT if payload exist
if (responseInfo.info.payloadSize > 0)
{
responseInfo.info.payloadFormat = CA_FORMAT_APPLICATION_CBOR;
OIC_LOG(INFO, TAG, "Calling OCSendResponse with:");
OIC_LOG_V(INFO, TAG, "\tEndpoint address: %s", responseEndpoint.addr);
- OIC_LOG_V(INFO, TAG, "\tEndpoint adapter: %s", responseEndpoint.adapter);
- OIC_LOG_V(INFO, TAG, "\tResponse result : %s", responseInfo.result);
+ OIC_LOG_V(INFO, TAG, "\tEndpoint adapter: %d", responseEndpoint.adapter);
+ OIC_LOG_V(INFO, TAG, "\tResponse result : %d", responseInfo.result);
OIC_LOG_V(INFO, TAG, "\tResponse for uri: %s", responseInfo.info.resourceUri);
result = OCSendResponse(&responseEndpoint, &responseInfo);
OIC_LOG(INFO, TAG, "Inside HandleAggregateResponse");
- OCServerRequest *serverRequest = GetServerRequestUsingHandle((OCServerRequest *)
- ehResponse->requestHandle);
- OCServerResponse *serverResponse = GetServerResponseUsingHandle((OCServerRequest *)
- ehResponse->requestHandle);
+ OCServerRequest *serverRequest = GetServerRequestUsingHandle(ehResponse->requestHandle);
+ OCServerResponse *serverResponse = GetServerResponseUsingHandle(ehResponse->requestHandle);
OCStackResult stackRet = OC_STACK_ERROR;
if(serverRequest)
goto exit;
}
- OCRepPayload *newPayload = OCRepPayloadClone((OCRepPayload *)ehResponse->payload);
+ OCRepPayload *newPayload = OCRepPayloadBatchClone((OCRepPayload *)ehResponse->payload);
if(!serverResponse->payload)
{
{
OIC_LOG(INFO, TAG, "This is the last response fragment");
ehResponse->payload = serverResponse->payload;
+ ehResponse->ehResult = OC_EH_OK;
stackRet = HandleSingleResponse(ehResponse);
//Delete the request and response
FindAndDeleteServerRequest(serverRequest);
}
}
exit:
+
return stackRet;
}