mirror of
https://gitlab.com/qemu-project/ipxe.git
synced 2025-10-30 07:56:50 +08:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b907bddd4a | |||
| c32e834f6d |
@ -150,7 +150,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
//#define POWEROFF_CMD /* Power off command */
|
||||
//#define IMAGE_TRUST_CMD /* Image trust management commands */
|
||||
//#define PCI_CMD /* PCI commands */
|
||||
//#define PARAM_CMD /* Form parameter commands */
|
||||
//#define PARAM_CMD /* Request parameter commands */
|
||||
//#define NEIGHBOUR_CMD /* Neighbour management commands */
|
||||
//#define PING_CMD /* Ping command */
|
||||
//#define CONSOLE_CMD /* Console command */
|
||||
|
||||
@ -25,7 +25,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Form parameters
|
||||
* Request parameters
|
||||
*
|
||||
*/
|
||||
|
||||
@ -37,7 +37,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
static LIST_HEAD ( parameters );
|
||||
|
||||
/**
|
||||
* Free form parameter list
|
||||
* Free request parameter list
|
||||
*
|
||||
* @v refcnt Reference count
|
||||
*/
|
||||
@ -60,7 +60,7 @@ static void free_parameters ( struct refcnt *refcnt ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Find form parameter list by name
|
||||
* Find request parameter list by name
|
||||
*
|
||||
* @v name Parameter list name (may be NULL)
|
||||
* @ret params Parameter list, or NULL if not found
|
||||
@ -78,7 +78,7 @@ struct parameters * find_parameters ( const char *name ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create form parameter list
|
||||
* Create request parameter list
|
||||
*
|
||||
* @v name Parameter list name (may be NULL)
|
||||
* @ret params Parameter list, or NULL on failure
|
||||
@ -118,15 +118,17 @@ struct parameters * create_parameters ( const char *name ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Add form parameter
|
||||
* Add request parameter
|
||||
*
|
||||
* @v params Parameter list
|
||||
* @v key Parameter key
|
||||
* @v value Parameter value
|
||||
* @v flags Parameter flags
|
||||
* @ret param Parameter, or NULL on failure
|
||||
*/
|
||||
struct parameter * add_parameter ( struct parameters *params,
|
||||
const char *key, const char *value ) {
|
||||
const char *key, const char *value,
|
||||
unsigned int flags ) {
|
||||
struct parameter *param;
|
||||
size_t key_len;
|
||||
size_t value_len;
|
||||
@ -147,11 +149,14 @@ struct parameter * add_parameter ( struct parameters *params,
|
||||
param->key = key_copy;
|
||||
strcpy ( value_copy, value );
|
||||
param->value = value_copy;
|
||||
param->flags = flags;
|
||||
|
||||
/* Add to list of parameters */
|
||||
list_add_tail ( ¶m->list, ¶ms->entries );
|
||||
|
||||
DBGC ( params, "PARAMS \"%s\" added \"%s\"=\"%s\"\n",
|
||||
params->name, param->key, param->value );
|
||||
DBGC ( params, "PARAMS \"%s\" added \"%s\"=\"%s\"%s%s\n",
|
||||
params->name, param->key, param->value,
|
||||
( ( param->flags & PARAMETER_FORM ) ? "(form)" : "" ),
|
||||
( ( param->flags & PARAMETER_HEADER ) ? "(header)" : "" ) );
|
||||
return param;
|
||||
}
|
||||
|
||||
@ -302,7 +302,7 @@ int parse_autovivified_setting ( char *text, struct named_setting *setting ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse form parameter list name
|
||||
* Parse request parameter list name
|
||||
*
|
||||
* @v text Text
|
||||
* @ret params Parameter list
|
||||
|
||||
@ -25,7 +25,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Form parameter commands
|
||||
* Request parameter commands
|
||||
*
|
||||
*/
|
||||
|
||||
@ -90,12 +90,16 @@ static int params_exec ( int argc, char **argv ) {
|
||||
struct param_options {
|
||||
/** Parameter list name */
|
||||
char *params;
|
||||
/** Parameter is a header */
|
||||
int header;
|
||||
};
|
||||
|
||||
/** "param" option list */
|
||||
static struct option_descriptor param_opts[] = {
|
||||
OPTION_DESC ( "params", 'p', required_argument,
|
||||
struct param_options, params, parse_string ),
|
||||
OPTION_DESC ( "header", 'H', no_argument,
|
||||
struct param_options, header, parse_flag ),
|
||||
};
|
||||
|
||||
/** "param" command descriptor */
|
||||
@ -114,6 +118,7 @@ static int param_exec ( int argc, char **argv ) {
|
||||
struct param_options opts;
|
||||
char *key;
|
||||
char *value;
|
||||
unsigned int flags;
|
||||
struct parameters *params;
|
||||
struct parameter *param;
|
||||
int rc;
|
||||
@ -132,12 +137,15 @@ static int param_exec ( int argc, char **argv ) {
|
||||
goto err_parse_value;
|
||||
}
|
||||
|
||||
/* Construct flags */
|
||||
flags = ( opts.header ? PARAMETER_HEADER : PARAMETER_FORM );
|
||||
|
||||
/* Identify parameter list */
|
||||
if ( ( rc = parse_parameters ( opts.params, ¶ms ) ) != 0 )
|
||||
goto err_parse_parameters;
|
||||
|
||||
/* Add parameter */
|
||||
param = add_parameter ( params, key, value );
|
||||
param = add_parameter ( params, key, value, flags );
|
||||
if ( ! param ) {
|
||||
rc = -ENOMEM;
|
||||
goto err_add_parameter;
|
||||
@ -154,7 +162,7 @@ static int param_exec ( int argc, char **argv ) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
/** Form parameter commands */
|
||||
/** Request parameter commands */
|
||||
struct command param_commands[] __command = {
|
||||
{
|
||||
.name = "params",
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Form parameters
|
||||
* Request parameters
|
||||
*
|
||||
*/
|
||||
|
||||
@ -12,7 +12,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
#include <ipxe/list.h>
|
||||
#include <ipxe/refcnt.h>
|
||||
|
||||
/** A form parameter list */
|
||||
/** A request parameter list */
|
||||
struct parameters {
|
||||
/** Reference count */
|
||||
struct refcnt refcnt;
|
||||
@ -24,18 +24,26 @@ struct parameters {
|
||||
struct list_head entries;
|
||||
};
|
||||
|
||||
/** A form parameter */
|
||||
/** A request parameter */
|
||||
struct parameter {
|
||||
/** List of form parameters */
|
||||
/** List of request parameters */
|
||||
struct list_head list;
|
||||
/** Key */
|
||||
const char *key;
|
||||
/** Value */
|
||||
const char *value;
|
||||
/** Flags */
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
/** Request parameter is a form parameter */
|
||||
#define PARAMETER_FORM 0x0001
|
||||
|
||||
/** Request parameter is a header parameter */
|
||||
#define PARAMETER_HEADER 0x0002
|
||||
|
||||
/**
|
||||
* Increment form parameter list reference count
|
||||
* Increment request parameter list reference count
|
||||
*
|
||||
* @v params Parameter list, or NULL
|
||||
* @ret params Parameter list as passed in
|
||||
@ -47,7 +55,7 @@ params_get ( struct parameters *params ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrement form parameter list reference count
|
||||
* Decrement request parameter list reference count
|
||||
*
|
||||
* @v params Parameter list, or NULL
|
||||
*/
|
||||
@ -57,7 +65,7 @@ params_put ( struct parameters *params ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Claim ownership of form parameter list
|
||||
* Claim ownership of request parameter list
|
||||
*
|
||||
* @v params Parameter list
|
||||
* @ret params Parameter list
|
||||
@ -71,13 +79,14 @@ claim_parameters ( struct parameters *params ) {
|
||||
return params;
|
||||
}
|
||||
|
||||
/** Iterate over all form parameters in a list */
|
||||
/** Iterate over all request parameters in a list */
|
||||
#define for_each_param( param, params ) \
|
||||
list_for_each_entry ( (param), &(params)->entries, list )
|
||||
|
||||
extern struct parameters * find_parameters ( const char *name );
|
||||
extern struct parameters * create_parameters ( const char *name );
|
||||
extern struct parameter * add_parameter ( struct parameters *params,
|
||||
const char *key, const char *value );
|
||||
const char *key, const char *value,
|
||||
unsigned int flags );
|
||||
|
||||
#endif /* _IPXE_PARAMS_H */
|
||||
|
||||
@ -84,7 +84,7 @@ struct uri {
|
||||
const char *equery;
|
||||
/** Fragment (with original URI encoding) */
|
||||
const char *efragment;
|
||||
/** Form parameters */
|
||||
/** Request parameters */
|
||||
struct parameters *params;
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
|
||||
@ -831,6 +831,7 @@ static int http_transfer_complete ( struct http_transaction *http ) {
|
||||
static int http_format_headers ( struct http_transaction *http, char *buf,
|
||||
size_t len ) {
|
||||
struct http_request_header *header;
|
||||
struct parameter *param;
|
||||
size_t used;
|
||||
size_t remaining;
|
||||
char *line;
|
||||
@ -844,7 +845,7 @@ static int http_format_headers ( struct http_transaction *http, char *buf,
|
||||
DBGC2 ( http, "HTTP %p TX %s\n", http, buf );
|
||||
used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
|
||||
|
||||
/* Construct all headers */
|
||||
/* Construct all fixed headers */
|
||||
for_each_table_entry ( header, HTTP_REQUEST_HEADERS ) {
|
||||
|
||||
/* Determine header value length */
|
||||
@ -869,6 +870,18 @@ static int http_format_headers ( struct http_transaction *http, char *buf,
|
||||
used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
|
||||
}
|
||||
|
||||
/* Construct all parameter headers */
|
||||
for_each_param ( param, http->uri->params ) {
|
||||
|
||||
/* Skip non-header parameters */
|
||||
if ( ! ( param->flags & PARAMETER_HEADER ) )
|
||||
continue;
|
||||
|
||||
/* Add parameter */
|
||||
used += ssnprintf ( ( buf + used ), ( len - used ),
|
||||
"%s: %s\r\n", param->key, param->value );
|
||||
}
|
||||
|
||||
/* Construct terminating newline */
|
||||
used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
|
||||
|
||||
@ -1851,14 +1864,15 @@ static struct http_state http_trailers = {
|
||||
*/
|
||||
|
||||
/**
|
||||
* Construct HTTP parameter list
|
||||
* Construct HTTP form parameter list
|
||||
*
|
||||
* @v params Parameter list
|
||||
* @v buf Buffer to contain HTTP POST parameters
|
||||
* @v len Length of buffer
|
||||
* @ret len Length of parameter list (excluding terminating NUL)
|
||||
*/
|
||||
static size_t http_params ( struct parameters *params, char *buf, size_t len ) {
|
||||
static size_t http_form_params ( struct parameters *params, char *buf,
|
||||
size_t len ) {
|
||||
struct parameter *param;
|
||||
ssize_t remaining = len;
|
||||
size_t frag_len;
|
||||
@ -1867,6 +1881,10 @@ static size_t http_params ( struct parameters *params, char *buf, size_t len ) {
|
||||
len = 0;
|
||||
for_each_param ( param, params ) {
|
||||
|
||||
/* Skip non-form parameters */
|
||||
if ( ! ( param->flags & PARAMETER_FORM ) )
|
||||
continue;
|
||||
|
||||
/* Add the "&", if applicable */
|
||||
if ( len ) {
|
||||
if ( remaining > 0 )
|
||||
@ -1930,8 +1948,8 @@ static int http_open_post_uri ( struct interface *xfer, struct uri *uri ) {
|
||||
size_t check_len;
|
||||
int rc;
|
||||
|
||||
/* Calculate length of parameter list */
|
||||
len = http_params ( params, NULL, 0 );
|
||||
/* Calculate length of form parameter list */
|
||||
len = http_form_params ( params, NULL, 0 );
|
||||
|
||||
/* Allocate temporary parameter list */
|
||||
data = zalloc ( len + 1 /* NUL */ );
|
||||
@ -1940,8 +1958,8 @@ static int http_open_post_uri ( struct interface *xfer, struct uri *uri ) {
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
/* Construct temporary parameter list */
|
||||
check_len = http_params ( params, data, ( len + 1 /* NUL */ ) );
|
||||
/* Construct temporary form parameter list */
|
||||
check_len = http_form_params ( params, data, ( len + 1 /* NUL */ ) );
|
||||
assert ( check_len == len );
|
||||
|
||||
/* Construct request content */
|
||||
|
||||
@ -92,15 +92,17 @@ struct uri_churi_test {
|
||||
const char *expected;
|
||||
};
|
||||
|
||||
/** A form parameter URI test list */
|
||||
/** A request parameter URI test list */
|
||||
struct uri_params_test_list {
|
||||
/** Key */
|
||||
const char *key;
|
||||
/** Value */
|
||||
const char *value;
|
||||
/** Flags */
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
/** A form parameter URI test */
|
||||
/** A request parameter URI test */
|
||||
struct uri_params_test {
|
||||
/** URI string */
|
||||
const char *string;
|
||||
@ -403,9 +405,9 @@ static void uri_churi_okx ( struct uri_churi_test *test, const char *file,
|
||||
#define uri_churi_ok( test ) uri_churi_okx ( test, __FILE__, __LINE__ )
|
||||
|
||||
/**
|
||||
* Report form parameter URI test list result
|
||||
* Report request parameter URI test list result
|
||||
*
|
||||
* @v test Form parameter URI test
|
||||
* @v test Request parameter URI test
|
||||
* @v uri URI
|
||||
* @v file Test code file
|
||||
* @v line Test code line
|
||||
@ -428,6 +430,7 @@ static void uri_params_list_okx ( struct uri_params_test *test,
|
||||
file, line );
|
||||
okx ( strcmp ( param->value, list->value ) == 0,
|
||||
file, line );
|
||||
okx ( param->flags == list->flags, file, line );
|
||||
list++;
|
||||
}
|
||||
okx ( list->key == NULL, file, line );
|
||||
@ -437,9 +440,9 @@ static void uri_params_list_okx ( struct uri_params_test *test,
|
||||
uri_params_list_okx ( test, __FILE__, __LINE__ )
|
||||
|
||||
/**
|
||||
* Report form parameter URI test result
|
||||
* Report request parameter URI test result
|
||||
*
|
||||
* @v test Form parameter URI test
|
||||
* @v test Request parameter URI test
|
||||
* @v file Test code file
|
||||
* @v line Test code line
|
||||
*/
|
||||
@ -456,7 +459,8 @@ static void uri_params_okx ( struct uri_params_test *test, const char *file,
|
||||
okx ( params != NULL, file, line );
|
||||
if ( params ) {
|
||||
for ( list = test->list ; list->key ; list++ ) {
|
||||
param = add_parameter ( params, list->key, list->value);
|
||||
param = add_parameter ( params, list->key, list->value,
|
||||
list->flags );
|
||||
okx ( param != NULL, file, line );
|
||||
}
|
||||
}
|
||||
@ -879,27 +883,31 @@ static struct uri_churi_test uri_churi[] = {
|
||||
}
|
||||
};
|
||||
|
||||
/** Form parameter URI test list */
|
||||
/** Request parameter URI test list */
|
||||
static struct uri_params_test_list uri_params_list[] = {
|
||||
{
|
||||
"vendor",
|
||||
"10ec",
|
||||
PARAMETER_FORM,
|
||||
},
|
||||
{
|
||||
"device",
|
||||
"8139",
|
||||
PARAMETER_FORM,
|
||||
},
|
||||
{
|
||||
"uuid",
|
||||
"f59fac00-758f-498f-9fe5-87d790045d94",
|
||||
PARAMETER_HEADER,
|
||||
},
|
||||
{
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
}
|
||||
};
|
||||
|
||||
/** Form parameter URI test */
|
||||
/** Request parameter URI test */
|
||||
static struct uri_params_test uri_params = {
|
||||
"http://boot.ipxe.org/demo/boot.php##params",
|
||||
{
|
||||
@ -912,23 +920,26 @@ static struct uri_params_test uri_params = {
|
||||
uri_params_list,
|
||||
};
|
||||
|
||||
/** Named form parameter URI test list */
|
||||
/** Named request parameter URI test list */
|
||||
static struct uri_params_test_list uri_named_params_list[] = {
|
||||
{
|
||||
"mac",
|
||||
"00:1e:65:80:d3:b6",
|
||||
PARAMETER_FORM,
|
||||
},
|
||||
{
|
||||
"serial",
|
||||
"LXTQ20Z1139322762F2000",
|
||||
PARAMETER_FORM,
|
||||
},
|
||||
{
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
}
|
||||
};
|
||||
|
||||
/** Named form parameter URI test */
|
||||
/** Named request parameter URI test */
|
||||
static struct uri_params_test uri_named_params = {
|
||||
"http://192.168.100.4:3001/register##params=foo",
|
||||
{
|
||||
@ -996,7 +1007,7 @@ static void uri_test_exec ( void ) {
|
||||
/* Current working URI tests */
|
||||
uri_churi_ok ( uri_churi );
|
||||
|
||||
/* Form parameter URI tests */
|
||||
/* Request parameter URI tests */
|
||||
uri_params_ok ( &uri_params );
|
||||
uri_params_ok ( &uri_named_params );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user