diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2011-07-08 08:38:17 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2011-07-08 08:38:17 +0000 |
commit | b34502af8247606ae3b5693cd3046566b16a3e6d (patch) | |
tree | db0cd37fcd7c7a936fc499928fcd4a0b07614847 /utils/http/challenge.c | |
parent | c54b6aabaa8bae670b84c7d9841d77be430756e7 (diff) | |
download | netsurf-b34502af8247606ae3b5693cd3046566b16a3e6d.tar.gz netsurf-b34502af8247606ae3b5693cd3046566b16a3e6d.tar.bz2 |
Refactor http utilities
svn path=/trunk/netsurf/; revision=12595
Diffstat (limited to 'utils/http/challenge.c')
-rw-r--r-- | utils/http/challenge.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/utils/http/challenge.c b/utils/http/challenge.c new file mode 100644 index 000000000..578532e97 --- /dev/null +++ b/utils/http/challenge.c @@ -0,0 +1,140 @@ +/* + * 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 "utils/http.h" + +#include "utils/http/challenge_internal.h" +#include "utils/http/generics.h" +#include "utils/http/parameter_internal.h" +#include "utils/http/primitives.h" + +/** + * Representation of an HTTP challenge + */ +struct http_challenge { + http__item base; + + lwc_string *scheme; /**< Challenge scheme */ + http_parameter *params; /**< Challenge parameters */ +}; + +/** + * Destroy an HTTP challenge + * + * \param self Challenge to destroy + */ +static void http_destroy_challenge(http_challenge *self) +{ + lwc_string_unref(self->scheme); + http_parameter_list_destroy(self->params); + free(self); +} + +/** + * Parse an HTTP challenge + * + * \param input Pointer to current input byte. Updated on exit. + * \param challenge Pointer to location to receive challenge + * \return NSERROR_OK on success, + * NSERROR_NOMEM on memory exhaustion, + * NSERROR_NOT_FOUND if no parameter could be parsed + * + * The returned challenge is owned by the caller. + */ +nserror http__parse_challenge(const char **input, http_challenge **challenge) +{ + const char *pos = *input; + http_challenge *result; + lwc_string *scheme; + http_parameter *first = NULL; + http_parameter *params = NULL; + nserror error; + + /* challenge = auth-scheme 1*SP 1#auth-param + * auth-scheme = token + * auth-param = parameter + */ + + error = http__parse_token(&pos, &scheme); + if (error != NSERROR_OK) + return error; + + if (*pos != ' ' && *pos != '\t') { + lwc_string_unref(scheme); + return NSERROR_NOT_FOUND; + } + + http__skip_LWS(&pos); + + error = http__parse_parameter(&pos, &first); + if (error != NSERROR_OK) { + lwc_string_unref(scheme); + return error; + } + + http__skip_LWS(&pos); + + if (*pos == ',') { + error = http__item_list_parse(&pos, + http__parse_parameter, first, ¶ms); + if (error != NSERROR_OK && error != NSERROR_NOT_FOUND) { + lwc_string_unref(scheme); + return error; + } + } else { + params = first; + } + + result = malloc(sizeof(*result)); + if (result == NULL) { + http_parameter_list_destroy(params); + lwc_string_unref(scheme); + return NSERROR_NOMEM; + } + + HTTP__ITEM_INIT(result, NULL, http_destroy_challenge); + result->scheme = scheme; + result->params = params; + + *challenge = result; + *input = pos; + + return NSERROR_OK; +} + +/* See challenge.h for documentation */ +const http_challenge *http_challenge_list_iterate(const http_challenge *cur, + lwc_string **scheme, http_parameter **parameters) +{ + if (cur == NULL) + return NULL; + + *scheme = lwc_string_ref(cur->scheme); + *parameters = cur->params; + + return (http_challenge *) cur->base.next; +} + +/* See challenge.h for documentation */ +void http_challenge_list_destroy(http_challenge *list) +{ + http__item_list_destroy(list); +} + |