mirror of
https://github.com/ipxe/ipxe
synced 2026-05-09 18:00:12 +03:00
[params] Allow for arbitrary HTTP request headers to be specified
Extend the request parameter mechanism to allow for arbitrary HTTP headers to be specified via e.g.: params param --header Referer http://www.example.com imgfetch http://192.168.0.1/script.ipxe##params Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
+34
-9
@@ -830,7 +830,9 @@ static int http_transfer_complete ( struct http_transaction *http ) {
|
||||
*/
|
||||
static int http_format_headers ( struct http_transaction *http, char *buf,
|
||||
size_t len ) {
|
||||
struct parameters *params = http->uri->params;
|
||||
struct http_request_header *header;
|
||||
struct parameter *param;
|
||||
size_t used;
|
||||
size_t remaining;
|
||||
char *line;
|
||||
@@ -844,7 +846,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 +871,23 @@ static int http_format_headers ( struct http_transaction *http, char *buf,
|
||||
used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
|
||||
}
|
||||
|
||||
/* Construct parameter headers, if any */
|
||||
if ( params ) {
|
||||
|
||||
/* Construct all parameter headers */
|
||||
for_each_param ( param, 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 +1870,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 +1887,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 )
|
||||
@@ -1920,25 +1944,26 @@ int http_open_uri ( struct interface *xfer, struct uri *uri ) {
|
||||
size_t check_len;
|
||||
int rc;
|
||||
|
||||
/* Calculate length of parameter list, if any */
|
||||
len = ( params ? http_params ( params, NULL, 0 ) : 0 );
|
||||
/* Calculate length of form parameter list, if any */
|
||||
len = ( params ? http_form_params ( params, NULL, 0 ) : 0 );
|
||||
|
||||
/* Use POST if and only if there are parameters */
|
||||
/* Use POST if and only if there are form parameters */
|
||||
if ( len ) {
|
||||
|
||||
/* Use POST */
|
||||
method = &http_post;
|
||||
type = "application/x-www-form-urlencoded";
|
||||
|
||||
/* Allocate temporary parameter list */
|
||||
/* Allocate temporary form parameter list */
|
||||
data = zalloc ( len + 1 /* NUL */ );
|
||||
if ( ! data ) {
|
||||
rc = -ENOMEM;
|
||||
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 );
|
||||
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user