From e52380fa3b6631851ea5fdf2425c3b49e4229179 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 14 Aug 2013 15:07:52 +0100 Subject: [PATCH] [uri] Allow URIs to incorporate a parameter list HTTP POST requires the ability to associate a parameter list with a URI. There is no standardised syntax for this. Use a non-standard URI syntax to incorporate the specification of a parameter list within a URI: URI = [ absoluteURI | relativeURI ] [ "#" fragment ] [ "##params" [ "=" paramsName ] ] e.g. http://boot.ipxe.org/demo/boot.php##params http://boot.ipxe.org/demo/boot.php##params=mylist Signed-off-by: Michael Brown --- src/core/uri.c | 31 ++++++++++++++++++++++++++++++- src/include/ipxe/uri.h | 4 ++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/core/uri.c b/src/core/uri.c index e9526882..bc55e4d8 100644 --- a/src/core/uri.c +++ b/src/core/uri.c @@ -31,6 +31,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include #include /** @@ -59,6 +60,21 @@ static void dump_uri ( struct uri *uri ) { DBG ( " query \"%s\"", uri->query ); if ( uri->fragment ) DBG ( " fragment \"%s\"", uri->fragment ); + if ( uri->params ) + DBG ( " params \"%s\"", uri->params->name ); +} + +/** + * Free URI + * + * @v refcnt Reference count + */ +static void free_uri ( struct refcnt *refcnt ) { + struct uri *uri = container_of ( refcnt, struct uri, refcnt ); + + if ( uri->params ) + destroy_parameters ( uri->params ); + free ( uri ); } /** @@ -85,12 +101,25 @@ struct uri * parse_uri ( const char *uri_string ) { uri = zalloc ( sizeof ( *uri ) + raw_len ); if ( ! uri ) return NULL; + ref_init ( &uri->refcnt, free_uri ); raw = ( ( ( char * ) uri ) + sizeof ( *uri ) ); /* Copy in the raw string */ memcpy ( raw, uri_string, raw_len ); - /* Start by chopping off the fragment, if it exists */ + /* Identify the parameter list, if present */ + if ( ( tmp = strstr ( raw, "##params" ) ) ) { + *tmp = '\0'; + tmp += 8 /* "##params" */; + uri->params = find_parameters ( *tmp ? ( tmp + 1 ) : NULL ); + if ( uri->params ) { + claim_parameters ( uri->params ); + } else { + /* Ignore non-existent submission blocks */ + } + } + + /* Chop off the fragment, if it exists */ if ( ( tmp = strchr ( raw, '#' ) ) ) { *(tmp++) = '\0'; uri->fragment = tmp; diff --git a/src/include/ipxe/uri.h b/src/include/ipxe/uri.h index 9a134690..a9ec4555 100644 --- a/src/include/ipxe/uri.h +++ b/src/include/ipxe/uri.h @@ -13,6 +13,8 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include +struct parameters; + /** A Uniform Resource Identifier * * Terminology for this data structure is as per uri(7), except that @@ -65,6 +67,8 @@ struct uri { const char *query; /** Fragment */ const char *fragment; + /** Form parameters */ + struct parameters *params; } __attribute__ (( packed )); /** A field in a URI