h2o_utils.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "h2o_utils.h"
  3. #include "h2o/string_.h"
  4. #include "libnetdata/libnetdata.h"
  5. char *iovec_to_cstr(h2o_iovec_t *str)
  6. {
  7. char *c_str = mallocz(str->len + 1);
  8. memcpy(c_str, str->base, str->len);
  9. c_str[str->len] = 0;
  10. return c_str;
  11. }
  12. #define KEY_VAL_BUFFER_GROWTH_STEP 5
  13. h2o_iovec_pair_vector_t *parse_URL_params(h2o_mem_pool_t *pool, h2o_iovec_t params_string)
  14. {
  15. h2o_iovec_pair_vector_t *params_vec = h2o_mem_alloc_shared(pool, sizeof(h2o_iovec_pair_vector_t), NULL);
  16. memset(params_vec, 0, sizeof(h2o_iovec_pair_vector_t));
  17. h2o_iovec_pair_t param;
  18. while ((param.name.base = (char*)h2o_next_token(&params_string, '&', &param.name.len, &param.value)) != NULL) {
  19. if (params_vec->capacity == params_vec->size)
  20. h2o_vector_reserve(pool, params_vec, params_vec->capacity + KEY_VAL_BUFFER_GROWTH_STEP);
  21. params_vec->entries[params_vec->size++] = param;
  22. }
  23. return params_vec;
  24. }
  25. h2o_iovec_pair_t *get_URL_param_by_name(h2o_iovec_pair_vector_t *params_vec, const void *needle, size_t needle_len)
  26. {
  27. for (size_t i = 0; i < params_vec->size; i++) {
  28. h2o_iovec_pair_t *ret = &params_vec->entries[i];
  29. if (h2o_memis(ret->name.base, ret->name.len, needle, needle_len))
  30. return ret;
  31. }
  32. return NULL;
  33. }
  34. char *url_unescape(const char *url)
  35. {
  36. char *result = mallocz(strlen(url) + 1);
  37. int i, j;
  38. for (i = 0, j = 0; url[i] != 0; i++, j++) {
  39. if (url[i] == '%' && isxdigit(url[i+1]) && isxdigit(url[i+2])) {
  40. char hex[3] = { url[i+1], url[i+2], 0 };
  41. result[j] = strtol(hex, NULL, 16);
  42. i += 2;
  43. } else
  44. result[j] = url[i];
  45. }
  46. result[j] = 0;
  47. return result;
  48. }