From c550ae0e698d5cac09562fc800805726c8e10411 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Tue, 22 Feb 2011 23:46:03 +0000 Subject: Parser for Content-Disposition header svn path=/trunk/netsurf/; revision=11765 --- utils/http.c | 36 ++++++++++++++++++++++++++++++++++++ utils/http.h | 12 ++++++++++++ 2 files changed, 48 insertions(+) diff --git a/utils/http.c b/utils/http.c index 71c8a216e..7ae2fb386 100644 --- a/utils/http.c +++ b/utils/http.c @@ -343,6 +343,42 @@ nserror http_parse_content_type(const char *header_value, char **media_type, return NSERROR_OK; } +/* See http.h for documentation */ +nserror http_parse_content_disposition(const char *header_value, + char **disposition_type, http_parameter **parameters) +{ + const char *pos = header_value; + char *type; + http_parameter *params = NULL; + nserror error; + + /* disposition-type *( ";" parameter ) */ + + while (*pos == ' ' || *pos == '\t') + pos++; + + error = http_parse_token(&pos, &type); + if (error != NSERROR_OK) + return error; + + while (*pos == ' ' || *pos == '\t') + pos++; + + if (*pos == ';') { + error = http_parse_parameter_list(&pos, ¶ms); + if (error != NSERROR_OK) { + free(type); + return error; + } + } + + *disposition_type = type; + *parameters = params; + + return NSERROR_OK; + +} + /* See http.h for documentation */ nserror http_parameter_list_find_item(const http_parameter *list, const char *name, const char **value) diff --git a/utils/http.h b/utils/http.h index 1d8b4de6c..f15a10218 100644 --- a/utils/http.h +++ b/utils/http.h @@ -39,6 +39,18 @@ typedef struct http_parameter http_parameter; nserror http_parse_content_type(const char *header_value, char **media_type, http_parameter **parameters); +/** + * Parse an HTTP Content-Disposition header value + * + * \param header_value Header value to parse + * \param disposition_type Pointer to location to receive disposition type + * \param parameters Pointer to location to receive parameter list + * \return NSERROR_OK on success, + * NSERROR_NOMEM on memory exhaustion + */ +nserror http_parse_content_disposition(const char *header_value, + char **disposition_type, http_parameter **parameters); + /** * Find a named item in an HTTP parameter list * -- cgit v1.2.3