uri.c File Reference
`#include "coap3/coap_internal.h"`
`#include <stdint.h>`
`#include <stdio.h>`
`#include <string.h>`
`#include <ctype.h>`
Include dependency graph for uri.c:

Go to the source code of this file.

## Data Structures

struct | cnt_str

## Macros

#define | ISEQUAL_CI(a, b) ((a) == (b) || (islower(b) && ((a) == ((b) - 0x20))))
#define | hexchar_to_dec(c)
| Calculates decimal value from hexadecimal ASCII character given in `c`. More...
#define | min(a, b) ((a) < (b) ? (a) : (b))
#define | URI_DATA(uriobj) ((unsigned char *)(uriobj) + sizeof(coap_uri_t))

## Typedefs

typedef enum coap_uri_check_t | coap_uri_check_t
typedef void(* | segment_handler_t) (const uint8_t *, size_t, void *)

## Enumerations

enum | coap_uri_check_t { COAP_URI_CHECK_URI , COAP_URI_CHECK_PROXY }

## Functions

COAP_STATIC_INLINE const uint8_t * | strnchr (const uint8_t *s, size_t len, unsigned char c)
| A length-safe version of strchr(). More...
static int | coap_split_uri_sub (const uint8_t *str_var, size_t len, coap_uri_t *uri, coap_uri_check_t check_proxy)
int | coap_split_uri (const uint8_t *str_var, size_t len, coap_uri_t *uri)
| Parses a given string into URI components. More...
int | coap_split_proxy_uri (const uint8_t *str_var, size_t len, coap_uri_t *uri)
| Parses a given string into URI components. More...
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`. More...
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. More...
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`. More...
COAP_STATIC_INLINE int | dots (const uint8_t *s, size_t len)
| Checks if path segment `s` consists of one or two dots. More...
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. More...
static void | write_option (const uint8_t *s, size_t len, void *data)
int | coap_split_path (const uint8_t *s, size_t length, unsigned char *buf, size_t *buflen)
| Splits the given URI path into segments. More...
int | coap_split_query (const uint8_t *s, size_t length, unsigned char *buf, size_t *buflen)
| Splits the given URI query into segments. More...
coap_uri_t * | coap_new_uri (const uint8_t *uri, unsigned int length)
| Creates a new coap_uri_t object from the specified URI. More...
coap_uri_t * | coap_clone_uri (const coap_uri_t *uri)
| Clones the specified coap_uri_t object. More...
COAP_STATIC_INLINE int | is_unescaped_in_path (const uint8_t c)
COAP_STATIC_INLINE int | is_unescaped_in_query (const uint8_t c)
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. More...
coap_string_t * | coap_get_uri_path (const coap_pdu_t *request)
| Extract uri_path string from request PDU. More...

## Macro Definition Documentation

## hexchar_to_dec

#define hexchar_to_dec | ( |  | c | ) |

Calculates decimal value from hexadecimal ASCII character given in `c`.

The caller must ensure that `c` actually represents a valid heaxdecimal character, e.g. with isxdigit(3).

Definition at line 252 of file uri.c.

## ISEQUAL_CI

#define ISEQUAL_CI | ( |  | a,
|  |  | b
| ) |  | ((a) == (b) || (islower(b) && ((a) == ((b) - 0x20))))

Definition at line 41 of file uri.c.

## min

#define min | ( |  | a,
|  |  | b
| ) |  | ((a) < (b) ? (a) : (b))

Definition at line 370 of file uri.c.

## URI_DATA

#define URI_DATA | ( |  | uriobj | ) | ((unsigned char *)(uriobj) + sizeof(coap_uri_t))

Definition at line 479 of file uri.c.

## Typedef Documentation

## coap_uri_check_t

typedef enum coap_uri_check_t coap_uri_check_t

## segment_handler_t

typedef void(* segment_handler_t) (const uint8_t *, size_t, void *)

Definition at line 373 of file uri.c.

## Enumeration Type Documentation

## coap_uri_check_t

enum coap_uri_check_t

Enumerator
COAP_URI_CHECK_URI |
COAP_URI_CHECK_PROXY |

Definition at line 44 of file uri.c.

## Function Documentation

## check_segment()

static int check_segment | ( | const uint8_t * | s,
|  | size_t | length,
|  | size_t * | segment_size
| ) |  |

static

Runs through the given path (or query) segment and checks if percent-encodings are correct.

This function returns `0` on success and `-1` on error.

Definition at line 289 of file uri.c.

Here is the caller graph for this function:

## coap_clone_uri()

coap_uri_t* coap_clone_uri | ( | const coap_uri_t * | uri | ) |

Clones the specified coap_uri_t object.

Thie function allocates sufficient memory to hold the coap_uri_t structure and its contents. The object must be released with coap_free().

Definition at line 501 of file uri.c.

Here is the call graph for this function:

## coap_new_uri()

coap_uri_t* coap_new_uri | ( | const uint8_t * | uri,
|  | unsigned int | length
| ) |  |

Creates a new coap_uri_t object from the specified URI.

Returns the new object or NULL on error. The memory allocated by the new coap_uri_t must be released using coap_free().

Parameters

  uri | The URI path to copy.
  length | The length of uri.

Returns
  New URI object or NULL on error.

Definition at line 482 of file uri.c.

Here is the call graph for this function:

## coap_split_path_impl()

static size_t coap_split_path_impl | ( | const uint8_t * | s,
|  | size_t | length,
|  | segment_handler_t | h,
|  | void * | data
| ) |  |

static

Splits the given string into segments.

You should call one of the macros coap_split_path() or coap_split_query() instead.

Parameters

  s | The URI string to be tokenized.
  length | The length of `s`.
  h | A handler that is called with every token.
  data | Opaque data that is passed to `h` when called.

Returns
  The number of characters that have been parsed from `s`.

Definition at line 395 of file uri.c.

Here is the call graph for this function:
Here is the caller graph for this function:

## coap_split_uri_sub()

static int coap_split_uri_sub | ( | const uint8_t * | str_var,
|  | size_t | len,
|  | coap_uri_t * | uri,
|  | coap_uri_check_t | check_proxy
| ) |  |

static

Definition at line 50 of file uri.c.

Here is the caller graph for this function:

## decode_segment()

static void decode_segment | ( | const uint8_t * | seg,
|  | size_t | length,
|  | unsigned char * | buf
| ) |  |

static

Decodes percent-encoded characters while copying the string `seg` of size `length` to `buf`.

The caller of this function must ensure that the percent-encodings are correct (i.e. the character '' is always followed by two hex digits. and that `buf` provides sufficient space to hold the result. This function is supposed to be called by make_decoded_option() only.

Parameters

  seg | The segment to decode and copy.
  length | Length of `seg`.
  buf | The result buffer.

Definition at line 267 of file uri.c.

Here is the caller graph for this function:

## dots()

COAP_STATIC_INLINE int dots | ( | const uint8_t * | s,
|  | size_t | len
| ) |  |

Checks if path segment `s` consists of one or two dots.

Definition at line 379 of file uri.c.

Here is the caller graph for this function:

## is_unescaped_in_path()

COAP_STATIC_INLINE int is_unescaped_in_path | ( | const uint8_t | c | ) |

Definition at line 543 of file uri.c.

Here is the caller graph for this function:

## is_unescaped_in_query()

COAP_STATIC_INLINE int is_unescaped_in_query | ( | const uint8_t | c | ) |

Definition at line 552 of file uri.c.

Here is the call graph for this function:
Here is the caller graph for this function:

## make_decoded_option()

static int make_decoded_option | ( | const uint8_t * | s,
|  | size_t | length,
|  | unsigned char * | buf,
|  | size_t | buflen,
|  | size_t * | optionsize
| ) |  |

static

Writes a coap option from given string `s` to `buf`.

`s` should point to a (percent-encoded) path or query segment of a coap_uri_t object. The created option will have type `0`, and the length parameter will be set according to the size of the decoded string. On success, this function returns `0` and sets `optionsize` to the option's size. On error the function returns a value less than zero. This function must be called from coap_split_path_impl() only.

Parameters

  s | The string to decode.
  length | The size of the percent-encoded string `s`.
  buf | The buffer to store the new coap option.
  buflen | The maximum size of `buf`.
  optionsize | The option's size.

Returns
  `0` on success and `-1` on error.

Definition at line 330 of file uri.c.

Here is the call graph for this function:
Here is the caller graph for this function:

## strnchr()

COAP_STATIC_INLINE const uint8_t* strnchr | ( | const uint8_t * | s,
|  | size_t | len,
|  | unsigned char | c
| ) |  |

A length-safe version of strchr().

This function returns a pointer to the first occurrence of `c` in `s`, or `NULL` if not found.

Parameters

  s | The string to search for `c`.
  len | The length of `s`.
  c | The character to search.

Returns
  A pointer to the first occurence of `c`, or `NULL` if not found.

Definition at line 34 of file uri.c.

Here is the caller graph for this function:

## write_option()

static void write_option | ( | const uint8_t * | s,
|  | size_t | len,
|  | void * | data
| ) |  |

static

Definition at line 429 of file uri.c.

Here is the call graph for this function:
Here is the caller graph for this function: