|
| iMatix home page | << | < | > | >> |
SFLVersion 2.11 |
#include "sflhttp.h"
char **
http_query2strt (
const char *original_query)
Parses a HTTP query string, building an array of strings of the format "name=value". The query string is assumed to be in escaped format, so http unescape() is always applied to the query string. Within the query string, field=value pairs are delimited by & or ;. Returns a pointer to the array. The array is allocated dynamically. The array ends with a NULL string. To free the table, call strtfree(). If there was not enough memory to allocate the table, returns NULL.
{
char
*query, /* Local copy of query string */
*query_ptr, /* Pointer into query string */
*query_next, /* Pointer to next query chunk */
**strings; /* Returned string array */
int
char_nbr, /* Index into query string */
string_count, /* Size of string table */
string_nbr; /* Index into string table */
ASSERT (original_query);
if (*original_query == '&') /* Skip leading & if present */
original_query++;
if ((query = mem_strdup (original_query)) == NULL)
return (NULL); /* Could not allocate memory */
/* Break query string at & and ; delimiters and count strt size */
string_count = 1; /* Last string has no delimiter */
for (char_nbr = 0; original_query [char_nbr]; char_nbr++)
if (query [char_nbr] == '&' || query [char_nbr] == ';')
{
query [char_nbr] = '\0';
string_count++;
}
/* Allocate the array of pointers with one slot for the final NULL */
if ((strings = mem_alloc (sizeof (char *) * (string_count + 1))) == NULL)
{
mem_free (query);
return (NULL); /* Could not allocate memory */
}
/* Query string now consists of a series of substrings, each ending in
* a null character. We have to unescape each substring, which we do
* in-place: the unescaped string is never larger than the original
* string.
*/
query_ptr = query;
for (string_nbr = 0; string_nbr < string_count; string_nbr++)
{
/* Unescape next query string component */
query_next = query_ptr + strlen (query_ptr) + 1;
http unescape (query_ptr, NULL);
/* Allocate space for "name=value" plus final null char */
strings [string_nbr] = mem_strdup (query_ptr);
query_ptr = query_next;
}
strings [string_nbr] = NULL; /* Store final null pointer */
mem_free (query); /* Release temporary memory */
return (strings);
}
| | << | < | > | >> |
|