Example #1
0
File: url.c Project: galdor/libhttp
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(&param);

        param.name = http_query_parameter_decode(name_ptr, name_sz);
        if (!param.name) {
            http_query_parameter_free(&param);
            goto error;
        }

        if (value_ptr) {
            param.value = http_query_parameter_decode(value_ptr, value_sz);
            if (!param.value) {
                http_query_parameter_free(&param);
                goto error;
            }
        }

        c_vector_append(parameters, &param);

        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;
}
Example #2
0
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);
}
Example #3
0
File: url.c Project: galdor/libhttp
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));
}