summaryrefslogtreecommitdiffstats
path: root/src/core/uri.c
diff options
context:
space:
mode:
authorMichael Brown2013-08-14 16:07:52 +0200
committerMichael Brown2013-08-19 18:22:58 +0200
commite52380fa3b6631851ea5fdf2425c3b49e4229179 (patch)
treea002f922da4e4113a85dd15937d0246382b40bc1 /src/core/uri.c
parent[cmdline] Add "params" and "param" commands to manage form parameter lists (diff)
downloadipxe-e52380fa3b6631851ea5fdf2425c3b49e4229179.tar.gz
ipxe-e52380fa3b6631851ea5fdf2425c3b49e4229179.tar.xz
ipxe-e52380fa3b6631851ea5fdf2425c3b49e4229179.zip
[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 <mcb30@ipxe.org>
Diffstat (limited to 'src/core/uri.c')
-rw-r--r--src/core/uri.c31
1 files changed, 30 insertions, 1 deletions
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 <libgen.h>
#include <ctype.h>
#include <ipxe/vsprintf.h>
+#include <ipxe/params.h>
#include <ipxe/uri.h>
/**
@@ -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;