Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
COAP_URI(3)			libcoap	Manual			   COAP_URI(3)

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 man	page describes the functionality available to work with	CoAP
       URIs and	break them down	into the component parts.

       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 is	used to	parse the provided uri_def of
       length length into the component	parts held in the uri structure. These
       component parts are the host, port, path, query and the CoAP URI
       scheme.

       Function: coap_split_proxy_uri()

       The coap_split_proxy_uri() function is used to parse the	provided
       uri_def of length length	into the component parts held in the uri
       structure. These	component parts	are the	host, port, path, query	and
       the URI scheme. The schemes also	includes support for http:// and
       https://	as 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.

       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 to	optlist_chain using coap_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(), and coap_uri_into_options()
       return 0	on success, else < 0 on	failure.

       coap_uri_into_optlist() returns 1 on success, 0 on failure.

       coap_new_uri() and coap_clone_uri() return a newly allocated coap_uri_t
       structure or NULL on 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>

coap_uri 4.3.5			  11/03/2025			   COAP_URI(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=coap_uri&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help