Skip to content

Commit

Permalink
[uri] Allow URIs to incorporate a parameter list
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Aug 19, 2013
1 parent 430c3fb commit e52380f
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
31 changes: 30 additions & 1 deletion src/core/uri.c
Expand Up @@ -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>

/**
Expand Down Expand Up @@ -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 );
}

/**
Expand All @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions src/include/ipxe/uri.h
Expand Up @@ -13,6 +13,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <stdlib.h>
#include <ipxe/refcnt.h>

struct parameters;

/** A Uniform Resource Identifier
*
* Terminology for this data structure is as per uri(7), except that
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit e52380f

Please sign in to comment.