implement the MUST not found response. (#1788)

This commit is contained in:
Buke Po
2017-05-22 21:54:49 -07:00
committed by Jonathan Hui
parent 0c273201ba
commit b3530deb76
2 changed files with 76 additions and 11 deletions
+43 -10
View File
@@ -245,15 +245,36 @@ exit:
return error; return error;
} }
ThreadError Coap::SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) ThreadError Coap::SendHeaderResponse(Header::Code aCode, const Header &aRequestHeader,
const Ip6::MessageInfo &aMessageInfo)
{ {
ThreadError error = kThreadError_None; ThreadError error = kThreadError_None;
Header responseHeader; Header responseHeader;
Header::Type requestType;
Message *message = NULL; Message *message = NULL;
VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, error = kThreadError_InvalidArgs); VerifyOrExit(aRequestHeader.IsRequest(), error = kThreadError_InvalidArgs);
responseHeader.SetDefaultResponseHeader(aRequestHeader); requestType = aRequestHeader.GetType();
switch (requestType)
{
case kCoapTypeConfirmable:
responseHeader.Init(kCoapTypeAcknowledgment, aCode);
responseHeader.SetMessageId(aRequestHeader.GetMessageId());
break;
case kCoapTypeNonConfirmable:
responseHeader.Init(kCoapTypeNonConfirmable, aCode);
responseHeader.SetMessageId(mMessageId++);
break;
default:
ExitNow(error = kThreadError_InvalidArgs);
break;
}
responseHeader.SetToken(aRequestHeader.GetToken(), aRequestHeader.GetTokenLength());
VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs); VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs);
@@ -614,20 +635,20 @@ void Coap::ProcessReceivedRequest(Header &aHeader, Message &aMessage, const Ip6:
char uriPath[Resource::kMaxReceivedUriPath] = ""; char uriPath[Resource::kMaxReceivedUriPath] = "";
char *curUriPath = uriPath; char *curUriPath = uriPath;
const Header::Option *coapOption; const Header::Option *coapOption;
Message *response = NULL; Message *cachedResponse = NULL;
ThreadError error = kThreadError_None; ThreadError error = kThreadError_NotFound;
if (mInterceptor != NULL) if (mInterceptor != NULL)
{ {
SuccessOrExit(mInterceptor(aMessage, aMessageInfo)); SuccessOrExit(error = mInterceptor(aMessage, aMessageInfo));
} }
aMessage.MoveOffset(aHeader.GetLength()); aMessage.MoveOffset(aHeader.GetLength());
switch (mResponsesQueue.GetMatchedResponseCopy(aHeader, aMessageInfo, &response)) switch (mResponsesQueue.GetMatchedResponseCopy(aHeader, aMessageInfo, &cachedResponse))
{ {
case kThreadError_None: case kThreadError_None:
error = Send(*response, aMessageInfo); error = Send(*cachedResponse, aMessageInfo);
// fall through // fall through
; ;
@@ -671,6 +692,7 @@ void Coap::ProcessReceivedRequest(Header &aHeader, Message &aMessage, const Ip6:
if (strcmp(resource->mUriPath, uriPath) == 0) if (strcmp(resource->mUriPath, uriPath) == 0)
{ {
resource->HandleRequest(aHeader, aMessage, aMessageInfo); resource->HandleRequest(aHeader, aMessage, aMessageInfo);
error = kThreadError_None;
ExitNow(); ExitNow();
} }
} }
@@ -678,13 +700,24 @@ void Coap::ProcessReceivedRequest(Header &aHeader, Message &aMessage, const Ip6:
if (mDefaultHandler) if (mDefaultHandler)
{ {
mDefaultHandler(mDefaultHandlerContext, &aHeader, &aMessage, &aMessageInfo); mDefaultHandler(mDefaultHandlerContext, &aHeader, &aMessage, &aMessageInfo);
error = kThreadError_None;
} }
exit: exit:
if (error != kThreadError_None && response != NULL) if (error != kThreadError_None)
{ {
response->Free(); otLogInfoCoapErr(mNetif.GetInstance(), error, "Failed to process request");
if (error == kThreadError_NotFound)
{
SendNotFound(aHeader, aMessageInfo);
}
if (cachedResponse != NULL)
{
cachedResponse->Free();
}
} }
return; return;
+33 -1
View File
@@ -551,6 +551,20 @@ public:
return SendEmptyMessage(kCoapTypeReset, aRequestHeader, aMessageInfo); return SendEmptyMessage(kCoapTypeReset, aRequestHeader, aMessageInfo);
}; };
/**
* This method sends header-only CoAP response message.
*
* @param[in] aCode The CoAP code of this response.
* @param[in] aRequestHeader A reference to the CoAP Header that was used in CoAP request.
* @param[in] aMessageInfo The message info corresponding to the CoAP request.
*
* @retval kThreadError_None Successfully enqueued the CoAP response message.
* @retval kThreadError_NoBufs Insufficient buffers available to send the CoAP response.
* @retval kThreadError_InvalidArgs The @p aRequestHeader header is not of confirmable type.
*
*/
ThreadError SendHeaderResponse(Header::Code aCode, const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo);
/** /**
* This method sends a CoAP ACK empty message which is used in Separate Response for confirmable requests. * This method sends a CoAP ACK empty message which is used in Separate Response for confirmable requests.
* *
@@ -577,7 +591,25 @@ public:
* @retval kThreadError_InvalidArgs The @p aRequestHeader header is not of confirmable type. * @retval kThreadError_InvalidArgs The @p aRequestHeader header is not of confirmable type.
* *
*/ */
ThreadError SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo); ThreadError SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) {
return (aRequestHeader.GetType() == kCoapTypeConfirmable ?
SendHeaderResponse(kCoapResponseChanged, aRequestHeader, aMessageInfo) :
kThreadError_InvalidArgs);
}
/**
* This method sends a header-only CoAP message to indicate no resource matched for the request.
*
* @param[in] aRequestHeader A reference to the CoAP Header that was used in CoAP request.
* @param[in] aMessageInfo The message info corresponding to the CoAP request.
*
* @retval kThreadError_None Successfully enqueued the CoAP response message.
* @retval kThreadError_NoBufs Insufficient buffers available to send the CoAP response.
*
*/
ThreadError SendNotFound(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) {
return SendHeaderResponse(kCoapResponseNotFound, aRequestHeader, aMessageInfo);
}
/** /**
* This method aborts CoAP transactions associated with given handler and context. * This method aborts CoAP transactions associated with given handler and context.