COAP_URI(3)
π COAP_URI(3) π
Welcome to the COAP_URI(3) page from the libcoap Manual, bestie β¨ β this is the whole vibe for working with CoAP URIs and breaking them into their little component parts.
πΈ NAME πΈ
coap_uri, coap_split_uri, coap_split_proxy_uri, coap_new_uri, coap_clone_uri, coap_delete_uri, coap_uri_into_optlist, coap_uri_into_options β Work with CoAP URIs π¦
β¨ SYNOPSIS β¨
#include <coap3/coap.h>
int coap_split_uri(const uint8_t *uri_def, size_t length, coap_uri_t
*uri);
int coap_split_proxy_uri(const uint8_t *uri_def, size_t length,
coap_uri_t *uri);
coap_uri_t *coap_new_uri(const uint8_t *uri_def, unsigned int length);
coap_uri_t *coap_clone_uri(const coap_uri_t *uri);
void coap_delete_uri(coap_uri_t *uri);
int coap_uri_into_optlist(const coap_uri_t *uri, const coap_address_t
*dst, coap_optlist_t **optlist_chain, int create_port_host_opt);
int coap_uri_into_options(const coap_uri_t *uri, const coap_address_t
*dst, coap_optlist_t **optlist_chain, int create_port_host_opt, uint8_t
*buf, size_t buflen);
For specific (D)TLS library support, link with -lcoap-3-notls, -lcoap-3-gnutls, -lcoap-3-openssl, -lcoap-3-mbedtls, -lcoap-3-wolfssl or -lcoap-3-tinydtls. Otherwise, link with -lcoap-3 to get the default (D)TLS library support. π
π DESCRIPTION π
This page is literally your guide to working with CoAP URIs and splitting them down into their component parts. No cap.
A CoAP URI is of the form:
<scheme><host><(optional):port><(optional)path><(optional)?query>
where scheme can be one of coap://, coaps://, coap+tcp:// and coaps+tcp://. π¦
host can be an IPv4 or IPv6 (enclosed in []) address, a DNS resolvable name or a Unix domain socket name which is encoded as a unix file name with %2F replacing each / of the file name so that the start of the path can easily be determined.
(optional):port is ignored for Unix domain socketβs host definitions. π
The parsed uri structure is of the form:
typedef struct {
coap_str_const_t host; /* The host part of the URI */
uint16_t port; /* The port in host byte order */
coap_str_const_t path; /* The complete path if present or {0, NULL}.
Needs to be split using coap_path_into_optlist(3)
or coap_uri_into_optlist(). */
coap_str_const_t query; /* The complete query if present or {0, NULL}.
Needs to be split using coap_query_into_optlist(3)
or coap_uri_into_optlist(). */
enum coap_uri_scheme_t scheme; /* The parsed scheme specifier. */
} coap_uri_t;
π FUNCTIONS π
β Function: coap_split_uri()
The coap_split_uri() function parses the provided uri_def of length length into the component parts held in the uri structure. Those component parts are the host, port, path, query and the CoAP URI scheme. Iconic behavior, honestly.
β Function: coap_split_proxy_uri()
The coap_split_proxy_uri() function parses the provided uri_def of length length into the component parts held in the uri structure. Those component parts are the host, port, path, query and the URI scheme. The scheme set also includes support for http:// and https:// because the proxy may need to be a coap-to-http proxy. π«Ά
β Function: coap_new_uri()
The coap_new_uri() function creates a new coap_uri_t structure and populates it using coap_split_uri() with uri_def and length as input. The returned coap_uri_t structure needs to be freed off using coap_delete_uri(). π
β Function: coap_clone_uri()
The coap_clone_uri() function duplicates a uri coap_uri_t structure. The returned coap_uri_t structure needs to be freed off using coap_delete_uri(). π¦
β Function: coap_delete_uri()
The coap_delete_uri() function frees off a previously created uri coap_uri_t structure. Cleanup queen behavior β¨
β Function: coap_uri_into_optlist()
The coap_uri_into_optlist() function takes the uri structure and then takes CoAP options derived from this information and adds them to optlist_chain. The initial optlist_chain entry should be set to NULL before this function is called (unless coap_insert_optlist(3) has been previously used).
If dst is not NULL and create_port_host_opt is not 0, then the Uri-Host option is added in if the uri host definition is not an exact match with the ascii readable version of _dst.
If the port is not the default port and create_port_host_opt is not 0, then the Uri-Port option is added to optlist_chain.
If there is a path, then this is broken down into individual Uri-Path options for each segment which are then added to optlist_chain.
Likewise, if there is a query, individual Uri-Query options for each segment are then added to optlist_chain.
NOTE: It is the responsibility of the application to free off the entries added tooptlist_chainusingcoap_delete_optlist(3). π
β Function: coap_uri_into_options()
The coap_uri_into_options() function has the same functionality as coap_uri_into_optlist() except that buf and buflen are ignored, but the return values are different. π
π RETURN VALUES π
coap_split_uri(),coap_split_proxy_uri(), andcoap_uri_into_options()return0on success, else< 0on failure.coap_uri_into_optlist()returns1on success,0on failure.coap_new_uri()andcoap_clone_uri()return a newly allocatedcoap_uri_tstructure orNULLon failure.
π EXAMPLES π
π Setup PDU and Transmit π
#include <coap3/coap.h>
/*
* Returns 0 failure, 1 success
*/
static int
parse_and_send_uri(coap_session_t *session, const char *do_uri) {
coap_uri_t uri;
coap_optlist_t *optlist = NULL;
coap_pdu_t *pdu;
coap_proto_t proto = coap_session_get_proto(session);
const coap_address_t *dst = coap_session_get_addr_remote(session);
int res;
coap_mid_t mid;
/* Parse the URI */
res = coap_split_uri((const uint8_t *)do_uri, strlen(do_uri), &uri);
if (res != 0)
return 0;
/* Check the scheme matches the session type */
switch (uri.scheme) {
case COAP_URI_SCHEME_COAP:
if (proto != COAP_PROTO_UDP)
return 0;
break;
case COAP_URI_SCHEME_COAPS:
if (proto != COAP_PROTO_DTLS)
return 0;
break;
case COAP_URI_SCHEME_COAP_TCP:
if (proto != COAP_PROTO_TCP)
return 0;
break;
case COAP_URI_SCHEME_COAPS_TCP:
if (proto != COAP_PROTO_TLS)
return 0;
break;
case COAP_URI_SCHEME_COAP_WS:
if (proto != COAP_PROTO_WS)
return 0;
break;
case COAP_URI_SCHEME_COAPS_WS:
if (proto != COAP_PROTO_WSS)
return 0;
break;
/* Proxy support only */
case COAP_URI_SCHEME_HTTP:
case COAP_URI_SCHEME_HTTPS:
case COAP_URI_SCHEME_LAST:
default:
return 0;
}
/* construct CoAP message */
pdu = coap_pdu_init(COAP_MESSAGE_CON,
COAP_REQUEST_CODE_GET,
coap_new_message_id(session),
coap_session_max_pdu_size(session));
if (pdu == NULL)
return 0;
/* Create all the necessary options from the URI */
if (!coap_uri_into_optlist(&uri, dst, &optlist, 1))
return 0;
/* Add option list (which will get sorted) to the PDU */
if (optlist) {
res = coap_add_optlist_pdu(pdu, &optlist);
coap_delete_optlist(optlist);
if (res != 1)
return 0;
}
/* and send the PDU */
mid = coap_send(session, pdu);
if (mid == COAP_INVALID_MID)
return 0;
return 1;
}
π¦ SEE ALSO π¦
coap_endpoint_client(3) and coap_pdu_setup(3).
β FURTHER INFORMATION β
See
"RFC7252: The Constrained Application Protocol (CoAP)"
for further information. π
π BUGS π
Please raise an issue on GitHub at https://github.com/obgm/libcoap/issues to report any bugs.
Please raise a Pull Request at https://github.com/obgm/libcoap/pulls for any fixes. π«Ά
π AUTHORS π
The libcoap project <libcoap-developers@lists.sourceforge.net>
Catch you later, bestie β this was coap_uri version 4.3.5b, dated 04/28/2026. Stay slay π
β¨
π¦ where this page comes from
- alpine 3.24: libcoap-doc 4.3.5b-r0 Β· BSD-2-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms