struct c_vector * http_query_parameters_parse(const char *string) { struct c_vector *parameters; const char *ptr; parameters = c_vector_new(sizeof(struct http_query_parameter)); ptr = string; while (*ptr != '\0') { size_t toklen, name_sz, value_sz; const char *name_ptr, *value_ptr; struct http_query_parameter param; toklen = strcspn(ptr, "&;"); name_ptr = ptr; name_sz = c_memcspn(ptr, toklen, "="); if (name_sz == toklen) { value_ptr = NULL; value_sz = 0; } else { value_ptr = ptr + name_sz + 1; value_sz = toklen - name_sz - 1; } http_query_parameter_init(¶m); param.name = http_query_parameter_decode(name_ptr, name_sz); if (!param.name) { http_query_parameter_free(¶m); goto error; } if (value_ptr) { param.value = http_query_parameter_decode(value_ptr, value_sz); if (!param.value) { http_query_parameter_free(¶m); goto error; } } c_vector_append(parameters, ¶m); ptr += toklen; if (*ptr == '&' || *ptr == ';') ptr++; } return parameters; error: for (size_t i = 0; i < c_vector_length(parameters); i++) http_query_parameter_free(c_vector_entry(parameters, i)); c_vector_delete(parameters); return NULL; }
void http_uri_delete(struct http_uri *uri) { if (!uri) return; http_free(uri->scheme); http_free(uri->user); http_free(uri->password); http_free(uri->host); http_free(uri->port); http_free(uri->path); http_free(uri->fragment); for (size_t i = 0; i < uri->nb_query_parameters; i++) http_query_parameter_free(uri->query_parameters + i); http_free(uri->query_parameters); memset(uri, 0, sizeof(struct http_uri)); http_free(uri); }
void http_url_delete(struct http_url *url) { if (!url) return; c_free(url->scheme); c_free(url->user); c_free(url->password); c_free(url->host); c_free(url->port); c_free(url->path); c_free(url->query); c_free(url->fragment); if (url->query_parameters) { for (size_t i = 0; i < c_vector_length(url->query_parameters); i++) http_query_parameter_free(c_vector_entry(url->query_parameters, i)); c_vector_delete(url->query_parameters); } c_free0(url, sizeof(struct http_url)); }