CAResult_t CAParseUriPartial(const unsigned char *str, size_t length, int target, coap_list_t **optlist) { if (!optlist) { OIC_LOG(ERROR, TAG, "optlist is null"); return CA_STATUS_INVALID_PARAM; } if ((target != COAP_OPTION_URI_PATH) && (target != COAP_OPTION_URI_QUERY)) { // should never occur. Log just in case. OIC_LOG(DEBUG, TAG, "Unexpected URI component."); return CA_NOT_SUPPORTED; } else if (str && length) { unsigned char uriBuffer[CA_BUFSIZE] = { 0 }; unsigned char *pBuf = uriBuffer; size_t buflen = sizeof(uriBuffer); int res = (target == COAP_OPTION_URI_PATH) ? coap_split_path(str, length, pBuf, &buflen) : coap_split_query(str, length, pBuf, &buflen); if (res > 0) { size_t prevIdx = 0; while (res--) { int ret = coap_insert(optlist, CACreateNewOptionNode(target, COAP_OPT_LENGTH(pBuf), (char *)COAP_OPT_VALUE(pBuf)), CAOrderOpts); if (ret <= 0) { return CA_STATUS_INVALID_PARAM; } size_t optSize = COAP_OPT_SIZE(pBuf); if ((prevIdx + optSize) < buflen) { pBuf += optSize; prevIdx += optSize; } } } else { OIC_LOG_V(ERROR, TAG, "Problem parsing URI : %d for %d", res, target); return CA_STATUS_FAILED; } } else { OIC_LOG(ERROR, TAG, "str or length is not available"); return CA_STATUS_FAILED; } return CA_STATUS_OK; }
void CAParseURI(const char* uriInfo, coap_list_t **optlist) { OIC_LOG(DEBUG, TAG, "parse URI"); unsigned char portbuf[2]; unsigned char _buf[CA_BUFSIZE]; unsigned char *buf = _buf; coap_uri_t uri; size_t buflen; uint32_t res; OIC_LOG_V(DEBUG, TAG, "url : %s", uriInfo); /* split arg into Uri-* options */ coap_split_uri((unsigned char *) uriInfo, strlen(uriInfo), &uri); if (uri.port != COAP_DEFAULT_PORT) { coap_insert(optlist, CACreateNewOptionNode(COAP_OPTION_URI_PORT, coap_encode_var_bytes(portbuf, uri.port), portbuf), CAOrderOpts); } if (uri.path.length) { buflen = CA_BUFSIZE; res = coap_split_path(uri.path.s, uri.path.length, buf, &buflen); while (res--) { coap_insert(optlist, CACreateNewOptionNode(COAP_OPTION_URI_PATH, COAP_OPT_LENGTH(buf), COAP_OPT_VALUE(buf)), CAOrderOpts); buf += COAP_OPT_SIZE(buf); } } if (uri.query.length) { buflen = CA_BUFSIZE; buf = _buf; res = coap_split_query(uri.query.s, uri.query.length, buf, &buflen); while (res--) { coap_insert(optlist, CACreateNewOptionNode(COAP_OPTION_URI_QUERY, COAP_OPT_LENGTH(buf), COAP_OPT_VALUE(buf)), CAOrderOpts); buf += COAP_OPT_SIZE(buf); } } }