13 #if defined(HAVE_LIMITS_H) 
   34 strnchr(
const uint8_t *s, 
size_t len, 
unsigned char c) {
 
   35   while (len && *s++ != c)
 
   38   return len ? s : NULL;
 
   41 #define ISEQUAL_CI(a,b) \ 
   42   ((a) == (b) || (islower(b) && ((a) == ((b) - 0x20)))) 
   56   int is_http_proxy_scheme = 0;
 
   57   size_t keep_len = len;
 
   82     q = (
const uint8_t *)
"http";
 
  104     is_http_proxy_scheme = 1;
 
  114   if (is_http_proxy_scheme == 0) {
 
  116     if (len && (*p == 
's')) {
 
  125     if (len>=4 && p[0] == 
'+' && p[1] == 
't' && p[2] == 
'c' && p[3] == 
'p' ) {
 
  134   q = (
const uint8_t *)
"://";
 
  135   while (len && *q && *p == *q) {
 
  146   if (len && *p == 
'[') {        
 
  149     while (len && *q != 
']') {
 
  153     if (!len || *q != 
']' || p == q) {
 
  161     while (len && *q != 
':' && *q != 
'/' && *q != 
'?') {
 
  175   if (len && *q == 
':') {
 
  179     while (len && isdigit(*q)) {
 
  187       while ((p < q) && (uri_port <= UINT16_MAX))
 
  188               uri_port = uri_port * 10 + (*p++ - 
'0');
 
  191       if (uri_port > UINT16_MAX) {
 
  196       uri->
port = (uint16_t)uri_port;
 
  209     while (len && *q != 
'?') {
 
  221   if (len && *p == 
'?') {
 
  252 #define hexchar_to_dec(c) ((c) & 0x40 ? ((c) & 0x0F) + 9 : ((c) & 0x0F)) 
  274       seg += 2; length -= 2;
 
  294       if (length < 2 || !(isxdigit(s[1]) && isxdigit(s[2])))
 
  331                     unsigned char *buf, 
size_t buflen, 
size_t* optionsize) {
 
  348   assert(written <= buflen);
 
  356   if (buflen < segmentlen) {
 
  363   *optionsize = written + segmentlen;
 
  370 #define min(a,b) ((a) < (b) ? (a) : (b)) 
  379 dots(
const uint8_t *s, 
size_t len) {
 
  380   return len && *s == 
'.' && (len == 1 || (len == 2 && *(s+1) == 
'.'));
 
  398   const uint8_t *p, *q;
 
  401   while (length > 0 && !
strnchr((
const uint8_t *)
"?#", 2, *q)) {
 
  404       if (!
dots(p, q - p)) {
 
  416   if (!
dots(p, q - p)) {
 
  437     state->
buf.
s += optionsize;
 
  445                 unsigned char *
buf, 
size_t *buflen) {
 
  457                 unsigned char *
buf, 
size_t *buflen) {
 
  462   while (length > 0 && *s != 
'#') {
 
  479 #define URI_DATA(uriobj) ((unsigned char *)(uriobj) + sizeof(coap_uri_t)) 
  483   unsigned char *result;
 
  490   memcpy(
URI_DATA(result), uri, length);
 
  544   return ( c >= 
'A' && c <= 
'Z' ) || ( c >= 
'a' && c <= 
'z' )
 
  545       || ( c >= 
'0' && c <= 
'9' ) || c == 
'-' || c == 
'.' || c == 
'_' 
  546       || c == 
'~' || c == 
'!' || c == 
'$' || c == 
'\'' || c == 
'(' 
  547       || c == 
')' || c == 
'*' || c == 
'+' || c == 
',' || c == 
';' || c==
'=' 
  548       || c==
':' || c==
'@' || c == 
'&';
 
  562   static const uint8_t hex[] = 
"0123456789ABCDEF";
 
  570     for (i = 0; i < seg_len; i++) {
 
  584       unsigned char *s = query->
s;
 
  591         for (i = 0; i < seg_len; i++) {
 
  596             *s++ = hex[seg[i]>>4];
 
  597             *s++ = hex[seg[i]&0x0F];
 
  612   static const uint8_t hex[] = 
"0123456789ABCDEF";
 
  620     for (i = 0; i < seg_len; i++) {
 
  636     uri_path->
length = length;
 
  637     unsigned char *s = uri_path->
s;
 
  646       for (i = 0; i < seg_len; i++) {
 
  651           *s++ = hex[seg[i]>>4];
 
  652           *s++ = hex[seg[i]&0x0F];
 
Pulls together all the internal only header files.
 
#define coap_log(level,...)
Logging function.
 
coap_opt_t * coap_option_next(coap_opt_iterator_t *oi)
Updates the iterator oi to point to the next option.
 
uint32_t coap_opt_length(const coap_opt_t *opt)
Returns the length of the given option.
 
void coap_option_filter_clear(coap_opt_filter_t *filter)
Clears filter filter.
 
const uint8_t * coap_opt_value(const coap_opt_t *opt)
Returns a pointer to the value of the given option.
 
coap_opt_iterator_t * coap_option_iterator_init(const coap_pdu_t *pdu, coap_opt_iterator_t *oi, const coap_opt_filter_t *filter)
Initializes the given option iterator oi to point to the beginning of the pdu's option list.
 
int coap_option_filter_set(coap_opt_filter_t *filter, coap_option_num_t option)
Sets the corresponding entry for number in filter.
 
size_t coap_opt_setheader(coap_opt_t *opt, size_t maxlen, uint16_t delta, size_t length)
Encodes the given delta and length values into opt.
 
#define COAP_DEFAULT_PORT
 
#define COAP_OPTION_URI_QUERY
 
#define COAP_OPTION_URI_PATH
 
#define COAP_DEFAULT_SCHEME
 
#define COAPS_DEFAULT_PORT
 
coap_string_t * coap_new_string(size_t size)
Returns a new string object with at least size+1 bytes storage allocated.
 
#define COAP_SET_STR(st, l, v)
 
coap_string_t * coap_get_uri_path(const coap_pdu_t *request)
Extract uri_path string from request PDU.
 
coap_string_t * coap_get_query(const coap_pdu_t *request)
Extract query string from request PDU according to escape rules in 6.5.8.
 
int coap_split_path(const uint8_t *s, size_t length, unsigned char *buf, size_t *buflen)
Splits the given URI path into segments.
 
int coap_split_query(const uint8_t *s, size_t length, unsigned char *buf, size_t *buflen)
Splits the given URI query into segments.
 
int coap_split_uri(const uint8_t *str_var, size_t len, coap_uri_t *uri)
Parses a given string into URI components.
 
int coap_split_proxy_uri(const uint8_t *str_var, size_t len, coap_uri_t *uri)
Parses a given string into URI components.
 
#define COAP_STATIC_INLINE
 
COAP_STATIC_INLINE void * coap_malloc(size_t size)
Wrapper function to coap_malloc_type() for backwards compatibility.
 
COAP_STATIC_INLINE void coap_free(void *object)
Wrapper function to coap_free_type() for backwards compatibility.
 
uint8_t coap_opt_t
Use byte-oriented access methods here because sliding a complex struct coap_opt_t over the data buffe...
 
Iterator to run through PDU options.
 
structure for CoAP PDUs token, if any, follows the fixed size header, then options until payload mark...
 
const uint8_t * s
read-only string data
 
size_t length
length of string
 
CoAP string data definition.
 
size_t length
length of string
 
Representation of parsed URI.
 
enum coap_uri_scheme_t scheme
The parsed scheme specifier.
 
coap_str_const_t path
Beginning of the first path segment.
 
uint16_t port
The port in host byte order.
 
coap_str_const_t query
The query part if present.
 
coap_str_const_t host
host part of the URI
 
COAP_STATIC_INLINE int is_unescaped_in_path(const uint8_t c)
 
static void decode_segment(const uint8_t *seg, size_t length, unsigned char *buf)
Decodes percent-encoded characters while copying the string seg of size length to buf.
 
COAP_STATIC_INLINE int is_unescaped_in_query(const uint8_t c)
 
COAP_STATIC_INLINE int dots(const uint8_t *s, size_t len)
Checks if path segment s consists of one or two dots.
 
COAP_STATIC_INLINE const uint8_t * strnchr(const uint8_t *s, size_t len, unsigned char c)
A length-safe version of strchr().
 
static size_t coap_split_path_impl(const uint8_t *s, size_t length, segment_handler_t h, void *data)
Splits the given string into segments.
 
static int check_segment(const uint8_t *s, size_t length, size_t *segment_size)
Runs through the given path (or query) segment and checks if percent-encodings are correct.
 
static void write_option(const uint8_t *s, size_t len, void *data)
 
static int coap_split_uri_sub(const uint8_t *str_var, size_t len, coap_uri_t *uri, coap_uri_check_t check_proxy)
 
coap_uri_t * coap_new_uri(const uint8_t *uri, unsigned int length)
Creates a new coap_uri_t object from the specified URI.
 
#define hexchar_to_dec(c)
Calculates decimal value from hexadecimal ASCII character given in c.
 
static int make_decoded_option(const uint8_t *s, size_t length, unsigned char *buf, size_t buflen, size_t *optionsize)
Writes a coap option from given string s to buf.
 
coap_uri_t * coap_clone_uri(const coap_uri_t *uri)
Clones the specified coap_uri_t object.
 
void(* segment_handler_t)(const uint8_t *, size_t, void *)
 
@ COAP_URI_SCHEME_COAPS_TCP
 
@ COAP_URI_SCHEME_COAP_TCP