mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-22 01:21:45 +00:00
[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>
This commit is contained in:
parent
430c3fb900
commit
e52380fa3b
@ -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;
|
||||
|
@ -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
|
||||
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user