diff options
Diffstat (limited to 'utils/http/parameter.c')
-rw-r--r-- | utils/http/parameter.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/utils/http/parameter.c b/utils/http/parameter.c new file mode 100644 index 000000000..968879d80 --- /dev/null +++ b/utils/http/parameter.c @@ -0,0 +1,153 @@ +/* + * Copyright 2010 John-Mark Bell <jmb@netsurf-browser.org> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <stdlib.h> +#include <string.h> + +#include "utils/http.h" + +#include "utils/http/generics.h" +#include "utils/http/parameter_internal.h" +#include "utils/http/primitives.h" + +/** + * Representation of an HTTP parameter + */ +struct http_parameter { + http__item base; + + lwc_string *name; /**< Parameter name */ + lwc_string *value; /**< Parameter value */ +}; + +/** + * Destructor for an HTTP parameter + * + * \param self Parameter to destroy + */ +static void http_destroy_parameter(http_parameter *self) +{ + lwc_string_unref(self->name); + lwc_string_unref(self->value); + free(self); +} + +/** + * Parse an HTTP parameter + * + * \param input Pointer to current input byte. Updated on exit. + * \param parameter Pointer to location to receive on-heap parameter. + * \return NSERROR_OK on success, + * NSERROR_NOMEM on memory exhaustion, + * NSERROR_NOT_FOUND if no parameter could be parsed + * + * The returned parameter is owned by the caller. + */ +nserror http__parse_parameter(const char **input, http_parameter **parameter) +{ + const char *pos = *input; + lwc_string *name; + lwc_string *value; + http_parameter *param; + nserror error; + + /* token "=" ( token | quoted-string ) */ + + error = http__parse_token(&pos, &name); + if (error != NSERROR_OK) + return error; + + http__skip_LWS(&pos); + + if (*pos != '=') { + lwc_string_unref(name); + return NSERROR_NOT_FOUND; + } + + pos++; + + http__skip_LWS(&pos); + + if (*pos == '"') + error = http__parse_quoted_string(&pos, &value); + else + error = http__parse_token(&pos, &value); + + if (error != NSERROR_OK) { + lwc_string_unref(name); + return error; + } + + param = malloc(sizeof(*param)); + if (param == NULL) { + lwc_string_unref(value); + lwc_string_unref(name); + return NSERROR_NOMEM; + } + + HTTP__ITEM_INIT(param, NULL, http_destroy_parameter); + param->name = name; + param->value = value; + + *parameter = param; + *input = pos; + + return NSERROR_OK; +} + +/* See parameter.h for documentation */ +nserror http_parameter_list_find_item(const http_parameter *list, + lwc_string *name, lwc_string **value) +{ + bool match; + + while (list != NULL) { + if (lwc_string_caseless_isequal(name, list->name, + &match) == lwc_error_ok && match) + break; + + list = (http_parameter *) list->base.next; + } + + if (list == NULL) + return NSERROR_NOT_FOUND; + + *value = lwc_string_ref(list->value); + + return NSERROR_OK; +} + +/* See parameter.h for documentation */ +const http_parameter *http_parameter_list_iterate(const http_parameter *cur, + lwc_string **name, lwc_string **value) +{ + if (cur == NULL) + return NULL; + + *name = lwc_string_ref(cur->name); + *value = lwc_string_ref(cur->value); + + return (http_parameter *) cur->base.next; +} + +/* See parameter.h for documentation */ +void http_parameter_list_destroy(http_parameter *list) +{ + http__item_list_destroy(list); +} + |