iPXE
Macros | Functions | Variables
httpcore.c File Reference

Hyper Text Transfer Protocol (HTTP) core functionality. More...

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <byteswap.h>
#include <errno.h>
#include <ctype.h>
#include <assert.h>
#include <ipxe/uri.h>
#include <ipxe/refcnt.h>
#include <ipxe/iobuf.h>
#include <ipxe/xfer.h>
#include <ipxe/open.h>
#include <ipxe/process.h>
#include <ipxe/retry.h>
#include <ipxe/timer.h>
#include <ipxe/linebuf.h>
#include <ipxe/xferbuf.h>
#include <ipxe/blockdev.h>
#include <ipxe/acpi.h>
#include <ipxe/version.h>
#include <ipxe/params.h>
#include <ipxe/profile.h>
#include <ipxe/vsprintf.h>
#include <ipxe/errortab.h>
#include <ipxe/efi/efi_path.h>
#include <ipxe/http.h>

Go to the source code of this file.

Macros

#define EACCES_401   __einfo_error ( EINFO_EACCES_401 )
 
#define EINFO_EACCES_401   __einfo_uniqify ( EINFO_EACCES, 0x01, "HTTP 401 Unauthorized" )
 
#define EINVAL_STATUS   __einfo_error ( EINFO_EINVAL_STATUS )
 
#define EINFO_EINVAL_STATUS   __einfo_uniqify ( EINFO_EINVAL, 0x01, "Invalid status line" )
 
#define EINVAL_HEADER   __einfo_error ( EINFO_EINVAL_HEADER )
 
#define EINFO_EINVAL_HEADER   __einfo_uniqify ( EINFO_EINVAL, 0x02, "Invalid header" )
 
#define EINVAL_CONTENT_LENGTH   __einfo_error ( EINFO_EINVAL_CONTENT_LENGTH )
 
#define EINFO_EINVAL_CONTENT_LENGTH   __einfo_uniqify ( EINFO_EINVAL, 0x03, "Invalid content length" )
 
#define EINVAL_CHUNK_LENGTH   __einfo_error ( EINFO_EINVAL_CHUNK_LENGTH )
 
#define EINFO_EINVAL_CHUNK_LENGTH   __einfo_uniqify ( EINFO_EINVAL, 0x04, "Invalid chunk length" )
 
#define EIO_OTHER   __einfo_error ( EINFO_EIO_OTHER )
 
#define EINFO_EIO_OTHER   __einfo_uniqify ( EINFO_EIO, 0x01, "Unrecognised HTTP response code" )
 
#define EIO_CONTENT_LENGTH   __einfo_error ( EINFO_EIO_CONTENT_LENGTH )
 
#define EINFO_EIO_CONTENT_LENGTH   __einfo_uniqify ( EINFO_EIO, 0x02, "Content length mismatch" )
 
#define EIO_4XX   __einfo_error ( EINFO_EIO_4XX )
 
#define EINFO_EIO_4XX   __einfo_uniqify ( EINFO_EIO, 0x04, "HTTP 4xx Client Error" )
 
#define EIO_5XX   __einfo_error ( EINFO_EIO_5XX )
 
#define EINFO_EIO_5XX   __einfo_uniqify ( EINFO_EIO, 0x05, "HTTP 5xx Server Error" )
 
#define ENOENT_404   __einfo_error ( EINFO_ENOENT_404 )
 
#define EINFO_ENOENT_404   __einfo_uniqify ( EINFO_ENOENT, 0x01, "Not found" )
 
#define ENOTSUP_CONNECTION   __einfo_error ( EINFO_ENOTSUP_CONNECTION )
 
#define EINFO_ENOTSUP_CONNECTION   __einfo_uniqify ( EINFO_ENOTSUP, 0x01, "Unsupported connection header" )
 
#define ENOTSUP_TRANSFER   __einfo_error ( EINFO_ENOTSUP_TRANSFER )
 
#define EINFO_ENOTSUP_TRANSFER   __einfo_uniqify ( EINFO_ENOTSUP, 0x02, "Unsupported transfer encoding" )
 
#define EPERM_403   __einfo_error ( EINFO_EPERM_403 )
 
#define EINFO_EPERM_403   __einfo_uniqify ( EINFO_EPERM, 0x01, "HTTP 403 Forbidden" )
 
#define EPROTO_UNSOLICITED   __einfo_error ( EINFO_EPROTO_UNSOLICITED )
 
#define EINFO_EPROTO_UNSOLICITED   __einfo_uniqify ( EINFO_EPROTO, 0x01, "Unsolicited data" )
 
#define HTTP_RETRY_SECONDS   5
 Retry delay used when we cannot understand the Retry-After header. More...
 
#define HTTP_WATCHDOG_SECONDS   120
 Idle connection watchdog timeout. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int http_rx_linebuf (struct http_transaction *http, struct io_buffer *iobuf, struct line_buffer *linebuf)
 Handle received HTTP line-buffered data. More...
 
char * http_token (char **line, char **value)
 Get HTTP response token. More...
 
static void http_free (struct refcnt *refcnt)
 Free HTTP transaction. More...
 
static void http_close (struct http_transaction *http, int rc)
 Close HTTP transaction. More...
 
static void http_close_error (struct http_transaction *http, int rc)
 Close HTTP transaction with error (even if none specified) More...
 
static void http_watchdog (struct http_transaction *http)
 Hold off HTTP idle connection watchdog timer. More...
 
static void http_reopen (struct http_transaction *http)
 Reopen stale HTTP connection. More...
 
static void http_retry_expired (struct retry_timer *retry, int over __unused)
 Handle connection retry timer expiry. More...
 
static void http_watchdog_expired (struct retry_timer *watchdog, int over __unused)
 Handle idle connection watchdog timer expiry. More...
 
static void http_step (struct http_transaction *http)
 HTTP transmit process. More...
 
static int http_conn_deliver (struct http_transaction *http, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
 Handle received HTTP data. More...
 
static void http_conn_close (struct http_transaction *http, int rc)
 Handle server connection close. More...
 
static int http_content_deliver (struct http_transaction *http, struct io_buffer *iobuf, struct xfer_metadata *meta)
 Handle received content-decoded data. More...
 
static struct xfer_bufferhttp_content_buffer (struct http_transaction *http)
 Get underlying data transfer buffer. More...
 
__weak int http_block_read (struct http_transaction *http __unused, struct interface *data __unused, uint64_t lba __unused, unsigned int count __unused, void *buffer __unused, size_t len __unused)
 Read from block device (when HTTP block device support is not present) More...
 
__weak int http_block_read_capacity (struct http_transaction *http __unused, struct interface *data __unused)
 Read block device capacity (when HTTP block device support is not present) More...
 
static EFI_DEVICE_PATH_PROTOCOLhttp_efi_describe (struct http_transaction *http)
 Describe as an EFI device path. More...
 
int http_open (struct interface *xfer, struct http_method *method, struct uri *uri, struct http_request_range *range, struct http_request_content *content)
 Open HTTP transaction. More...
 
static int http_redirect (struct http_transaction *http, const char *location)
 Redirect HTTP transaction. More...
 
static int http_transfer_complete (struct http_transaction *http)
 Handle successful transfer completion. More...
 
static int http_format_headers (struct http_transaction *http, char *buf, size_t len)
 Construct HTTP request headers. More...
 
static int http_format_host (struct http_transaction *http, char *buf, size_t len)
 Construct HTTP "Host" header. More...
 
static int http_format_user_agent (struct http_transaction *http __unused, char *buf, size_t len)
 Construct HTTP "User-Agent" header. More...
 
static int http_format_connection (struct http_transaction *http __unused, char *buf, size_t len)
 Construct HTTP "Connection" header. More...
 
static int http_format_range (struct http_transaction *http, char *buf, size_t len)
 Construct HTTP "Range" header. More...
 
static int http_format_content_type (struct http_transaction *http, char *buf, size_t len)
 Construct HTTP "Content-Type" header. More...
 
static int http_format_content_length (struct http_transaction *http, char *buf, size_t len)
 Construct HTTP "Content-Length" header. More...
 
static int http_format_accept_encoding (struct http_transaction *http, char *buf, size_t len)
 Construct HTTP "Accept-Encoding" header. More...
 
static int http_tx_request (struct http_transaction *http)
 Transmit request. More...
 
static int http_parse_status (struct http_transaction *http, char *line)
 Parse HTTP status line. More...
 
static int http_parse_header (struct http_transaction *http, char *line)
 Parse HTTP header. More...
 
static int http_parse_headers (struct http_transaction *http)
 Parse HTTP response headers. More...
 
static int http_parse_location (struct http_transaction *http, char *line)
 Parse HTTP "Location" header. More...
 
static int http_parse_transfer_encoding (struct http_transaction *http, char *line)
 Parse HTTP "Transfer-Encoding" header. More...
 
static int http_parse_connection (struct http_transaction *http, char *line)
 Parse HTTP "Connection" header. More...
 
static int http_parse_content_length (struct http_transaction *http, char *line)
 Parse HTTP "Content-Length" header. More...
 
static int http_parse_content_encoding (struct http_transaction *http, char *line)
 Parse HTTP "Content-Encoding" header. More...
 
static int http_parse_retry_after (struct http_transaction *http, char *line)
 Parse HTTP "Retry-After" header. More...
 
static int http_rx_headers (struct http_transaction *http, struct io_buffer **iobuf)
 Handle received HTTP headers. More...
 
static int http_init_transfer_identity (struct http_transaction *http)
 Initialise transfer encoding. More...
 
static int http_rx_transfer_identity (struct http_transaction *http, struct io_buffer **iobuf)
 Handle received data. More...
 
static void http_close_transfer_identity (struct http_transaction *http, int rc)
 Handle server connection close. More...
 
static int http_init_transfer_chunked (struct http_transaction *http)
 Initialise transfer encoding. More...
 
static int http_rx_chunk_len (struct http_transaction *http, struct io_buffer **iobuf)
 Handle received chunk length. More...
 
static int http_rx_chunk_data (struct http_transaction *http, struct io_buffer **iobuf)
 Handle received chunk data. More...
 
static int http_rx_transfer_chunked (struct http_transaction *http, struct io_buffer **iobuf)
 Handle received chunked data. More...
 
static int http_rx_trailers (struct http_transaction *http, struct io_buffer **iobuf)
 Handle received HTTP trailer. More...
 
static size_t http_form_params (struct parameters *params, char *buf, size_t len)
 Construct HTTP form parameter list. More...
 
int http_open_uri (struct interface *xfer, struct uri *uri)
 Open HTTP transaction for simple URI. More...
 
 REQUIRING_SYMBOL (http_open)
 
 REQUIRE_OBJECT (config_http)
 

Variables

static struct profiler http_rx_profiler __profiler = { .name = "http.rx" }
 Receive profiler. More...
 
struct errortab http_errors [] __errortab
 Human-readable error messages. More...
 
static struct http_state http_request
 HTTP request state. More...
 
static struct http_state http_headers
 HTTP response headers state. More...
 
static struct http_state http_trailers
 HTTP response trailers state. More...
 
static struct http_transfer_encoding http_transfer_identity
 Identity transfer encoding. More...
 
struct http_method http_head
 HTTP HEAD method. More...
 
struct http_method http_get
 HTTP GET method. More...
 
struct http_method http_post
 HTTP POST method. More...
 
static struct interface_operation http_xfer_operations []
 HTTP data transfer interface operations. More...
 
static struct interface_descriptor http_xfer_desc
 HTTP data transfer interface descriptor. More...
 
static struct interface_operation http_content_operations []
 HTTP content-decoded interface operations. More...
 
static struct interface_descriptor http_content_desc
 HTTP content-decoded interface descriptor. More...
 
static struct interface_operation http_transfer_operations []
 HTTP transfer-decoded interface operations. More...
 
static struct interface_descriptor http_transfer_desc
 HTTP transfer-decoded interface descriptor. More...
 
static struct interface_operation http_conn_operations []
 HTTP server connection interface operations. More...
 
static struct interface_descriptor http_conn_desc
 HTTP server connection interface descriptor. More...
 
static struct process_descriptor http_process_desc
 HTTP process descriptor. More...
 
struct http_request_header http_request_host __http_request_header
 HTTP "Host" header ". More...
 
struct http_response_header http_response_location __http_response_header
 HTTP "Location" header. More...
 
struct http_transfer_encoding http_transfer_chunked __http_transfer_encoding
 Chunked transfer encoding. More...
 

Detailed Description

Hyper Text Transfer Protocol (HTTP) core functionality.

Definition in file httpcore.c.

Macro Definition Documentation

◆ EACCES_401

#define EACCES_401   __einfo_error ( EINFO_EACCES_401 )

Definition at line 63 of file httpcore.c.

◆ EINFO_EACCES_401

#define EINFO_EACCES_401   __einfo_uniqify ( EINFO_EACCES, 0x01, "HTTP 401 Unauthorized" )

Definition at line 64 of file httpcore.c.

◆ EINVAL_STATUS

#define EINVAL_STATUS   __einfo_error ( EINFO_EINVAL_STATUS )

Definition at line 66 of file httpcore.c.

◆ EINFO_EINVAL_STATUS

#define EINFO_EINVAL_STATUS   __einfo_uniqify ( EINFO_EINVAL, 0x01, "Invalid status line" )

Definition at line 67 of file httpcore.c.

◆ EINVAL_HEADER

#define EINVAL_HEADER   __einfo_error ( EINFO_EINVAL_HEADER )

Definition at line 69 of file httpcore.c.

◆ EINFO_EINVAL_HEADER

#define EINFO_EINVAL_HEADER   __einfo_uniqify ( EINFO_EINVAL, 0x02, "Invalid header" )

Definition at line 70 of file httpcore.c.

◆ EINVAL_CONTENT_LENGTH

#define EINVAL_CONTENT_LENGTH   __einfo_error ( EINFO_EINVAL_CONTENT_LENGTH )

Definition at line 72 of file httpcore.c.

◆ EINFO_EINVAL_CONTENT_LENGTH

#define EINFO_EINVAL_CONTENT_LENGTH   __einfo_uniqify ( EINFO_EINVAL, 0x03, "Invalid content length" )

Definition at line 73 of file httpcore.c.

◆ EINVAL_CHUNK_LENGTH

#define EINVAL_CHUNK_LENGTH   __einfo_error ( EINFO_EINVAL_CHUNK_LENGTH )

Definition at line 75 of file httpcore.c.

◆ EINFO_EINVAL_CHUNK_LENGTH

#define EINFO_EINVAL_CHUNK_LENGTH   __einfo_uniqify ( EINFO_EINVAL, 0x04, "Invalid chunk length" )

Definition at line 76 of file httpcore.c.

◆ EIO_OTHER

#define EIO_OTHER   __einfo_error ( EINFO_EIO_OTHER )

Definition at line 78 of file httpcore.c.

◆ EINFO_EIO_OTHER

#define EINFO_EIO_OTHER   __einfo_uniqify ( EINFO_EIO, 0x01, "Unrecognised HTTP response code" )

Definition at line 79 of file httpcore.c.

◆ EIO_CONTENT_LENGTH

#define EIO_CONTENT_LENGTH   __einfo_error ( EINFO_EIO_CONTENT_LENGTH )

Definition at line 81 of file httpcore.c.

◆ EINFO_EIO_CONTENT_LENGTH

#define EINFO_EIO_CONTENT_LENGTH   __einfo_uniqify ( EINFO_EIO, 0x02, "Content length mismatch" )

Definition at line 82 of file httpcore.c.

◆ EIO_4XX

#define EIO_4XX   __einfo_error ( EINFO_EIO_4XX )

Definition at line 84 of file httpcore.c.

◆ EINFO_EIO_4XX

#define EINFO_EIO_4XX   __einfo_uniqify ( EINFO_EIO, 0x04, "HTTP 4xx Client Error" )

Definition at line 85 of file httpcore.c.

◆ EIO_5XX

#define EIO_5XX   __einfo_error ( EINFO_EIO_5XX )

Definition at line 87 of file httpcore.c.

◆ EINFO_EIO_5XX

#define EINFO_EIO_5XX   __einfo_uniqify ( EINFO_EIO, 0x05, "HTTP 5xx Server Error" )

Definition at line 88 of file httpcore.c.

◆ ENOENT_404

#define ENOENT_404   __einfo_error ( EINFO_ENOENT_404 )

Definition at line 90 of file httpcore.c.

◆ EINFO_ENOENT_404

#define EINFO_ENOENT_404   __einfo_uniqify ( EINFO_ENOENT, 0x01, "Not found" )

Definition at line 91 of file httpcore.c.

◆ ENOTSUP_CONNECTION

#define ENOTSUP_CONNECTION   __einfo_error ( EINFO_ENOTSUP_CONNECTION )

Definition at line 93 of file httpcore.c.

◆ EINFO_ENOTSUP_CONNECTION

#define EINFO_ENOTSUP_CONNECTION   __einfo_uniqify ( EINFO_ENOTSUP, 0x01, "Unsupported connection header" )

Definition at line 94 of file httpcore.c.

◆ ENOTSUP_TRANSFER

#define ENOTSUP_TRANSFER   __einfo_error ( EINFO_ENOTSUP_TRANSFER )

Definition at line 96 of file httpcore.c.

◆ EINFO_ENOTSUP_TRANSFER

#define EINFO_ENOTSUP_TRANSFER   __einfo_uniqify ( EINFO_ENOTSUP, 0x02, "Unsupported transfer encoding" )

Definition at line 97 of file httpcore.c.

◆ EPERM_403

#define EPERM_403   __einfo_error ( EINFO_EPERM_403 )

Definition at line 99 of file httpcore.c.

◆ EINFO_EPERM_403

#define EINFO_EPERM_403   __einfo_uniqify ( EINFO_EPERM, 0x01, "HTTP 403 Forbidden" )

Definition at line 100 of file httpcore.c.

◆ EPROTO_UNSOLICITED

#define EPROTO_UNSOLICITED   __einfo_error ( EINFO_EPROTO_UNSOLICITED )

Definition at line 102 of file httpcore.c.

◆ EINFO_EPROTO_UNSOLICITED

#define EINFO_EPROTO_UNSOLICITED   __einfo_uniqify ( EINFO_EPROTO, 0x01, "Unsolicited data" )

Definition at line 103 of file httpcore.c.

◆ HTTP_RETRY_SECONDS

#define HTTP_RETRY_SECONDS   5

Retry delay used when we cannot understand the Retry-After header.

Definition at line 107 of file httpcore.c.

◆ HTTP_WATCHDOG_SECONDS

#define HTTP_WATCHDOG_SECONDS   120

Idle connection watchdog timeout.

Definition at line 110 of file httpcore.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ http_rx_linebuf()

static int http_rx_linebuf ( struct http_transaction http,
struct io_buffer iobuf,
struct line_buffer linebuf 
)
static

Handle received HTTP line-buffered data.

Parameters
httpHTTP transaction
iobufI/O buffer
linebufLine buffer
Return values
rcReturn status code

Definition at line 167 of file httpcore.c.

169  {
170  int consumed;
171  int rc;
172 
173  /* Buffer received line */
174  consumed = line_buffer ( linebuf, iobuf->data, iob_len ( iobuf ) );
175  if ( consumed < 0 ) {
176  rc = consumed;
177  DBGC ( http, "HTTP %p could not buffer line: %s\n",
178  http, strerror ( rc ) );
179  return rc;
180  }
181 
182  /* Consume line */
183  iob_pull ( iobuf, consumed );
184 
185  return 0;
186 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:106
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
void * data
Start of data.
Definition: iobuf.h:52
int line_buffer(struct line_buffer *linebuf, const char *data, size_t len)
Buffer up received data by lines.
Definition: linebuf.c:91

References io_buffer::data, DBGC, iob_len(), iob_pull, line_buffer(), rc, and strerror().

Referenced by http_rx_chunk_len(), http_rx_headers(), and http_rx_trailers().

◆ http_token()

char* http_token ( char **  line,
char **  value 
)

Get HTTP response token.

Parameters
lineLine position
valueToken value to fill in (if any)
Return values
tokenToken, or NULL

Definition at line 195 of file httpcore.c.

195  {
196  char *token;
197  char quote = '\0';
198  char c;
199 
200  /* Avoid returning uninitialised data */
201  if ( value )
202  *value = NULL;
203 
204  /* Skip any initial whitespace or commas */
205  while ( ( isspace ( **line ) ) || ( **line == ',' ) )
206  (*line)++;
207 
208  /* Check for end of line and record token position */
209  if ( ! **line )
210  return NULL;
211  token = *line;
212 
213  /* Scan for end of token */
214  while ( ( c = **line ) ) {
215 
216  /* Terminate if we hit an unquoted whitespace or comma */
217  if ( ( isspace ( c ) || ( c == ',' ) ) && ! quote )
218  break;
219 
220  /* Terminate if we hit a closing quote */
221  if ( c == quote )
222  break;
223 
224  /* Check for value separator */
225  if ( value && ( ! *value ) && ( c == '=' ) ) {
226 
227  /* Terminate key portion of token */
228  *((*line)++) = '\0';
229 
230  /* Check for quote character */
231  c = **line;
232  if ( ( c == '"' ) || ( c == '\'' ) ) {
233  quote = c;
234  (*line)++;
235  }
236 
237  /* Record value portion of token */
238  *value = *line;
239 
240  } else {
241 
242  /* Move to next character */
243  (*line)++;
244  }
245  }
246 
247  /* Terminate token, if applicable */
248  if ( c )
249  *((*line)++) = '\0';
250 
251  return token;
252 }
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
int isspace(int character)
Check to see if character is a space.
Definition: ctype.c:41
u8 token
Definition: CIB_PRM.h:42
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References isspace(), NULL, token, and value.

Referenced by http_parse_connection(), http_parse_digest_auth(), http_parse_status(), and http_parse_www_authenticate().

◆ http_free()

static void http_free ( struct refcnt refcnt)
static

Free HTTP transaction.

Parameters
refcntReference count

Definition at line 266 of file httpcore.c.

266  {
267  struct http_transaction *http =
269 
271  empty_line_buffer ( &http->linebuf );
272  uri_put ( http->uri );
273  free ( http );
274 }
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
struct line_buffer linebuf
Temporary line buffer.
Definition: http.h:440
struct uri * uri
Request URI.
Definition: http.h:434
A reference counter.
Definition: refcnt.h:26
struct http_response response
Response.
Definition: http.h:438
An HTTP transaction.
Definition: http.h:415
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
void empty_line_buffer(struct line_buffer *linebuf)
Discard line buffer contents.
Definition: linebuf.c:65
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
struct line_buffer headers
Raw response header lines.
Definition: http.h:327

References container_of, empty_line_buffer(), free, http_response::headers, http_transaction::linebuf, http_transaction::response, http_transaction::uri, and uri_put().

Referenced by http_open().

◆ http_close()

static void http_close ( struct http_transaction http,
int  rc 
)
static

Close HTTP transaction.

Parameters
httpHTTP transaction
rcReason for close

Definition at line 282 of file httpcore.c.

282  {
283 
284  /* Stop process */
285  process_del ( &http->process );
286 
287  /* Stop timers */
288  stop_timer ( &http->retry );
289  stop_timer ( &http->watchdog );
290 
291  /* Close all interfaces */
292  intfs_shutdown ( rc, &http->conn, &http->transfer, &http->content,
293  &http->xfer, NULL );
294 }
struct interface xfer
Data transfer interface.
Definition: http.h:419
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct interface conn
Server connection.
Definition: http.h:425
void intfs_shutdown(int rc,...)
Shut down multiple object interfaces.
Definition: interface.c:326
void process_del(struct process *process)
Remove process from process list.
Definition: process.c:79
struct interface content
Content-decoded interface.
Definition: http.h:421
struct process process
Transmit process.
Definition: http.h:427
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct retry_timer retry
Reconnection timer.
Definition: http.h:429
struct retry_timer watchdog
Idle connection watchdog timer.
Definition: http.h:431

References http_transaction::conn, http_transaction::content, intfs_shutdown(), NULL, http_transaction::process, process_del(), rc, http_transaction::retry, stop_timer(), http_transaction::transfer, http_transaction::watchdog, and http_transaction::xfer.

Referenced by http_close_error(), http_close_transfer_identity(), http_conn_deliver(), http_open(), http_reopen(), http_step(), http_transfer_complete(), and http_watchdog_expired().

◆ http_close_error()

static void http_close_error ( struct http_transaction http,
int  rc 
)
static

Close HTTP transaction with error (even if none specified)

Parameters
httpHTTP transaction
rcReason for close

Definition at line 302 of file httpcore.c.

302  {
303 
304  /* Treat any close as an error */
305  http_close ( http, ( rc ? rc : -EPIPE ) );
306 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
#define EPIPE
Broken pipe.
Definition: errno.h:619

References EPIPE, http_close(), and rc.

◆ http_watchdog()

static void http_watchdog ( struct http_transaction http)
inlinestatic

Hold off HTTP idle connection watchdog timer.

Parameters
httpHTTP transaction

Definition at line 313 of file httpcore.c.

313  {
314 
315  /* (Re)start watchdog timer */
316  start_timer_fixed ( &http->watchdog,
318 }
#define TICKS_PER_SEC
Number of ticks per second.
Definition: timer.h:15
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:64
#define HTTP_WATCHDOG_SECONDS
Idle connection watchdog timeout.
Definition: httpcore.c:110
struct retry_timer watchdog
Idle connection watchdog timer.
Definition: http.h:431

References HTTP_WATCHDOG_SECONDS, start_timer_fixed(), TICKS_PER_SEC, and http_transaction::watchdog.

Referenced by http_content_deliver(), http_open(), and http_reopen().

◆ http_reopen()

static void http_reopen ( struct http_transaction http)
static

Reopen stale HTTP connection.

Parameters
httpHTTP transaction

Definition at line 325 of file httpcore.c.

325  {
326  int rc;
327 
328  /* Close existing connection */
329  intf_restart ( &http->conn, -ECANCELED );
330 
331  /* Reopen connection */
332  if ( ( rc = http_connect ( &http->conn, http->uri ) ) != 0 ) {
333  DBGC ( http, "HTTP %p could not reconnect: %s\n",
334  http, strerror ( rc ) );
335  goto err_connect;
336  }
337 
338  /* Reset state */
339  http->state = &http_request;
340 
341  /* Restart idle connection watchdog timer */
342  http_watchdog ( http );
343 
344  /* Reschedule transmission process */
345  process_add ( &http->process );
346 
347  return;
348 
349  err_connect:
350  http_close ( http, rc );
351 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:343
struct interface conn
Server connection.
Definition: http.h:425
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
#define DBGC(...)
Definition: compiler.h:505
struct uri * uri
Request URI.
Definition: http.h:434
struct http_state * state
Transaction state.
Definition: http.h:443
#define ECANCELED
Operation canceled.
Definition: errno.h:343
static void http_watchdog(struct http_transaction *http)
Hold off HTTP idle connection watchdog timer.
Definition: httpcore.c:313
int http_connect(struct interface *xfer, struct uri *uri)
Connect to an HTTP server.
Definition: httpconn.c:236
void process_add(struct process *process)
Add process to process list.
Definition: process.c:59
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
struct process process
Transmit process.
Definition: http.h:427
static struct http_state http_request
HTTP request state.
Definition: httpcore.c:125

References http_transaction::conn, DBGC, ECANCELED, http_close(), http_connect(), http_request, http_watchdog(), intf_restart(), http_transaction::process, process_add(), rc, http_transaction::state, strerror(), and http_transaction::uri.

Referenced by http_retry_expired(), and http_transfer_complete().

◆ http_retry_expired()

static void http_retry_expired ( struct retry_timer retry,
int over  __unused 
)
static

Handle connection retry timer expiry.

Parameters
retryRetry timer
overFailure indicator

Definition at line 359 of file httpcore.c.

360  {
361  struct http_transaction *http =
363 
364  /* Reopen connection */
365  http_reopen ( http );
366 }
An HTTP transaction.
Definition: http.h:415
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
static void http_reopen(struct http_transaction *http)
Reopen stale HTTP connection.
Definition: httpcore.c:325
struct retry_timer retry
Reconnection timer.
Definition: http.h:429

References container_of, http_reopen(), and http_transaction::retry.

Referenced by http_open().

◆ http_watchdog_expired()

static void http_watchdog_expired ( struct retry_timer watchdog,
int over  __unused 
)
static

Handle idle connection watchdog timer expiry.

Parameters
watchdogIdle connection watchdog timer
overFailure indicator

Definition at line 374 of file httpcore.c.

375  {
376  struct http_transaction *http =
378 
379  /* Abort connection */
380  DBGC ( http, "HTTP %p aborting idle connection\n", http );
381  http_close ( http, -ETIMEDOUT );
382 }
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
#define DBGC(...)
Definition: compiler.h:505
An HTTP transaction.
Definition: http.h:415
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
struct retry_timer watchdog
Idle connection watchdog timer.
Definition: http.h:431

References container_of, DBGC, ETIMEDOUT, http_close(), and http_transaction::watchdog.

Referenced by http_open().

◆ http_step()

static void http_step ( struct http_transaction http)
static

HTTP transmit process.

Parameters
httpHTTP transaction

Definition at line 389 of file httpcore.c.

389  {
390  int rc;
391 
392  /* Do nothing if we have nothing to transmit */
393  if ( ! http->state->tx )
394  return;
395 
396  /* Do nothing until connection is ready */
397  if ( ! xfer_window ( &http->conn ) )
398  return;
399 
400  /* Notify data transfer interface that window may have changed */
401  xfer_window_changed ( &http->xfer );
402 
403  /* Do nothing until data transfer interface is ready */
404  if ( ! xfer_window ( &http->xfer ) )
405  return;
406 
407  /* Transmit data */
408  if ( ( rc = http->state->tx ( http ) ) != 0 )
409  goto err;
410 
411  return;
412 
413  err:
414  http_close ( http, rc );
415 }
struct interface xfer
Data transfer interface.
Definition: http.h:419
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition: xfer.c:146
struct interface conn
Server connection.
Definition: http.h:425
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
int(* tx)(struct http_transaction *http)
Transmit data.
Definition: http.h:397
struct http_state * state
Transaction state.
Definition: http.h:443
size_t xfer_window(struct interface *intf)
Check flow control window.
Definition: xfer.c:116

References http_transaction::conn, http_close(), rc, http_transaction::state, http_state::tx, http_transaction::xfer, xfer_window(), and xfer_window_changed().

◆ http_conn_deliver()

static int http_conn_deliver ( struct http_transaction http,
struct io_buffer iobuf,
struct xfer_metadata *meta  __unused 
)
static

Handle received HTTP data.

Parameters
httpHTTP transaction
iobufI/O buffer
metaTransfer metadata
Return values
rcReturn status code

This function takes ownership of the I/O buffer.

Definition at line 427 of file httpcore.c.

429  {
430  int rc;
431 
432  /* Handle received data */
433  profile_start ( &http_rx_profiler );
434  while ( iobuf && iob_len ( iobuf ) ) {
435 
436  /* Sanity check */
437  if ( ( ! http->state ) || ( ! http->state->rx ) ) {
438  DBGC ( http, "HTTP %p unexpected data\n", http );
440  goto err;
441  }
442 
443  /* Receive (some) data */
444  if ( ( rc = http->state->rx ( http, &iobuf ) ) != 0 )
445  goto err;
446  }
447 
448  /* Free I/O buffer, if applicable */
449  free_iob ( iobuf );
450 
451  profile_stop ( &http_rx_profiler );
452  return 0;
453 
454  err:
455  free_iob ( iobuf );
456  http_close ( http, rc );
457  return rc;
458 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
#define DBGC(...)
Definition: compiler.h:505
struct http_state * state
Transaction state.
Definition: http.h:443
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:173
int(* rx)(struct http_transaction *http, struct io_buffer **iobuf)
Receive data.
Definition: http.h:404
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:160
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
#define EPROTO_UNSOLICITED
Definition: httpcore.c:102

References DBGC, EPROTO_UNSOLICITED, free_iob(), http_close(), iob_len(), profile_start(), profile_stop(), rc, http_state::rx, and http_transaction::state.

◆ http_conn_close()

static void http_conn_close ( struct http_transaction http,
int  rc 
)
static

Handle server connection close.

Parameters
httpHTTP transaction
rcReason for close

Definition at line 466 of file httpcore.c.

466  {
467 
468  /* Sanity checks */
469  assert ( http->state != NULL );
470  assert ( http->state->close != NULL );
471 
472  /* Restart server connection interface */
473  intf_restart ( &http->conn, rc );
474 
475  /* Hand off to state-specific method */
476  http->state->close ( http, rc );
477 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:343
void(* close)(struct http_transaction *http, int rc)
Server connection closed.
Definition: http.h:411
struct interface conn
Server connection.
Definition: http.h:425
struct http_state * state
Transaction state.
Definition: http.h:443
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References assert(), http_state::close, http_transaction::conn, intf_restart(), NULL, rc, and http_transaction::state.

◆ http_content_deliver()

static int http_content_deliver ( struct http_transaction http,
struct io_buffer iobuf,
struct xfer_metadata meta 
)
static

Handle received content-decoded data.

Parameters
httpHTTP transaction
iobufI/O buffer
metaData transfer metadata

Definition at line 486 of file httpcore.c.

488  {
489  int rc;
490 
491  /* Ignore content if this is anything other than a successful
492  * transfer.
493  */
494  if ( http->response.rc != 0 ) {
495  free_iob ( iobuf );
496  return 0;
497  }
498 
499  /* Hold off idle connection watchdog timer */
500  http_watchdog ( http );
501 
502  /* Deliver to data transfer interface */
503  profile_start ( &http_xfer_profiler );
504  if ( ( rc = xfer_deliver ( &http->xfer, iob_disown ( iobuf ),
505  meta ) ) != 0 )
506  return rc;
507  profile_stop ( &http_xfer_profiler );
508 
509  return 0;
510 }
struct interface xfer
Data transfer interface.
Definition: http.h:419
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:173
static void http_watchdog(struct http_transaction *http)
Hold off HTTP idle connection watchdog timer.
Definition: httpcore.c:313
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:216
struct http_response response
Response.
Definition: http.h:438
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:160
int rc
Return status code.
Definition: http.h:338
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194
uint8_t meta
Metadata flags.
Definition: ena.h:14

References free_iob(), http_watchdog(), iob_disown, meta, profile_start(), profile_stop(), http_response::rc, rc, http_transaction::response, http_transaction::xfer, and xfer_deliver().

◆ http_content_buffer()

static struct xfer_buffer* http_content_buffer ( struct http_transaction http)
static

Get underlying data transfer buffer.

Parameters
httpHTTP transaction
Return values
xferbufData transfer buffer, or NULL on error

Definition at line 519 of file httpcore.c.

519  {
520 
521  /* Deny access to the data transfer buffer if this is anything
522  * other than a successful transfer.
523  */
524  if ( http->response.rc != 0 )
525  return NULL;
526 
527  /* Hand off to data transfer interface */
528  return xfer_buffer ( &http->xfer );
529 }
struct interface xfer
Data transfer interface.
Definition: http.h:419
struct http_response response
Response.
Definition: http.h:438
int rc
Return status code.
Definition: http.h:338
struct xfer_buffer * xfer_buffer(struct interface *intf)
Get underlying data transfer buffer.
Definition: xferbuf.c:305
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References NULL, http_response::rc, http_transaction::response, http_transaction::xfer, and xfer_buffer().

◆ http_block_read()

__weak int http_block_read ( struct http_transaction *http  __unused,
struct interface *data  __unused,
uint64_t lba  __unused,
unsigned int count  __unused,
void *buffer  __unused,
size_t len  __unused 
)

Read from block device (when HTTP block device support is not present)

Parameters
httpHTTP transaction
dataData interface
lbaStarting logical block address
countNumber of logical blocks
bufferData buffer
lenLength of data buffer
Return values
rcReturn status code

Definition at line 542 of file httpcore.c.

545  {
546 
547  return -ENOTSUP;
548 }
#define ENOTSUP
Operation not supported.
Definition: errno.h:589

References ENOTSUP.

◆ http_block_read_capacity()

__weak int http_block_read_capacity ( struct http_transaction *http  __unused,
struct interface *data  __unused 
)

Read block device capacity (when HTTP block device support is not present)

Parameters
controlControl interface
dataData interface
Return values
rcReturn status code

Definition at line 557 of file httpcore.c.

558  {
559 
560  return -ENOTSUP;
561 }
#define ENOTSUP
Operation not supported.
Definition: errno.h:589

References ENOTSUP.

◆ http_efi_describe()

static EFI_DEVICE_PATH_PROTOCOL* http_efi_describe ( struct http_transaction http)
static

Describe as an EFI device path.

Parameters
httpHTTP transaction
Return values
pathEFI device path, or NULL on error

Definition at line 570 of file httpcore.c.

570  {
571 
572  return efi_uri_path ( http->uri );
573 }
struct uri * uri
Request URI.
Definition: http.h:434
EFI_DEVICE_PATH_PROTOCOL * efi_uri_path(struct uri *uri)
Construct EFI device path for URI.
Definition: efi_path.c:468

References efi_uri_path(), and http_transaction::uri.

◆ http_open()

int http_open ( struct interface xfer,
struct http_method method,
struct uri uri,
struct http_request_range range,
struct http_request_content content 
)

Open HTTP transaction.

Parameters
xferData transfer interface
methodRequest method
uriRequest URI
rangeContent range (if any)
contentRequest content (if any)
Return values
rcReturn status code

Definition at line 641 of file httpcore.c.

643  {
644  struct http_transaction *http;
645  struct uri request_uri;
646  struct uri request_host;
647  size_t request_uri_len;
648  size_t request_host_len;
649  size_t content_len;
650  char *request_uri_string;
651  char *request_host_string;
652  void *content_data;
653  int rc;
654 
655  /* Calculate request URI length */
656  memset ( &request_uri, 0, sizeof ( request_uri ) );
657  request_uri.epath = ( uri->epath ? uri->epath : "/" );
658  request_uri.equery = uri->equery;
659  request_uri_len =
660  ( format_uri ( &request_uri, NULL, 0 ) + 1 /* NUL */);
661 
662  /* Calculate host name length */
663  memset ( &request_host, 0, sizeof ( request_host ) );
664  request_host.host = uri->host;
665  request_host.port = uri->port;
666  request_host_len =
667  ( format_uri ( &request_host, NULL, 0 ) + 1 /* NUL */ );
668 
669  /* Calculate request content length */
670  content_len = ( content ? content->len : 0 );
671 
672  /* Allocate and initialise structure */
673  http = zalloc ( sizeof ( *http ) + request_uri_len + request_host_len +
674  content_len );
675  if ( ! http ) {
676  rc = -ENOMEM;
677  goto err_alloc;
678  }
679  request_uri_string = ( ( ( void * ) http ) + sizeof ( *http ) );
680  request_host_string = ( request_uri_string + request_uri_len );
681  content_data = ( request_host_string + request_host_len );
682  format_uri ( &request_uri, request_uri_string, request_uri_len );
683  format_uri ( &request_host, request_host_string, request_host_len );
684  ref_init ( &http->refcnt, http_free );
685  intf_init ( &http->xfer, &http_xfer_desc, &http->refcnt );
686  intf_init ( &http->content, &http_content_desc, &http->refcnt );
687  intf_init ( &http->transfer, &http_transfer_desc, &http->refcnt );
688  intf_init ( &http->conn, &http_conn_desc, &http->refcnt );
689  intf_plug_plug ( &http->transfer, &http->content );
690  process_init ( &http->process, &http_process_desc, &http->refcnt );
691  timer_init ( &http->retry, http_retry_expired, &http->refcnt );
692  timer_init ( &http->watchdog, http_watchdog_expired, &http->refcnt );
693  http->uri = uri_get ( uri );
694  http->request.method = method;
695  http->request.uri = request_uri_string;
696  http->request.host = request_host_string;
697  if ( range ) {
698  memcpy ( &http->request.range, range,
699  sizeof ( http->request.range ) );
700  }
701  if ( content ) {
702  http->request.content.type = content->type;
703  http->request.content.data = content_data;
704  http->request.content.len = content_len;
705  memcpy ( content_data, content->data, content_len );
706  }
707  http->state = &http_request;
708  DBGC2 ( http, "HTTP %p %s://%s%s\n", http, http->uri->scheme,
709  http->request.host, http->request.uri );
710 
711  /* Open connection */
712  if ( ( rc = http_connect ( &http->conn, uri ) ) != 0 ) {
713  DBGC ( http, "HTTP %p could not connect: %s\n",
714  http, strerror ( rc ) );
715  goto err_connect;
716  }
717 
718  /* Start watchdog timer */
719  http_watchdog ( http );
720 
721  /* Attach to parent interface, mortalise self, and return */
722  intf_plug_plug ( &http->xfer, xfer );
723  ref_put ( &http->refcnt );
724  return 0;
725 
726  err_connect:
727  http_close ( http, rc );
728  ref_put ( &http->refcnt );
729  err_alloc:
730  return rc;
731 }
struct interface xfer
Data transfer interface.
Definition: http.h:419
const char * equery
Query (with original URI encoding)
Definition: uri.h:84
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void http_watchdog_expired(struct retry_timer *watchdog, int over __unused)
Handle idle connection watchdog timer expiry.
Definition: httpcore.c:374
struct pci_range range
PCI bus:dev.fn address range.
Definition: pcicloud.c:40
const char * host
Server host name.
Definition: http.h:216
static struct uri * uri_get(struct uri *uri)
Increment URI reference count.
Definition: uri.h:194
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
struct interface conn
Server connection.
Definition: http.h:425
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
static struct interface_descriptor http_transfer_desc
HTTP transfer-decoded interface descriptor.
Definition: httpcore.c:610
static void process_init(struct process *process, struct process_descriptor *desc, struct refcnt *refcnt)
Initialise process and add to process list.
Definition: process.h:161
static struct interface_descriptor http_content_desc
HTTP content-decoded interface descriptor.
Definition: httpcore.c:600
#define DBGC(...)
Definition: compiler.h:505
struct uri * uri
Request URI.
Definition: http.h:434
void intf_plug_plug(struct interface *a, struct interface *b)
Plug two object interfaces together.
Definition: interface.c:107
struct http_state * state
Transaction state.
Definition: http.h:443
uint8_t method
Definition: ib_mad.h:14
struct http_request_range range
Range descriptor.
Definition: http.h:218
struct http_request request
Request.
Definition: http.h:436
const char * port
Port number.
Definition: uri.h:78
static void http_watchdog(struct http_transaction *http)
Hold off HTTP idle connection watchdog timer.
Definition: httpcore.c:313
int http_connect(struct interface *xfer, struct uri *uri)
Connect to an HTTP server.
Definition: httpconn.c:236
#define ENOMEM
Not enough space.
Definition: errno.h:534
const char * scheme
Scheme.
Definition: uri.h:68
void * memcpy(void *dest, const void *src, size_t len) __nonnull
An HTTP transaction.
Definition: http.h:415
const char * uri
Request URI string.
Definition: http.h:214
size_t format_uri(const struct uri *uri, char *buf, size_t len)
Format URI.
Definition: uri.c:471
struct http_request_content content
Content descriptor.
Definition: http.h:220
static struct interface_descriptor http_conn_desc
HTTP server connection interface descriptor.
Definition: httpcore.c:623
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
struct interface content
Content-decoded interface.
Definition: http.h:421
struct process process
Transmit process.
Definition: http.h:427
static struct interface_descriptor http_xfer_desc
HTTP data transfer interface descriptor.
Definition: httpcore.c:587
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
const char * type
Content type (if any)
Definition: http.h:145
const char * host
Host name.
Definition: uri.h:76
const void * data
Content data (if any)
Definition: http.h:147
size_t len
Content length.
Definition: http.h:149
static struct process_descriptor http_process_desc
HTTP process descriptor.
Definition: httpcore.c:628
#define DBGC2(...)
Definition: compiler.h:522
struct refcnt refcnt
Reference count.
Definition: http.h:417
struct http_method * method
Method.
Definition: http.h:212
const char * epath
Path (with original URI encoding)
Definition: uri.h:82
A Uniform Resource Identifier.
Definition: uri.h:64
static void http_free(struct refcnt *refcnt)
Free HTTP transaction.
Definition: httpcore.c:266
static void http_retry_expired(struct retry_timer *retry, int over __unused)
Handle connection retry timer expiry.
Definition: httpcore.c:359
static struct http_state http_request
HTTP request state.
Definition: httpcore.c:125
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:203
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct retry_timer retry
Reconnection timer.
Definition: http.h:429
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
void * memset(void *dest, int character, size_t len) __nonnull
struct retry_timer watchdog
Idle connection watchdog timer.
Definition: http.h:431

References http_transaction::conn, http_request::content, http_transaction::content, http_request_content::data, DBGC, DBGC2, ENOMEM, uri::epath, uri::equery, format_uri(), uri::host, http_request::host, http_close(), http_conn_desc, http_connect(), http_content_desc, http_free(), http_process_desc, http_request, http_retry_expired(), http_transfer_desc, http_watchdog(), http_watchdog_expired(), http_xfer_desc, intf_init(), intf_plug_plug(), http_request_content::len, memcpy(), memset(), method, http_request::method, NULL, uri::port, http_transaction::process, process_init(), http_request::range, range, rc, ref_init, ref_put, http_transaction::refcnt, http_transaction::request, http_transaction::retry, uri::scheme, http_transaction::state, strerror(), http_transaction::transfer, http_request_content::type, http_request::uri, http_transaction::uri, uri_get(), http_transaction::watchdog, http_transaction::xfer, and zalloc().

Referenced by http_block_read(), http_block_read_capacity(), http_open_uri(), peerblk_raw_open(), and peerblk_retrieval_open().

◆ http_redirect()

static int http_redirect ( struct http_transaction http,
const char *  location 
)
static

Redirect HTTP transaction.

Parameters
httpHTTP transaction
locationNew location
Return values
rcReturn status code

Definition at line 740 of file httpcore.c.

741  {
742  struct uri *location_uri;
743  struct uri *resolved_uri;
744  int rc;
745 
746  DBGC2 ( http, "HTTP %p redirecting to \"%s\"\n", http, location );
747 
748  /* Parse location URI */
749  location_uri = parse_uri ( location );
750  if ( ! location_uri ) {
751  rc = -ENOMEM;
752  goto err_parse_uri;
753  }
754 
755  /* Resolve as relative to original URI */
756  resolved_uri = resolve_uri ( http->uri, location_uri );
757  if ( ! resolved_uri ) {
758  rc = -ENOMEM;
759  goto err_resolve_uri;
760  }
761 
762  /* Redirect to new URI */
763  if ( ( rc = xfer_redirect ( &http->xfer, LOCATION_URI,
764  resolved_uri ) ) != 0 ) {
765  DBGC ( http, "HTTP %p could not redirect: %s\n",
766  http, strerror ( rc ) );
767  goto err_redirect;
768  }
769 
770  err_redirect:
771  uri_put ( resolved_uri );
772  err_resolve_uri:
773  uri_put ( location_uri );
774  err_parse_uri:
775  return rc;
776 }
struct interface xfer
Data transfer interface.
Definition: http.h:419
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
#define DBGC(...)
Definition: compiler.h:505
struct uri * uri
Request URI.
Definition: http.h:434
#define ENOMEM
Not enough space.
Definition: errno.h:534
Location is a URI.
Definition: open.h:27
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define DBGC2(...)
Definition: compiler.h:522
A Uniform Resource Identifier.
Definition: uri.h:64
struct uri * resolve_uri(const struct uri *base_uri, struct uri *relative_uri)
Resolve base+relative URI.
Definition: uri.c:694
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition: uri.c:296
int xfer_redirect(struct interface *intf, int type,...)
Send redirection event.
Definition: xfer.c:238

References DBGC, DBGC2, ENOMEM, LOCATION_URI, parse_uri(), rc, resolve_uri(), strerror(), http_transaction::uri, uri_put(), http_transaction::xfer, and xfer_redirect().

Referenced by http_transfer_complete().

◆ http_transfer_complete()

static int http_transfer_complete ( struct http_transaction http)
static

Handle successful transfer completion.

Parameters
httpHTTP transaction
Return values
rcReturn status code

Definition at line 784 of file httpcore.c.

784  {
785  struct http_authentication *auth;
786  const char *location;
787  int rc;
788 
789  /* Keep connection alive if applicable */
790  if ( http->response.flags & HTTP_RESPONSE_KEEPALIVE )
791  pool_recycle ( &http->conn );
792 
793  /* Restart server connection interface */
794  intf_restart ( &http->conn, 0 );
795 
796  /* No more data is expected */
797  http->state = NULL;
798 
799  /* If transaction is successful, then close the
800  * transfer-decoded interface. The content encoding may
801  * choose whether or not to immediately terminate the
802  * transaction.
803  */
804  if ( http->response.rc == 0 ) {
805  intf_shutdown ( &http->transfer, 0 );
806  return 0;
807  }
808 
809  /* Perform redirection, if applicable */
810  if ( ( location = http->response.location ) ) {
811  if ( ( rc = http_redirect ( http, location ) ) != 0 )
812  return rc;
813  http_close ( http, 0 );
814  return 0;
815  }
816 
817  /* Fail unless a retry is permitted */
818  if ( ! ( http->response.flags & HTTP_RESPONSE_RETRY ) )
819  return http->response.rc;
820 
821  /* Perform authentication, if applicable */
822  if ( ( auth = http->response.auth.auth ) ) {
823  http->request.auth.auth = auth;
824  DBGC2 ( http, "HTTP %p performing %s authentication\n",
825  http, auth->name );
826  if ( ( rc = auth->authenticate ( http ) ) != 0 ) {
827  DBGC ( http, "HTTP %p could not authenticate: %s\n",
828  http, strerror ( rc ) );
829  return rc;
830  }
831  }
832 
833  /* Restart content decoding interfaces */
834  intfs_restart ( http->response.rc, &http->content, &http->transfer,
835  NULL );
836  intf_plug_plug ( &http->transfer, &http->content );
837  http->len = 0;
838  assert ( http->remaining == 0 );
839 
840  /* Retry immediately if applicable. We cannot rely on an
841  * immediate timer expiry, since certain Microsoft-designed
842  * HTTP extensions such as NTLM break the fundamentally
843  * stateless nature of HTTP and rely on the same connection
844  * being reused for authentication. See RFC7230 section 2.3
845  * for further details.
846  */
847  if ( ! http->response.retry_after ) {
848  http_reopen ( http );
849  return 0;
850  }
851 
852  /* Start timer to initiate retry */
853  DBGC2 ( http, "HTTP %p retrying after %d seconds\n",
854  http, http->response.retry_after );
855  start_timer_fixed ( &http->retry,
856  ( http->response.retry_after * TICKS_PER_SEC ) );
857  stop_timer ( &http->watchdog );
858  return 0;
859 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:343
#define TICKS_PER_SEC
Number of ticks per second.
Definition: timer.h:15
void intf_shutdown(struct interface *intf, int rc)
Shut down an object interface.
Definition: interface.c:278
unsigned int flags
Flags.
Definition: http.h:350
struct interface conn
Server connection.
Definition: http.h:425
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
static int http_redirect(struct http_transaction *http, const char *location)
Redirect HTTP transaction.
Definition: httpcore.c:740
#define DBGC(...)
Definition: compiler.h:505
void intf_plug_plug(struct interface *a, struct interface *b)
Plug two object interfaces together.
Definition: interface.c:107
const char * location
Redirection location.
Definition: http.h:340
struct http_state * state
Transaction state.
Definition: http.h:443
An HTTP authentication scheme.
Definition: http.h:518
struct http_response_auth auth
Authorization descriptor.
Definition: http.h:346
void intfs_restart(int rc,...)
Shut down and restart multiple object interfaces.
Definition: interface.c:386
struct http_request request
Request.
Definition: http.h:436
int(* authenticate)(struct http_transaction *http)
Perform authentication.
Definition: http.h:533
Keep connection alive after close.
Definition: http.h:356
struct http_response response
Response.
Definition: http.h:438
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
size_t len
Accumulated transfer-decoded length.
Definition: http.h:445
struct http_request_auth auth
Authentication descriptor.
Definition: http.h:222
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
struct http_authentication * auth
Authentication scheme (if any)
Definition: http.h:189
struct interface content
Content-decoded interface.
Definition: http.h:421
int rc
Return status code.
Definition: http.h:338
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:64
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
#define DBGC2(...)
Definition: compiler.h:522
struct http_authentication * auth
Authentication scheme (if any)
Definition: http.h:297
static void http_reopen(struct http_transaction *http)
Reopen stale HTTP connection.
Definition: httpcore.c:325
const char * name
Name (e.g.
Definition: http.h:520
size_t remaining
Chunk length remaining.
Definition: http.h:447
Transaction may be retried on failure.
Definition: http.h:360
void pool_recycle(struct interface *intf)
Recycle this connection after closing.
Definition: pool.c:41
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct retry_timer retry
Reconnection timer.
Definition: http.h:429
unsigned int retry_after
Retry delay (in seconds)
Definition: http.h:348
struct retry_timer watchdog
Idle connection watchdog timer.
Definition: http.h:431

References assert(), http_request_auth::auth, http_request::auth, http_response_auth::auth, http_response::auth, http_authentication::authenticate, http_transaction::conn, http_transaction::content, DBGC, DBGC2, http_response::flags, http_close(), http_redirect(), http_reopen(), HTTP_RESPONSE_KEEPALIVE, HTTP_RESPONSE_RETRY, intf_plug_plug(), intf_restart(), intf_shutdown(), intfs_restart(), http_transaction::len, http_response::location, http_authentication::name, NULL, pool_recycle(), http_response::rc, rc, http_transaction::remaining, http_transaction::request, http_transaction::response, http_transaction::retry, http_response::retry_after, start_timer_fixed(), http_transaction::state, stop_timer(), strerror(), TICKS_PER_SEC, http_transaction::transfer, and http_transaction::watchdog.

Referenced by http_close_transfer_identity(), http_init_transfer_identity(), http_rx_headers(), http_rx_trailers(), and http_rx_transfer_identity().

◆ http_format_headers()

static int http_format_headers ( struct http_transaction http,
char *  buf,
size_t  len 
)
static

Construct HTTP request headers.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength, or negative error

Definition at line 876 of file httpcore.c.

877  {
878  struct parameters *params = http->uri->params;
879  struct http_request_header *header;
880  struct parameter *param;
881  size_t used;
882  size_t remaining;
883  char *line;
884  int value_len;
885  int rc;
886 
887  /* Construct request line */
888  used = ssnprintf ( buf, len, "%s %s HTTP/1.1",
889  http->request.method->name, http->request.uri );
890  if ( used < len )
891  DBGC2 ( http, "HTTP %p TX %s\n", http, buf );
892  used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
893 
894  /* Construct all fixed headers */
896 
897  /* Determine header value length */
898  value_len = header->format ( http, NULL, 0 );
899  if ( value_len < 0 ) {
900  rc = value_len;
901  return rc;
902  }
903 
904  /* Skip zero-length headers */
905  if ( ! value_len )
906  continue;
907 
908  /* Construct header */
909  line = ( buf + used );
910  used += ssnprintf ( ( buf + used ), ( len - used ), "%s: ",
911  header->name );
912  remaining = ( ( used < len ) ? ( len - used ) : 0 );
913  used += header->format ( http, ( buf + used ), remaining );
914  if ( used < len )
915  DBGC2 ( http, "HTTP %p TX %s\n", http, line );
916  used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
917  }
918 
919  /* Construct parameter headers, if any */
920  if ( params ) {
921 
922  /* Construct all parameter headers */
923  for_each_param ( param, params ) {
924 
925  /* Skip non-header parameters */
926  if ( ! ( param->flags & PARAMETER_HEADER ) )
927  continue;
928 
929  /* Add parameter */
930  used += ssnprintf ( ( buf + used ), ( len - used ),
931  "%s: %s\r\n", param->key,
932  param->value );
933  }
934  }
935 
936  /* Construct terminating newline */
937  used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
938 
939  return used;
940 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define for_each_param(param, params)
Iterate over all request parameters in a list.
Definition: params.h:83
A request parameter list.
Definition: params.h:16
struct uri * uri
Request URI.
Definition: http.h:434
An HTTP request header.
Definition: http.h:226
struct http_request request
Request.
Definition: http.h:436
int ssnprintf(char *buf, ssize_t ssize, const char *fmt,...)
Version of vsnprintf() that accepts a signed buffer size.
Definition: vsprintf.c:420
const char * uri
Request URI string.
Definition: http.h:214
ring len
Length.
Definition: dwmac.h:231
const char * name
Method name (e.g.
Definition: http.h:101
struct parameters * params
Request parameters.
Definition: uri.h:88
struct hv_monitor_parameter param[4][32]
Parameters.
Definition: hyperv.h:24
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
#define DBGC2(...)
Definition: compiler.h:522
#define HTTP_REQUEST_HEADERS
HTTP request header table.
Definition: http.h:241
struct ena_llq_option header
Header locations.
Definition: ena.h:16
struct http_method * method
Method.
Definition: http.h:212
A request parameter.
Definition: params.h:28
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define PARAMETER_HEADER
Request parameter is a header parameter.
Definition: params.h:43

References DBGC2, for_each_param, for_each_table_entry, header, HTTP_REQUEST_HEADERS, len, http_request::method, http_method::name, NULL, param, PARAMETER_HEADER, uri::params, rc, http_transaction::request, ssnprintf(), http_request::uri, and http_transaction::uri.

Referenced by http_tx_request().

◆ http_format_host()

static int http_format_host ( struct http_transaction http,
char *  buf,
size_t  len 
)
static

Construct HTTP "Host" header.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength of header value, or negative error

Definition at line 950 of file httpcore.c.

951  {
952 
953  /* Construct host URI */
954  return snprintf ( buf, len, "%s", http->request.host );
955 }
const char * host
Server host name.
Definition: http.h:216
struct http_request request
Request.
Definition: http.h:436
ring len
Length.
Definition: dwmac.h:231
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References http_request::host, len, http_transaction::request, and snprintf().

◆ http_format_user_agent()

static int http_format_user_agent ( struct http_transaction *http  __unused,
char *  buf,
size_t  len 
)
static

Construct HTTP "User-Agent" header.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength of header value, or negative error

Definition at line 971 of file httpcore.c.

972  {
973 
974  /* Construct user agent */
975  return snprintf ( buf, len, "iPXE/%s", product_version );
976 }
ring len
Length.
Definition: dwmac.h:231
const char product_version[]
Product version string.
Definition: version.c:70
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References len, product_version, and snprintf().

◆ http_format_connection()

static int http_format_connection ( struct http_transaction *http  __unused,
char *  buf,
size_t  len 
)
static

Construct HTTP "Connection" header.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength of header value, or negative error

Definition at line 992 of file httpcore.c.

993  {
994 
995  /* Always request keep-alive */
996  return snprintf ( buf, len, "keep-alive" );
997 }
ring len
Length.
Definition: dwmac.h:231
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References len, and snprintf().

◆ http_format_range()

static int http_format_range ( struct http_transaction http,
char *  buf,
size_t  len 
)
static

Construct HTTP "Range" header.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength of header value, or negative error

Definition at line 1013 of file httpcore.c.

1014  {
1015 
1016  /* Construct range, if applicable */
1017  if ( http->request.range.len ) {
1018  return snprintf ( buf, len, "bytes=%zd-%zd",
1019  http->request.range.start,
1020  ( http->request.range.start +
1021  http->request.range.len - 1 ) );
1022  } else {
1023  return 0;
1024  }
1025 }
size_t start
Range start.
Definition: http.h:137
struct http_request_range range
Range descriptor.
Definition: http.h:218
struct http_request request
Request.
Definition: http.h:436
ring len
Length.
Definition: dwmac.h:231
size_t len
Range length, or zero for no range request.
Definition: http.h:139
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References http_request_range::len, len, http_request::range, http_transaction::request, snprintf(), and http_request_range::start.

◆ http_format_content_type()

static int http_format_content_type ( struct http_transaction http,
char *  buf,
size_t  len 
)
static

Construct HTTP "Content-Type" header.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength of header value, or negative error

Definition at line 1041 of file httpcore.c.

1042  {
1043 
1044  /* Construct content type, if applicable */
1045  if ( http->request.content.type ) {
1046  return snprintf ( buf, len, "%s", http->request.content.type );
1047  } else {
1048  return 0;
1049  }
1050 }
struct http_request request
Request.
Definition: http.h:436
ring len
Length.
Definition: dwmac.h:231
struct http_request_content content
Content descriptor.
Definition: http.h:220
const char * type
Content type (if any)
Definition: http.h:145
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References http_request::content, len, http_transaction::request, snprintf(), and http_request_content::type.

◆ http_format_content_length()

static int http_format_content_length ( struct http_transaction http,
char *  buf,
size_t  len 
)
static

Construct HTTP "Content-Length" header.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength of header value, or negative error

Definition at line 1066 of file httpcore.c.

1067  {
1068 
1069  /* Construct content length, if applicable */
1070  if ( http->request.content.len ) {
1071  return snprintf ( buf, len, "%zd", http->request.content.len );
1072  } else {
1073  return 0;
1074  }
1075 }
struct http_request request
Request.
Definition: http.h:436
ring len
Length.
Definition: dwmac.h:231
struct http_request_content content
Content descriptor.
Definition: http.h:220
size_t len
Content length.
Definition: http.h:149
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References http_request::content, http_request_content::len, len, http_transaction::request, and snprintf().

◆ http_format_accept_encoding()

static int http_format_accept_encoding ( struct http_transaction http,
char *  buf,
size_t  len 
)
static

Construct HTTP "Accept-Encoding" header.

Parameters
httpHTTP transaction
bufBuffer
lenLength of buffer
Return values
lenLength of header value, or negative error

Definition at line 1091 of file httpcore.c.

1092  {
1093  struct http_content_encoding *encoding;
1094  const char *sep = "";
1095  size_t used = 0;
1096 
1097  /* Construct list of content encodings */
1099  if ( encoding->supported && ( ! encoding->supported ( http ) ) )
1100  continue;
1101  used += ssnprintf ( ( buf + used ), ( len - used ),
1102  "%s%s", sep, encoding->name );
1103  sep = ", ";
1104  }
1105 
1106  return used;
1107 }
An HTTP content encoding.
Definition: http.h:486
int ssnprintf(char *buf, ssize_t ssize, const char *fmt,...)
Version of vsnprintf() that accepts a signed buffer size.
Definition: vsprintf.c:420
ring len
Length.
Definition: dwmac.h:231
const char * name
Name.
Definition: http.h:488
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
int(* supported)(struct http_transaction *http)
Check if content encoding is supported for this request.
Definition: http.h:494
#define HTTP_CONTENT_ENCODINGS
HTTP content encoding table.
Definition: http.h:504

References for_each_table_entry, HTTP_CONTENT_ENCODINGS, len, http_content_encoding::name, ssnprintf(), and http_content_encoding::supported.

◆ http_tx_request()

static int http_tx_request ( struct http_transaction http)
static

Transmit request.

Parameters
httpHTTP transaction
Return values
rcReturn status code

Definition at line 1121 of file httpcore.c.

1121  {
1122  struct io_buffer *iobuf;
1123  int len;
1124  int check_len;
1125  int rc;
1126 
1127  /* Calculate request length */
1128  len = http_format_headers ( http, NULL, 0 );
1129  if ( len < 0 ) {
1130  rc = len;
1131  DBGC ( http, "HTTP %p could not construct request: %s\n",
1132  http, strerror ( rc ) );
1133  goto err_len;
1134  }
1135 
1136  /* Allocate I/O buffer */
1137  iobuf = xfer_alloc_iob ( &http->conn, ( len + 1 /* NUL */ +
1138  http->request.content.len ) );
1139  if ( ! iobuf ) {
1140  rc = -ENOMEM;
1141  goto err_alloc;
1142  }
1143 
1144  /* Construct request */
1145  check_len = http_format_headers ( http, iob_put ( iobuf, len ),
1146  ( len + 1 /* NUL */ ) );
1147  assert ( check_len == len );
1148  memcpy ( iob_put ( iobuf, http->request.content.len ),
1149  http->request.content.data, http->request.content.len );
1150 
1151  /* Deliver request */
1152  if ( ( rc = xfer_deliver_iob ( &http->conn,
1153  iob_disown ( iobuf ) ) ) != 0 ) {
1154  DBGC ( http, "HTTP %p could not deliver request: %s\n",
1155  http, strerror ( rc ) );
1156  goto err_deliver;
1157  }
1158 
1159  /* Clear any previous response */
1160  empty_line_buffer ( &http->response.headers );
1161  memset ( &http->response, 0, sizeof ( http->response ) );
1162 
1163  /* Move to response headers state */
1164  http->state = &http_headers;
1165 
1166  return 0;
1167 
1168  err_deliver:
1169  free_iob ( iobuf );
1170  err_alloc:
1171  err_len:
1172  return rc;
1173 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:124
int xfer_deliver_iob(struct interface *intf, struct io_buffer *iobuf)
Deliver datagram as I/O buffer without metadata.
Definition: xfer.c:255
struct interface conn
Server connection.
Definition: http.h:425
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:152
#define DBGC(...)
Definition: compiler.h:505
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:158
struct http_state * state
Transaction state.
Definition: http.h:443
struct http_request request
Request.
Definition: http.h:436
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:216
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct http_response response
Response.
Definition: http.h:438
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
ring len
Length.
Definition: dwmac.h:231
void empty_line_buffer(struct line_buffer *linebuf)
Discard line buffer contents.
Definition: linebuf.c:65
struct http_request_content content
Content descriptor.
Definition: http.h:220
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
struct line_buffer headers
Raw response header lines.
Definition: http.h:327
const void * data
Content data (if any)
Definition: http.h:147
size_t len
Content length.
Definition: http.h:149
static struct http_state http_headers
HTTP response headers state.
Definition: httpcore.c:126
static int http_format_headers(struct http_transaction *http, char *buf, size_t len)
Construct HTTP request headers.
Definition: httpcore.c:876
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:37

References assert(), http_transaction::conn, http_request::content, http_request_content::data, DBGC, empty_line_buffer(), ENOMEM, free_iob(), http_response::headers, http_format_headers(), http_headers, iob_disown, iob_put, http_request_content::len, len, memcpy(), memset(), NULL, rc, http_transaction::request, http_transaction::response, http_transaction::state, strerror(), xfer_alloc_iob(), and xfer_deliver_iob().

◆ http_parse_status()

static int http_parse_status ( struct http_transaction http,
char *  line 
)
static

Parse HTTP status line.

Parameters
httpHTTP transaction
lineStatus line
Return values
rcReturn status code

Definition at line 1195 of file httpcore.c.

1195  {
1196  char *endp;
1197  char *version;
1198  char *vernum;
1199  char *status;
1200  int response_rc;
1201 
1202  DBGC2 ( http, "HTTP %p RX %s\n", http, line );
1203 
1204  /* Parse HTTP version */
1205  version = http_token ( &line, NULL );
1206  if ( ( ! version ) || ( strncmp ( version, "HTTP/", 5 ) != 0 ) ) {
1207  DBGC ( http, "HTTP %p malformed version \"%s\"\n", http, line );
1208  return -EINVAL_STATUS;
1209  }
1210 
1211  /* Keepalive is enabled by default for anything newer than HTTP/1.0 */
1212  vernum = ( version + 5 /* "HTTP/" (presence already checked) */ );
1213  if ( vernum[0] == '0' ) {
1214  /* HTTP/0.x : keepalive not enabled by default */
1215  } else if ( strncmp ( vernum, "1.0", 3 ) == 0 ) {
1216  /* HTTP/1.0 : keepalive not enabled by default */
1217  } else {
1218  /* HTTP/1.1 or newer: keepalive enabled by default */
1220  }
1221 
1222  /* Parse status code */
1223  status = line;
1224  http->response.status = strtoul ( status, &endp, 10 );
1225  if ( *endp != ' ' ) {
1226  DBGC ( http, "HTTP %p malformed status code \"%s\"\n",
1227  http, status );
1228  return -EINVAL_STATUS;
1229  }
1230 
1231  /* Convert HTTP status code to iPXE return status code */
1232  if ( status[0] == '2' ) {
1233  /* 2xx Success */
1234  response_rc = 0;
1235  } else if ( status[0] == '3' ) {
1236  /* 3xx Redirection */
1237  response_rc = -EXDEV;
1238  } else if ( http->response.status == 401 ) {
1239  /* 401 Unauthorized */
1240  response_rc = -EACCES_401;
1241  } else if ( http->response.status == 403 ) {
1242  /* 403 Forbidden */
1243  response_rc = -EPERM_403;
1244  } else if ( http->response.status == 404 ) {
1245  /* 404 Not Found */
1246  response_rc = -ENOENT_404;
1247  } else if ( status[0] == '4' ) {
1248  /* 4xx Client Error (not already specified) */
1249  response_rc = -EIO_4XX;
1250  } else if ( status[0] == '5' ) {
1251  /* 5xx Server Error */
1252  response_rc = -EIO_5XX;
1253  } else {
1254  /* Unrecognised */
1255  response_rc = -EIO_OTHER;
1256  }
1257  http->response.rc = response_rc;
1258  if ( response_rc )
1259  DBGC ( http, "HTTP %p status %s\n", http, status );
1260 
1261  return 0;
1262 }
#define ENOENT_404
Definition: httpcore.c:90
unsigned int flags
Flags.
Definition: http.h:350
unsigned long strtoul(const char *string, char **endp, int base)
Convert string to numeric value.
Definition: string.c:484
#define EPERM_403
Definition: httpcore.c:99
#define DBGC(...)
Definition: compiler.h:505
#define EIO_OTHER
Definition: httpcore.c:78
int strncmp(const char *first, const char *second, size_t max)
Compare strings.
Definition: string.c:186
#define EXDEV
Improper link.
Definition: errno.h:684
#define EINVAL_STATUS
Definition: httpcore.c:66
Keep connection alive after close.
Definition: http.h:356
u32 version
Driver version.
Definition: ath9k_hw.c:1983
struct http_response response
Response.
Definition: http.h:438
#define EACCES_401
Definition: httpcore.c:63
int rc
Return status code.
Definition: http.h:338
unsigned int status
Status code.
Definition: http.h:332
char * http_token(char **line, char **value)
Get HTTP response token.
Definition: httpcore.c:195
#define EIO_5XX
Definition: httpcore.c:87
uint8_t status
Status.
Definition: ena.h:16
#define DBGC2(...)
Definition: compiler.h:522
#define EIO_4XX
Definition: httpcore.c:84
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References DBGC, DBGC2, EACCES_401, EINVAL_STATUS, EIO_4XX, EIO_5XX, EIO_OTHER, ENOENT_404, EPERM_403, EXDEV, http_response::flags, HTTP_RESPONSE_KEEPALIVE, http_token(), NULL, http_response::rc, http_transaction::response, status, http_response::status, strncmp(), strtoul(), and version.

Referenced by http_parse_headers().

◆ http_parse_header()

static int http_parse_header ( struct http_transaction http,
char *  line 
)
static

Parse HTTP header.

Parameters
httpHTTP transaction
lineHeader line
Return values
rcReturn status code

Definition at line 1271 of file httpcore.c.

1271  {
1272  struct http_response_header *header;
1273  char *name = line;
1274  char *sep;
1275 
1276  DBGC2 ( http, "HTTP %p RX %s\n", http, line );
1277 
1278  /* Extract header name */
1279  sep = strchr ( line, ':' );
1280  if ( ! sep ) {
1281  DBGC ( http, "HTTP %p malformed header \"%s\"\n", http, line );
1282  return -EINVAL_HEADER;
1283  }
1284  *sep = '\0';
1285 
1286  /* Extract remainder of line */
1287  line = ( sep + 1 );
1288  while ( isspace ( *line ) )
1289  line++;
1290 
1291  /* Process header, if recognised */
1293  if ( strcasecmp ( name, header->name ) == 0 )
1294  return header->parse ( http, line );
1295  }
1296 
1297  /* Unrecognised headers should be ignored */
1298  return 0;
1299 }
const char * name
Definition: ath9k_hw.c:1984
#define DBGC(...)
Definition: compiler.h:505
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition: string.c:208
#define HTTP_RESPONSE_HEADERS
HTTP response header table.
Definition: http.h:377
char * strchr(const char *src, int character)
Find character within a string.
Definition: string.c:271
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
int isspace(int character)
Check to see if character is a space.
Definition: ctype.c:41
#define EINVAL_HEADER
Definition: httpcore.c:69
#define DBGC2(...)
Definition: compiler.h:522
struct ena_llq_option header
Header locations.
Definition: ena.h:16
An HTTP response header.
Definition: http.h:364

References DBGC, DBGC2, EINVAL_HEADER, for_each_table_entry, header, HTTP_RESPONSE_HEADERS, isspace(), name, strcasecmp(), and strchr().

Referenced by http_parse_headers().

◆ http_parse_headers()

static int http_parse_headers ( struct http_transaction http)
static

Parse HTTP response headers.

Parameters
httpHTTP transaction
Return values
rcReturn status code

Definition at line 1307 of file httpcore.c.

1307  {
1308  char *line;
1309  char *next;
1310  int rc;
1311 
1312  /* Get status line */
1313  line = http->response.headers.data;
1314  assert ( line != NULL );
1315  next = ( line + strlen ( line ) + 1 /* NUL */ );
1316 
1317  /* Parse status line */
1318  if ( ( rc = http_parse_status ( http, line ) ) != 0 )
1319  return rc;
1320 
1321  /* Process header lines */
1322  while ( 1 ) {
1323 
1324  /* Move to next line */
1325  line = next;
1326  next = ( line + strlen ( line ) + 1 /* NUL */ );
1327 
1328  /* Stop on terminating blank line */
1329  if ( ! line[0] )
1330  return 0;
1331 
1332  /* Process header line */
1333  if ( ( rc = http_parse_header ( http, line ) ) != 0 )
1334  return rc;
1335  }
1336 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int http_parse_header(struct http_transaction *http, char *line)
Parse HTTP header.
Definition: httpcore.c:1271
char * data
Data buffer.
Definition: linebuf.h:18
struct http_response response
Response.
Definition: http.h:438
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
size_t strlen(const char *src)
Get length of string.
Definition: string.c:243
struct line_buffer headers
Raw response header lines.
Definition: http.h:327
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
static int http_parse_status(struct http_transaction *http, char *line)
Parse HTTP status line.
Definition: httpcore.c:1195
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References assert(), line_buffer::data, http_response::headers, http_parse_header(), http_parse_status(), next, NULL, rc, http_transaction::response, and strlen().

Referenced by http_rx_headers().

◆ http_parse_location()

static int http_parse_location ( struct http_transaction http,
char *  line 
)
static

Parse HTTP "Location" header.

Parameters
httpHTTP transaction
lineRemaining header line
Return values
rcReturn status code

Definition at line 1345 of file httpcore.c.

1345  {
1346 
1347  /* Store location */
1348  http->response.location = line;
1349  return 0;
1350 }
const char * location
Redirection location.
Definition: http.h:340
struct http_response response
Response.
Definition: http.h:438

References http_response::location, and http_transaction::response.

◆ http_parse_transfer_encoding()

static int http_parse_transfer_encoding ( struct http_transaction http,
char *  line 
)
static

Parse HTTP "Transfer-Encoding" header.

Parameters
httpHTTP transaction
lineRemaining header line
Return values
rcReturn status code

Definition at line 1365 of file httpcore.c.

1366  {
1367  struct http_transfer_encoding *encoding;
1368 
1369  /* Check for known transfer encodings */
1371  if ( strcasecmp ( line, encoding->name ) == 0 ) {
1372  http->response.transfer.encoding = encoding;
1373  return 0;
1374  }
1375  }
1376 
1377  DBGC ( http, "HTTP %p unrecognised Transfer-Encoding \"%s\"\n",
1378  http, line );
1379  return -ENOTSUP_TRANSFER;
1380 }
#define DBGC(...)
Definition: compiler.h:505
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition: string.c:208
struct http_transfer_encoding * encoding
Transfer encoding.
Definition: http.h:257
struct http_response response
Response.
Definition: http.h:438
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
#define ENOTSUP_TRANSFER
Definition: httpcore.c:96
#define HTTP_TRANSFER_ENCODINGS
HTTP transfer encoding table.
Definition: http.h:472
struct http_response_transfer transfer
Transfer descriptor.
Definition: http.h:342
const char * name
Name.
Definition: http.h:460
An HTTP transfer encoding.
Definition: http.h:458

References DBGC, http_response_transfer::encoding, ENOTSUP_TRANSFER, for_each_table_entry, HTTP_TRANSFER_ENCODINGS, http_transfer_encoding::name, http_transaction::response, strcasecmp(), and http_response::transfer.

◆ http_parse_connection()

static int http_parse_connection ( struct http_transaction http,
char *  line 
)
static

Parse HTTP "Connection" header.

Parameters
httpHTTP transaction
lineRemaining header line
Return values
rcReturn status code

Definition at line 1396 of file httpcore.c.

1396  {
1397  char *token;
1398 
1399  /* Check for known connection intentions */
1400  while ( ( token = http_token ( &line, NULL ) ) ) {
1401  if ( strcasecmp ( token, "keep-alive" ) == 0 )
1403  if ( strcasecmp ( token, "close" ) == 0 )
1405  }
1406 
1407  return 0;
1408 }
unsigned int flags
Flags.
Definition: http.h:350
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition: string.c:208
Keep connection alive after close.
Definition: http.h:356
struct http_response response
Response.
Definition: http.h:438
char * http_token(char **line, char **value)
Get HTTP response token.
Definition: httpcore.c:195
u8 token
Definition: CIB_PRM.h:42
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References http_response::flags, HTTP_RESPONSE_KEEPALIVE, http_token(), NULL, http_transaction::response, strcasecmp(), and token.

◆ http_parse_content_length()

static int http_parse_content_length ( struct http_transaction http,
char *  line 
)
static

Parse HTTP "Content-Length" header.

Parameters
httpHTTP transaction
lineRemaining header line
Return values
rcReturn status code

Definition at line 1423 of file httpcore.c.

1424  {
1425  char *endp;
1426 
1427  /* Parse length */
1428  http->response.content.len = strtoul ( line, &endp, 10 );
1429  if ( *endp != '\0' ) {
1430  DBGC ( http, "HTTP %p invalid Content-Length \"%s\"\n",
1431  http, line );
1432  return -EINVAL_CONTENT_LENGTH;
1433  }
1434 
1435  /* Record that we have a content length (since it may be zero) */
1437 
1438  return 0;
1439 }
Content length specified.
Definition: http.h:358
unsigned int flags
Flags.
Definition: http.h:350
unsigned long strtoul(const char *string, char **endp, int base)
Convert string to numeric value.
Definition: string.c:484
#define DBGC(...)
Definition: compiler.h:505
struct http_response response
Response.
Definition: http.h:438
struct http_response_content content
Content descriptor.
Definition: http.h:344
size_t len
Content length (may be zero)
Definition: http.h:263
#define EINVAL_CONTENT_LENGTH
Definition: httpcore.c:72

References http_response::content, DBGC, EINVAL_CONTENT_LENGTH, http_response::flags, HTTP_RESPONSE_CONTENT_LEN, http_response_content::len, http_transaction::response, and strtoul().

◆ http_parse_content_encoding()

static int http_parse_content_encoding ( struct http_transaction http,
char *  line 
)
static

Parse HTTP "Content-Encoding" header.

Parameters
httpHTTP transaction
lineRemaining header line
Return values
rcReturn status code

Definition at line 1455 of file httpcore.c.

1456  {
1457  struct http_content_encoding *encoding;
1458 
1459  /* Check for known content encodings */
1461  if ( encoding->supported && ( ! encoding->supported ( http ) ) )
1462  continue;
1463  if ( strcasecmp ( line, encoding->name ) == 0 ) {
1464  http->response.content.encoding = encoding;
1465  return 0;
1466  }
1467  }
1468 
1469  /* Some servers (e.g. Apache) have a habit of specifying
1470  * unwarranted content encodings. For example, if Apache
1471  * detects (via /etc/httpd/conf/magic) that a file's contents
1472  * are gzip-compressed, it will set "Content-Encoding: x-gzip"
1473  * regardless of the client's Accept-Encoding header. The
1474  * only viable way to handle such servers is to treat unknown
1475  * content encodings as equivalent to "identity".
1476  */
1477  DBGC ( http, "HTTP %p unrecognised Content-Encoding \"%s\"\n",
1478  http, line );
1479  return 0;
1480 }
#define DBGC(...)
Definition: compiler.h:505
int strcasecmp(const char *first, const char *second)
Compare case-insensitive strings.
Definition: string.c:208
An HTTP content encoding.
Definition: http.h:486
struct http_response response
Response.
Definition: http.h:438
struct http_response_content content
Content descriptor.
Definition: http.h:344
const char * name
Name.
Definition: http.h:488
struct http_content_encoding * encoding
Content encoding.
Definition: http.h:265
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
int(* supported)(struct http_transaction *http)
Check if content encoding is supported for this request.
Definition: http.h:494
#define HTTP_CONTENT_ENCODINGS
HTTP content encoding table.
Definition: http.h:504

References http_response::content, DBGC, http_response_content::encoding, for_each_table_entry, HTTP_CONTENT_ENCODINGS, http_content_encoding::name, http_transaction::response, strcasecmp(), and http_content_encoding::supported.

◆ http_parse_retry_after()

static int http_parse_retry_after ( struct http_transaction http,
char *  line 
)
static

Parse HTTP "Retry-After" header.

Parameters
httpHTTP transaction
lineRemaining header line
Return values
rcReturn status code

Definition at line 1496 of file httpcore.c.

1497  {
1498  char *endp;
1499 
1500  /* Try to parse value as a simple number of seconds */
1501  http->response.retry_after = strtoul ( line, &endp, 10 );
1502  if ( *endp != '\0' ) {
1503  /* For any value which is not a simple number of
1504  * seconds (e.g. a full HTTP date), just retry after a
1505  * fixed delay, since we don't have code able to parse
1506  * full HTTP dates.
1507  */
1509  DBGC ( http, "HTTP %p cannot understand Retry-After \"%s\"; "
1510  "using %d seconds\n", http, line, HTTP_RETRY_SECONDS );
1511  }
1512 
1513  /* Allow HTTP request to be retried after specified delay */
1515 
1516  return 0;
1517 }
unsigned int flags
Flags.
Definition: http.h:350
unsigned long strtoul(const char *string, char **endp, int base)
Convert string to numeric value.
Definition: string.c:484
#define DBGC(...)
Definition: compiler.h:505
struct http_response response
Response.
Definition: http.h:438
#define HTTP_RETRY_SECONDS
Retry delay used when we cannot understand the Retry-After header.
Definition: httpcore.c:107
Transaction may be retried on failure.
Definition: http.h:360
unsigned int retry_after
Retry delay (in seconds)
Definition: http.h:348

References DBGC, http_response::flags, HTTP_RESPONSE_RETRY, HTTP_RETRY_SECONDS, http_transaction::response, http_response::retry_after, and strtoul().

◆ http_rx_headers()

static int http_rx_headers ( struct http_transaction http,
struct io_buffer **  iobuf 
)
static

Handle received HTTP headers.

Parameters
httpHTTP transaction
iobufI/O buffer (may be claimed)
Return values
rcReturn status code

Definition at line 1532 of file httpcore.c.

1533  {
1534  struct http_transfer_encoding *transfer;
1535  struct http_content_encoding *content;
1536  char *line;
1537  int rc;
1538 
1539  /* Buffer header line */
1540  if ( ( rc = http_rx_linebuf ( http, *iobuf,
1541  &http->response.headers ) ) != 0 )
1542  return rc;
1543 
1544  /* Wait until we see the empty line marking end of headers */
1545  line = buffered_line ( &http->response.headers );
1546  if ( ( line == NULL ) || ( line[0] != '\0' ) )
1547  return 0;
1548 
1549  /* Process headers */
1550  if ( ( rc = http_parse_headers ( http ) ) != 0 )
1551  return rc;
1552 
1553  /* Initialise content encoding, if applicable */
1554  if ( ( content = http->response.content.encoding ) &&
1555  ( ( rc = content->init ( http ) ) != 0 ) ) {
1556  DBGC ( http, "HTTP %p could not initialise %s content "
1557  "encoding: %s\n", http, content->name, strerror ( rc ) );
1558  return rc;
1559  }
1560 
1561  /* Presize receive buffer, if we have a content length */
1562  if ( http->response.content.len ) {
1563  xfer_seek ( &http->transfer, http->response.content.len );
1564  xfer_seek ( &http->transfer, 0 );
1565  }
1566 
1567  /* Complete transfer if this is a HEAD request */
1568  if ( http->request.method == &http_head ) {
1569  if ( ( rc = http_transfer_complete ( http ) ) != 0 )
1570  return rc;
1571  return 0;
1572  }
1573 
1574  /* Default to identity transfer encoding, if none specified */
1575  if ( ! http->response.transfer.encoding )
1577 
1578  /* Move to transfer encoding-specific data state */
1579  transfer = http->response.transfer.encoding;
1580  http->state = &transfer->state;
1581 
1582  /* Initialise transfer encoding */
1583  if ( ( rc = transfer->init ( http ) ) != 0 ) {
1584  DBGC ( http, "HTTP %p could not initialise %s transfer "
1585  "encoding: %s\n", http, transfer->name, strerror ( rc ));
1586  return rc;
1587  }
1588 
1589  return 0;
1590 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct http_method http_head
HTTP HEAD method.
Definition: httpcore.c:138
static int http_parse_headers(struct http_transaction *http)
Parse HTTP response headers.
Definition: httpcore.c:1307
static struct http_transfer_encoding http_transfer_identity
Identity transfer encoding.
Definition: httpcore.c:128
#define DBGC(...)
Definition: compiler.h:505
struct http_state * state
Transaction state.
Definition: http.h:443
An HTTP content encoding.
Definition: http.h:486
struct http_request request
Request.
Definition: http.h:436
struct http_transfer_encoding * encoding
Transfer encoding.
Definition: http.h:257
struct http_response response
Response.
Definition: http.h:438
struct http_response_content content
Content descriptor.
Definition: http.h:344
const char * name
Name.
Definition: http.h:488
int xfer_seek(struct interface *intf, off_t offset)
Seek to position.
Definition: xfer.c:351
struct http_content_encoding * encoding
Content encoding.
Definition: http.h:265
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
size_t len
Content length (may be zero)
Definition: http.h:263
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
char * buffered_line(struct line_buffer *linebuf)
Retrieve buffered-up line.
Definition: linebuf.c:45
struct line_buffer headers
Raw response header lines.
Definition: http.h:327
struct http_response_transfer transfer
Transfer descriptor.
Definition: http.h:342
static int http_transfer_complete(struct http_transaction *http)
Handle successful transfer completion.
Definition: httpcore.c:784
struct http_method * method
Method.
Definition: http.h:212
int(* init)(struct http_transaction *http)
Initialise transfer encoding.
Definition: http.h:466
const char * name
Name.
Definition: http.h:460
struct http_state state
Receive data state.
Definition: http.h:468
An HTTP transfer encoding.
Definition: http.h:458
static int http_rx_linebuf(struct http_transaction *http, struct io_buffer *iobuf, struct line_buffer *linebuf)
Handle received HTTP line-buffered data.
Definition: httpcore.c:167
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
int(* init)(struct http_transaction *http)
Initialise content encoding.
Definition: http.h:500

References buffered_line(), http_response::content, DBGC, http_response_transfer::encoding, http_response_content::encoding, http_response::headers, http_head, http_parse_headers(), http_rx_linebuf(), http_transfer_complete(), http_transfer_identity, http_transfer_encoding::init, http_content_encoding::init, http_response_content::len, http_request::method, http_transfer_encoding::name, http_content_encoding::name, NULL, rc, http_transaction::request, http_transaction::response, http_transaction::state, http_transfer_encoding::state, strerror(), http_response::transfer, http_transaction::transfer, and xfer_seek().

◆ http_init_transfer_identity()

static int http_init_transfer_identity ( struct http_transaction http)
static

Initialise transfer encoding.

Parameters
httpHTTP transaction
Return values
rcReturn status code

Definition at line 1611 of file httpcore.c.

1611  {
1612  int rc;
1613 
1614  /* Complete transfer immediately if we have a zero content length */
1615  if ( ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) &&
1616  ( http->response.content.len == 0 ) &&
1617  ( ( rc = http_transfer_complete ( http ) ) != 0 ) )
1618  return rc;
1619 
1620  return 0;
1621 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
Content length specified.
Definition: http.h:358
unsigned int flags
Flags.
Definition: http.h:350
struct http_response response
Response.
Definition: http.h:438
struct http_response_content content
Content descriptor.
Definition: http.h:344
size_t len
Content length (may be zero)
Definition: http.h:263
static int http_transfer_complete(struct http_transaction *http)
Handle successful transfer completion.
Definition: httpcore.c:784

References http_response::content, http_response::flags, HTTP_RESPONSE_CONTENT_LEN, http_transfer_complete(), http_response_content::len, rc, and http_transaction::response.

◆ http_rx_transfer_identity()

static int http_rx_transfer_identity ( struct http_transaction http,
struct io_buffer **  iobuf 
)
static

Handle received data.

Parameters
httpHTTP transaction
iobufI/O buffer (may be claimed)
Return values
rcReturn status code

Definition at line 1630 of file httpcore.c.

1631  {
1632  size_t len = iob_len ( *iobuf );
1633  int rc;
1634 
1635  /* Update lengths */
1636  http->len += len;
1637 
1638  /* Fail if this transfer would overrun the expected content
1639  * length (if any).
1640  */
1641  if ( ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) &&
1642  ( http->len > http->response.content.len ) ) {
1643  DBGC ( http, "HTTP %p content length overrun\n", http );
1644  return -EIO_CONTENT_LENGTH;
1645  }
1646 
1647  /* Hand off to content encoding */
1648  if ( ( rc = xfer_deliver_iob ( &http->transfer,
1649  iob_disown ( *iobuf ) ) ) != 0 )
1650  return rc;
1651 
1652  /* Complete transfer if we have received the expected content
1653  * length (if any).
1654  */
1655  if ( ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) &&
1656  ( http->len == http->response.content.len ) &&
1657  ( ( rc = http_transfer_complete ( http ) ) != 0 ) )
1658  return rc;
1659 
1660  return 0;
1661 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
Content length specified.
Definition: http.h:358
unsigned int flags
Flags.
Definition: http.h:350
int xfer_deliver_iob(struct interface *intf, struct io_buffer *iobuf)
Deliver datagram as I/O buffer without metadata.
Definition: xfer.c:255
#define DBGC(...)
Definition: compiler.h:505
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:216
struct http_response response
Response.
Definition: http.h:438
size_t len
Accumulated transfer-decoded length.
Definition: http.h:445
struct http_response_content content
Content descriptor.
Definition: http.h:344
ring len
Length.
Definition: dwmac.h:231
#define EIO_CONTENT_LENGTH
Definition: httpcore.c:81
size_t len
Content length (may be zero)
Definition: http.h:263
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
static int http_transfer_complete(struct http_transaction *http)
Handle successful transfer completion.
Definition: httpcore.c:784

References http_response::content, DBGC, EIO_CONTENT_LENGTH, http_response::flags, HTTP_RESPONSE_CONTENT_LEN, http_transfer_complete(), iob_disown, iob_len(), len, http_response_content::len, http_transaction::len, rc, http_transaction::response, http_transaction::transfer, and xfer_deliver_iob().

◆ http_close_transfer_identity()

static void http_close_transfer_identity ( struct http_transaction http,
int  rc 
)
static

Handle server connection close.

Parameters
httpHTTP transaction
rcReason for close

Definition at line 1669 of file httpcore.c.

1670  {
1671 
1672  /* Fail if any error occurred */
1673  if ( rc != 0 )
1674  goto err;
1675 
1676  /* Fail if we have a content length (since we would have
1677  * already closed the connection if we had received the
1678  * correct content length).
1679  */
1680  if ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) {
1681  DBGC ( http, "HTTP %p content length underrun\n", http );
1683  goto err;
1684  }
1685 
1686  /* Indicate that transfer is complete */
1687  if ( ( rc = http_transfer_complete ( http ) ) != 0 )
1688  goto err;
1689 
1690  return;
1691 
1692  err:
1693  http_close ( http, rc );
1694 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
Content length specified.
Definition: http.h:358
unsigned int flags
Flags.
Definition: http.h:350
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
#define DBGC(...)
Definition: compiler.h:505
struct http_response response
Response.
Definition: http.h:438
#define EIO_CONTENT_LENGTH
Definition: httpcore.c:81
static int http_transfer_complete(struct http_transaction *http)
Handle successful transfer completion.
Definition: httpcore.c:784

References DBGC, EIO_CONTENT_LENGTH, http_response::flags, http_close(), HTTP_RESPONSE_CONTENT_LEN, http_transfer_complete(), rc, and http_transaction::response.

◆ http_init_transfer_chunked()

static int http_init_transfer_chunked ( struct http_transaction http)
static

Initialise transfer encoding.

Parameters
httpHTTP transaction
Return values
rcReturn status code

Definition at line 1719 of file httpcore.c.

1719  {
1720 
1721  /* Sanity checks */
1722  assert ( http->remaining == 0 );
1723  assert ( http->linebuf.len == 0 );
1724 
1725  return 0;
1726 }
struct line_buffer linebuf
Temporary line buffer.
Definition: http.h:440
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
size_t len
Length of buffered data.
Definition: linebuf.h:20
size_t remaining
Chunk length remaining.
Definition: http.h:447

References assert(), line_buffer::len, http_transaction::linebuf, and http_transaction::remaining.

◆ http_rx_chunk_len()

static int http_rx_chunk_len ( struct http_transaction http,
struct io_buffer **  iobuf 
)
static

Handle received chunk length.

Parameters
httpHTTP transaction
iobufI/O buffer (may be claimed)
Return values
rcReturn status code

Definition at line 1735 of file httpcore.c.

1736  {
1737  char *line;
1738  char *endp;
1739  size_t len;
1740  int rc;
1741 
1742  /* Receive into temporary line buffer */
1743  if ( ( rc = http_rx_linebuf ( http, *iobuf, &http->linebuf ) ) != 0 )
1744  return rc;
1745 
1746  /* Wait until we receive a non-empty line */
1747  line = buffered_line ( &http->linebuf );
1748  if ( ( line == NULL ) || ( line[0] == '\0' ) )
1749  return 0;
1750 
1751  /* Parse chunk length */
1752  http->remaining = strtoul ( line, &endp, 16 );
1753  if ( *endp != '\0' ) {
1754  DBGC ( http, "HTTP %p invalid chunk length \"%s\"\n",
1755  http, line );
1756  return -EINVAL_CHUNK_LENGTH;
1757  }
1758 
1759  /* Empty line buffer */
1760  empty_line_buffer ( &http->linebuf );
1761 
1762  /* Update expected length */
1763  len = ( http->len + http->remaining );
1764  xfer_seek ( &http->transfer, len );
1765  xfer_seek ( &http->transfer, http->len );
1766 
1767  /* If chunk length is zero, then move to response trailers state */
1768  if ( ! http->remaining )
1769  http->state = &http_trailers;
1770 
1771  return 0;
1772 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned long strtoul(const char *string, char **endp, int base)
Convert string to numeric value.
Definition: string.c:484
struct line_buffer linebuf
Temporary line buffer.
Definition: http.h:440
#define DBGC(...)
Definition: compiler.h:505
struct http_state * state
Transaction state.
Definition: http.h:443
size_t len
Accumulated transfer-decoded length.
Definition: http.h:445
ring len
Length.
Definition: dwmac.h:231
void empty_line_buffer(struct line_buffer *linebuf)
Discard line buffer contents.
Definition: linebuf.c:65
int xfer_seek(struct interface *intf, off_t offset)
Seek to position.
Definition: xfer.c:351
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
char * buffered_line(struct line_buffer *linebuf)
Retrieve buffered-up line.
Definition: linebuf.c:45
#define EINVAL_CHUNK_LENGTH
Definition: httpcore.c:75
size_t remaining
Chunk length remaining.
Definition: http.h:447
static int http_rx_linebuf(struct http_transaction *http, struct io_buffer *iobuf, struct line_buffer *linebuf)
Handle received HTTP line-buffered data.
Definition: httpcore.c:167
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static struct http_state http_trailers
HTTP response trailers state.
Definition: httpcore.c:127

References buffered_line(), DBGC, EINVAL_CHUNK_LENGTH, empty_line_buffer(), http_rx_linebuf(), http_trailers, len, http_transaction::len, http_transaction::linebuf, NULL, rc, http_transaction::remaining, http_transaction::state, strtoul(), http_transaction::transfer, and xfer_seek().

Referenced by http_rx_transfer_chunked().

◆ http_rx_chunk_data()

static int http_rx_chunk_data ( struct http_transaction http,
struct io_buffer **  iobuf 
)
static

Handle received chunk data.

Parameters
httpHTTP transaction
iobufI/O buffer (may be claimed)
Return values
rcReturn status code

Definition at line 1781 of file httpcore.c.

1782  {
1783  struct io_buffer *payload;
1784  uint8_t *crlf;
1785  size_t len;
1786  int rc;
1787 
1788  /* In the common case of a final chunk in a packet which also
1789  * includes the terminating CRLF, strip the terminating CRLF
1790  * (which we would ignore anyway) and hence avoid
1791  * unnecessarily copying the data.
1792  */
1793  if ( iob_len ( *iobuf ) == ( http->remaining + 2 /* CRLF */ ) ) {
1794  crlf = ( (*iobuf)->data + http->remaining );
1795  if ( ( crlf[0] == '\r' ) && ( crlf[1] == '\n' ) )
1796  iob_unput ( (*iobuf), 2 /* CRLF */ );
1797  }
1798  len = iob_len ( *iobuf );
1799 
1800  /* Use whole/partial buffer as applicable */
1801  if ( len <= http->remaining ) {
1802 
1803  /* Whole buffer is to be consumed: decrease remaining
1804  * length and use original I/O buffer as payload.
1805  */
1806  payload = iob_disown ( *iobuf );
1807  http->len += len;
1808  http->remaining -= len;
1809 
1810  } else {
1811 
1812  /* Partial buffer is to be consumed: copy data to a
1813  * temporary I/O buffer.
1814  */
1815  payload = alloc_iob ( http->remaining );
1816  if ( ! payload ) {
1817  rc = -ENOMEM;
1818  goto err;
1819  }
1820  memcpy ( iob_put ( payload, http->remaining ), (*iobuf)->data,
1821  http->remaining );
1822  iob_pull ( *iobuf, http->remaining );
1823  http->len += http->remaining;
1824  http->remaining = 0;
1825  }
1826 
1827  /* Hand off to content encoding */
1828  if ( ( rc = xfer_deliver_iob ( &http->transfer,
1829  iob_disown ( payload ) ) ) != 0 )
1830  goto err;
1831 
1832  return 0;
1833 
1834  err:
1835  assert ( payload == NULL );
1836  return rc;
1837 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:106
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:124
int xfer_deliver_iob(struct interface *intf, struct io_buffer *iobuf)
Deliver datagram as I/O buffer without metadata.
Definition: xfer.c:255
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:130
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:216
void * memcpy(void *dest, const void *src, size_t len) __nonnull
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
size_t len
Accumulated transfer-decoded length.
Definition: http.h:445
ring len
Length.
Definition: dwmac.h:231
#define iob_unput(iobuf, len)
Definition: iobuf.h:139
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:159
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
unsigned char uint8_t
Definition: stdint.h:10
size_t remaining
Chunk length remaining.
Definition: http.h:447
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A persistent I/O buffer.
Definition: iobuf.h:37

References alloc_iob(), assert(), ENOMEM, iob_disown, iob_len(), iob_pull, iob_put, iob_unput, len, http_transaction::len, memcpy(), NULL, rc, http_transaction::remaining, http_transaction::transfer, and xfer_deliver_iob().

Referenced by http_rx_transfer_chunked().

◆ http_rx_transfer_chunked()

static int http_rx_transfer_chunked ( struct http_transaction http,
struct io_buffer **  iobuf 
)
static

Handle received chunked data.

Parameters
httpHTTP transaction
iobufI/O buffer (may be claimed)
Return values
rcReturn status code

Definition at line 1846 of file httpcore.c.

1847  {
1848 
1849  /* Handle as chunk length or chunk data as appropriate */
1850  if ( http->remaining ) {
1851  return http_rx_chunk_data ( http, iobuf );
1852  } else {
1853  return http_rx_chunk_len ( http, iobuf );
1854  }
1855 }
static int http_rx_chunk_len(struct http_transaction *http, struct io_buffer **iobuf)
Handle received chunk length.
Definition: httpcore.c:1735
size_t remaining
Chunk length remaining.
Definition: http.h:447
static int http_rx_chunk_data(struct http_transaction *http, struct io_buffer **iobuf)
Handle received chunk data.
Definition: httpcore.c:1781

References http_rx_chunk_data(), http_rx_chunk_len(), and http_transaction::remaining.

◆ http_rx_trailers()

static int http_rx_trailers ( struct http_transaction http,
struct io_buffer **  iobuf 
)
static

Handle received HTTP trailer.

Parameters
httpHTTP transaction
iobufI/O buffer (may be claimed)
Return values
rcReturn status code

Definition at line 1881 of file httpcore.c.

1882  {
1883  char *line;
1884  int rc;
1885 
1886  /* Buffer trailer line */
1887  if ( ( rc = http_rx_linebuf ( http, *iobuf, &http->linebuf ) ) != 0 )
1888  return rc;
1889 
1890  /* Wait until we see the empty line marking end of trailers */
1891  line = buffered_line ( &http->linebuf );
1892  if ( ( line == NULL ) || ( line[0] != '\0' ) )
1893  return 0;
1894 
1895  /* Empty line buffer */
1896  empty_line_buffer ( &http->linebuf );
1897 
1898  /* Transfer is complete */
1899  if ( ( rc = http_transfer_complete ( http ) ) != 0 )
1900  return rc;
1901 
1902  return 0;
1903 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct line_buffer linebuf
Temporary line buffer.
Definition: http.h:440
void empty_line_buffer(struct line_buffer *linebuf)
Discard line buffer contents.
Definition: linebuf.c:65
char * buffered_line(struct line_buffer *linebuf)
Retrieve buffered-up line.
Definition: linebuf.c:45
static int http_transfer_complete(struct http_transaction *http)
Handle successful transfer completion.
Definition: httpcore.c:784
static int http_rx_linebuf(struct http_transaction *http, struct io_buffer *iobuf, struct line_buffer *linebuf)
Handle received HTTP line-buffered data.
Definition: httpcore.c:167
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References buffered_line(), empty_line_buffer(), http_rx_linebuf(), http_transfer_complete(), http_transaction::linebuf, NULL, and rc.

◆ http_form_params()

static size_t http_form_params ( struct parameters params,
char *  buf,
size_t  len 
)
static

Construct HTTP form parameter list.

Parameters
paramsParameter list
bufBuffer to contain HTTP POST parameters
lenLength of buffer
Return values
lenLength of parameter list (excluding terminating NUL)

Definition at line 1926 of file httpcore.c.

1927  {
1928  struct parameter *param;
1929  ssize_t remaining = len;
1930  size_t frag_len;
1931 
1932  /* Add each parameter in the form "key=value", joined with "&" */
1933  len = 0;
1934  for_each_param ( param, params ) {
1935 
1936  /* Skip non-form parameters */
1937  if ( ! ( param->flags & PARAMETER_FORM ) )
1938  continue;
1939 
1940  /* Add the "&", if applicable */
1941  if ( len ) {
1942  if ( remaining > 0 )
1943  *buf = '&';
1944  buf++;
1945  len++;
1946  remaining--;
1947  }
1948 
1949  /* URI-encode the key */
1950  frag_len = uri_encode_string ( 0, param->key, buf, remaining );
1951  buf += frag_len;
1952  len += frag_len;
1953  remaining -= frag_len;
1954 
1955  /* Add the "=" */
1956  if ( remaining > 0 )
1957  *buf = '=';
1958  buf++;
1959  len++;
1960  remaining--;
1961 
1962  /* URI-encode the value */
1963  frag_len = uri_encode_string ( 0, param->value, buf, remaining);
1964  buf += frag_len;
1965  len += frag_len;
1966  remaining -= frag_len;
1967  }
1968 
1969  /* Ensure string is NUL-terminated even if no parameters are present */
1970  if ( remaining > 0 )
1971  *buf = '\0';
1972 
1973  return len;
1974 }
size_t uri_encode_string(unsigned int field, const char *string, char *buf, ssize_t len)
Encode URI field string.
Definition: uri.c:235
#define for_each_param(param, params)
Iterate over all request parameters in a list.
Definition: params.h:83
ring len
Length.
Definition: dwmac.h:231
struct hv_monitor_parameter param[4][32]
Parameters.
Definition: hyperv.h:24
#define PARAMETER_FORM
Request parameter is a form parameter.
Definition: params.h:40
A request parameter.
Definition: params.h:28
signed long ssize_t
Definition: stdint.h:7

References for_each_param, len, param, PARAMETER_FORM, and uri_encode_string().

Referenced by http_open_uri().

◆ http_open_uri()

int http_open_uri ( struct interface xfer,
struct uri uri 
)

Open HTTP transaction for simple URI.

Parameters
xferData transfer interface
uriRequest URI
Return values
rcReturn status code

Definition at line 1983 of file httpcore.c.

1983  {
1984  struct parameters *params = uri->params;
1985  struct http_request_content content;
1986  struct http_method *method;
1987  const char *type;
1988  void *data;
1989  size_t len;
1990  size_t check_len;
1991  int rc;
1992 
1993  /* Calculate length of form parameter list, if any */
1994  len = ( params ? http_form_params ( params, NULL, 0 ) : 0 );
1995 
1996  /* Use POST if and only if there are form parameters */
1997  if ( len ) {
1998 
1999  /* Use POST */
2000  method = &http_post;
2001  type = "application/x-www-form-urlencoded";
2002 
2003  /* Allocate temporary form parameter list */
2004  data = zalloc ( len + 1 /* NUL */ );
2005  if ( ! data ) {
2006  rc = -ENOMEM;
2007  goto err_alloc;
2008  }
2009 
2010  /* Construct temporary form parameter list */
2011  check_len = http_form_params ( params, data,
2012  ( len + 1 /* NUL */ ) );
2013  assert ( check_len == len );
2014 
2015  } else {
2016 
2017  /* Use GET */
2018  method = &http_get;
2019  type = NULL;
2020  data = NULL;
2021  }
2022 
2023  /* Construct request content */
2024  content.type = type;
2025  content.data = data;
2026  content.len = len;
2027 
2028  /* Open HTTP transaction */
2029  if ( ( rc = http_open ( xfer, method, uri, NULL, &content ) ) != 0 )
2030  goto err_open;
2031 
2032  err_open:
2033  free ( data );
2034  err_alloc:
2035  return rc;
2036 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint32_t type
Operating system type.
Definition: ena.h:12
A request parameter list.
Definition: params.h:16
An HTTP method.
Definition: http.h:99
uint8_t method
Definition: ib_mad.h:14
#define ENOMEM
Not enough space.
Definition: errno.h:534
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
ring len
Length.
Definition: dwmac.h:231
struct parameters * params
Request parameters.
Definition: uri.h:88
HTTP request content descriptor.
Definition: http.h:143
struct http_method http_get
HTTP GET method.
Definition: httpcore.c:143
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:661
static size_t http_form_params(struct parameters *params, char *buf, size_t len)
Construct HTTP form parameter list.
Definition: httpcore.c:1926
int http_open(struct interface *xfer, struct http_method *method, struct uri *uri, struct http_request_range *range, struct http_request_content *content)
Open HTTP transaction.
Definition: httpcore.c:641
uint8_t data[48]
Additional event data.
Definition: ena.h:22
A Uniform Resource Identifier.
Definition: uri.h:64
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct http_method http_post
HTTP POST method.
Definition: httpcore.c:148

References assert(), data, http_request_content::data, ENOMEM, free, http_form_params(), http_get, http_open(), http_post, http_request_content::len, len, method, NULL, uri::params, rc, type, http_request_content::type, and zalloc().

◆ REQUIRING_SYMBOL()

REQUIRING_SYMBOL ( http_open  )

◆ REQUIRE_OBJECT()

REQUIRE_OBJECT ( config_http  )

Variable Documentation

◆ __profiler

struct profiler http_xfer_profiler __profiler = { .name = "http.rx" }
static

Receive profiler.

Data transfer profiler.

Definition at line 113 of file httpcore.c.

◆ __errortab

struct errortab http_errors [] __errortab
Initial value:
= {
}
#define EINFO_EIO_4XX
Definition: httpcore.c:85
#define __einfo_errortab(einfo)
Definition: errortab.h:23
#define EINFO_EIO_5XX
Definition: httpcore.c:88
#define EINFO_ENOENT_404
Definition: httpcore.c:91

Human-readable error messages.

Definition at line 119 of file httpcore.c.

◆ http_request

static struct http_state http_request
static
Initial value:
= {
.close = http_close_error,
}
static int http_tx_request(struct http_transaction *http)
Transmit request.
Definition: httpcore.c:1121
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:302

HTTP request state.

Definition at line 125 of file httpcore.c.

Referenced by http_open(), and http_reopen().

◆ http_headers

static struct http_state http_headers
static
Initial value:
= {
.close = http_close_error,
}
static int http_rx_headers(struct http_transaction *http, struct io_buffer **iobuf)
Handle received HTTP headers.
Definition: httpcore.c:1532
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:302

HTTP response headers state.

Definition at line 126 of file httpcore.c.

Referenced by http_tx_request().

◆ http_trailers

static struct http_state http_trailers
static
Initial value:
= {
.close = http_close_error,
}
static int http_rx_trailers(struct http_transaction *http, struct io_buffer **iobuf)
Handle received HTTP trailer.
Definition: httpcore.c:1881
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:302

HTTP response trailers state.

Definition at line 127 of file httpcore.c.

Referenced by http_rx_chunk_len().

◆ http_transfer_identity

static struct http_transfer_encoding http_transfer_identity
static
Initial value:
= {
.name = "identity",
.state = {
},
}
static int http_rx_transfer_identity(struct http_transaction *http, struct io_buffer **iobuf)
Handle received data.
Definition: httpcore.c:1630
static void http_close_transfer_identity(struct http_transaction *http, int rc)
Handle server connection close.
Definition: httpcore.c:1669
static int http_init_transfer_identity(struct http_transaction *http)
Initialise transfer encoding.
Definition: httpcore.c:1611

Identity transfer encoding.

Definition at line 128 of file httpcore.c.

Referenced by http_rx_headers().

◆ http_head

struct http_method http_head
Initial value:
= {
.name = "HEAD",
}

HTTP HEAD method.

Definition at line 138 of file httpcore.c.

Referenced by http_block_read_capacity(), and http_rx_headers().

◆ http_get

struct http_method http_get
Initial value:
= {
.name = "GET",
}

HTTP GET method.

Definition at line 143 of file httpcore.c.

Referenced by http_block_read(), http_open_uri(), and peerblk_raw_open().

◆ http_post

struct http_method http_post
Initial value:
= {
.name = "POST",
}

HTTP POST method.

Definition at line 148 of file httpcore.c.

Referenced by http_open_uri(), and peerblk_retrieval_open().

◆ http_xfer_operations

struct interface_operation http_xfer_operations[]
static
Initial value:
= {
}
void xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition: xfer.c:146
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:249
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
__weak int http_block_read_capacity(struct http_transaction *http __unused, struct interface *data __unused)
Read block device capacity (when HTTP block device support is not present)
Definition: httpcore.c:557
static EFI_DEVICE_PATH_PROTOCOL * http_efi_describe(struct http_transaction *http)
Describe as an EFI device path.
Definition: httpcore.c:570
An HTTP transaction.
Definition: http.h:415
__weak int http_block_read(struct http_transaction *http __unused, struct interface *data __unused, uint64_t lba __unused, unsigned int count __unused, void *buffer __unused, size_t len __unused)
Read from block device (when HTTP block device support is not present)
Definition: httpcore.c:542
#define EFI_INTF_OP
Definition: efi.h:373
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
EFI_DEVICE_PATH_PROTOCOL * efi_describe(struct interface *intf)
Describe object as an EFI device path.
Definition: efi_path.c:919
int block_read(struct interface *control, struct interface *data, uint64_t lba, unsigned int count, void *buffer, size_t len)
Read from block device.
Definition: blockdev.c:47
static void http_step(struct http_transaction *http)
HTTP transmit process.
Definition: httpcore.c:389
int block_read_capacity(struct interface *control, struct interface *data)
Read block device capacity.
Definition: blockdev.c:105

HTTP data transfer interface operations.

Definition at line 576 of file httpcore.c.

◆ http_xfer_desc

struct interface_descriptor http_xfer_desc
static
Initial value:
=
An HTTP transaction.
Definition: http.h:415
static struct interface_operation http_xfer_operations[]
HTTP data transfer interface operations.
Definition: httpcore.c:576
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:97

HTTP data transfer interface descriptor.

Definition at line 587 of file httpcore.c.

Referenced by http_open().

◆ http_content_operations

struct interface_operation http_content_operations[]
static
Initial value:
= {
}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:249
A data transfer buffer.
Definition: xferbuf.h:18
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
static struct xfer_buffer * http_content_buffer(struct http_transaction *http)
Get underlying data transfer buffer.
Definition: httpcore.c:519
static int http_content_deliver(struct http_transaction *http, struct io_buffer *iobuf, struct xfer_metadata *meta)
Handle received content-decoded data.
Definition: httpcore.c:486
An HTTP transaction.
Definition: http.h:415
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194

HTTP content-decoded interface operations.

Definition at line 592 of file httpcore.c.

◆ http_content_desc

struct interface_descriptor http_content_desc
static
Initial value:
=
static struct interface_operation http_content_operations[]
HTTP content-decoded interface operations.
Definition: httpcore.c:592
An HTTP transaction.
Definition: http.h:415
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:97

HTTP content-decoded interface descriptor.

Definition at line 600 of file httpcore.c.

Referenced by http_open().

◆ http_transfer_operations

struct interface_operation http_transfer_operations[]
static
Initial value:
= {
}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:249
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:282
An HTTP transaction.
Definition: http.h:415
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32

HTTP transfer-decoded interface operations.

Definition at line 605 of file httpcore.c.

◆ http_transfer_desc

struct interface_descriptor http_transfer_desc
static
Initial value:
=
An HTTP transaction.
Definition: http.h:415
static struct interface_operation http_transfer_operations[]
HTTP transfer-decoded interface operations.
Definition: httpcore.c:605
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:97

HTTP transfer-decoded interface descriptor.

Definition at line 610 of file httpcore.c.

Referenced by http_open().

◆ http_conn_operations

struct interface_operation http_conn_operations[]
static
Initial value:
= {
}
void xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition: xfer.c:146
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:249
static int http_conn_deliver(struct http_transaction *http, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
Handle received HTTP data.
Definition: httpcore.c:427
An HTTP transaction.
Definition: http.h:415
void pool_reopen(struct interface *intf)
Reopen a defunct connection.
Definition: pool.c:51
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:32
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:194
static void http_reopen(struct http_transaction *http)
Reopen stale HTTP connection.
Definition: httpcore.c:325
static void http_step(struct http_transaction *http)
HTTP transmit process.
Definition: httpcore.c:389
static void http_conn_close(struct http_transaction *http, int rc)
Handle server connection close.
Definition: httpcore.c:466

HTTP server connection interface operations.

Definition at line 615 of file httpcore.c.

◆ http_conn_desc

struct interface_descriptor http_conn_desc
static
Initial value:
=
static struct interface_operation http_conn_operations[]
HTTP server connection interface operations.
Definition: httpcore.c:615
An HTTP transaction.
Definition: http.h:415
#define INTF_DESC_PASSTHRU(object_type, intf, operations, passthru)
Define an object interface descriptor with pass-through interface.
Definition: interface.h:97

HTTP server connection interface descriptor.

Definition at line 623 of file httpcore.c.

Referenced by http_open().

◆ http_process_desc

struct process_descriptor http_process_desc
static
Initial value:
=
A process.
Definition: process.h:17
#define PROC_DESC_ONCE(object_type, process, _step)
Define a process descriptor for a process that runs only once.
Definition: process.h:97
An HTTP transaction.
Definition: http.h:415
static void http_step(struct http_transaction *http)
HTTP transmit process.
Definition: httpcore.c:389

HTTP process descriptor.

Definition at line 628 of file httpcore.c.

Referenced by http_open().

◆ __http_request_header

struct http_request_header http_request_accept_encoding __http_request_header
Initial value:
= {
.name = "Host",
.format = http_format_host,
}
static int http_format_host(struct http_transaction *http, char *buf, size_t len)
Construct HTTP "Host" header.
Definition: httpcore.c:950

HTTP "Host" header ".

HTTP "Accept-Encoding" header.

HTTP "Content-Length" header.

HTTP "Content-Type" header.

HTTP "Range" header.

HTTP "Connection" header.

HTTP "User-Agent" header.

Definition at line 958 of file httpcore.c.

◆ __http_response_header

struct http_response_header http_response_retry_after __http_response_header
Initial value:
= {
.name = "Location",
}
static int http_parse_location(struct http_transaction *http, char *line)
Parse HTTP "Location" header.
Definition: httpcore.c:1345

HTTP "Location" header.

HTTP "Retry-After" header.

HTTP "Content-Encoding" header.

HTTP "Content-Length" header.

HTTP "Connection" header.

HTTP "Transfer-Encoding" header.

Definition at line 1353 of file httpcore.c.

◆ __http_transfer_encoding

struct http_transfer_encoding http_transfer_chunked __http_transfer_encoding
Initial value:
= {
.name = "chunked",
.state = {
.close = http_close_error,
},
}
static int http_rx_transfer_chunked(struct http_transaction *http, struct io_buffer **iobuf)
Handle received chunked data.
Definition: httpcore.c:1846
static int http_init_transfer_chunked(struct http_transaction *http)
Initialise transfer encoding.
Definition: httpcore.c:1719
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:302

Chunked transfer encoding.

Definition at line 1858 of file httpcore.c.