diff --git a/sys/include/net/nanocoap_sock.h b/sys/include/net/nanocoap_sock.h index 077dde7170..610b69db57 100644 --- a/sys/include/net/nanocoap_sock.h +++ b/sys/include/net/nanocoap_sock.h @@ -240,6 +240,22 @@ ssize_t nanocoap_sock_put(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max); +/** + * @brief Simple synchronous CoAP (confirmable) PUT to URL + * + * @param[in] url Absolute URL pointer to source path + * @param[in] request buffer containing the payload + * @param[in] len length of the payload to send + * @param[out] response buffer for the response, may be NULL + * @param[in] len_max length of @p response + * + * @returns length of response payload on success + * @returns <0 on error + */ +ssize_t nanocoap_sock_put_url(const char *url, + const void *request, size_t len, + void *response, size_t len_max); + /** * @brief Simple synchronous CoAP (confirmable) POST * @@ -257,6 +273,22 @@ ssize_t nanocoap_sock_post(nanocoap_sock_t *sock, const char *path, const void *request, size_t len, void *response, size_t len_max); +/** + * @brief Simple synchronous CoAP (confirmable) POST to URL + * + * @param[in] url Absolute URL pointer to source path + * @param[in] request buffer containing the payload + * @param[in] len length of the payload to send + * @param[out] response buffer for the response, may be NULL + * @param[in] len_max length of @p response + * + * @returns length of response payload on success + * @returns <0 on error + */ +ssize_t nanocoap_sock_post_url(const char *url, + const void *request, size_t len, + void *response, size_t len_max); + /** * @brief Performs a blockwise coap get request on a socket. * diff --git a/sys/net/application_layer/nanocoap/sock.c b/sys/net/application_layer/nanocoap/sock.c index 2d81c0b099..ff7667adcf 100644 --- a/sys/net/application_layer/nanocoap/sock.c +++ b/sys/net/application_layer/nanocoap/sock.c @@ -361,6 +361,36 @@ ssize_t nanocoap_sock_post(nanocoap_sock_t *sock, const char *path, return _sock_put_post(sock, path, COAP_METHOD_POST, request, len, response, len_max); } +static ssize_t _sock_put_post_url(const char *url, unsigned code, + const void *request, size_t len, + void *response, size_t len_max) +{ + nanocoap_sock_t sock; + int res = nanocoap_sock_url_connect(url, &sock); + if (res) { + return res; + } + + res = _sock_put_post(&sock, sock_urlpath(url), code, request, len, response, len_max); + nanocoap_sock_close(&sock); + + return res; +} + +ssize_t nanocoap_sock_put_url(const char *url, + const void *request, size_t len, + void *response, size_t len_max) +{ + return _sock_put_post_url(url, COAP_METHOD_PUT, request, len, response, len_max); +} + +ssize_t nanocoap_sock_post_url(const char *url, + const void *request, size_t len, + void *response, size_t len_max) +{ + return _sock_put_post_url(url, COAP_METHOD_POST, request, len, response, len_max); +} + ssize_t nanocoap_request(coap_pkt_t *pkt, const sock_udp_ep_t *local, const sock_udp_ep_t *remote, size_t len) {