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...
 

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_reopen (struct http_transaction *http)
 Reopen stale HTTP connection. More...
 
static void http_expired (struct retry_timer *timer, int over __unused)
 Handle retry 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, userptr_t 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.

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 164 of file httpcore.c.

166  {
167  int consumed;
168  int rc;
169 
170  /* Buffer received line */
171  consumed = line_buffer ( linebuf, iobuf->data, iob_len ( iobuf ) );
172  if ( consumed < 0 ) {
173  rc = consumed;
174  DBGC ( http, "HTTP %p could not buffer line: %s\n",
175  http, strerror ( rc ) );
176  return rc;
177  }
178 
179  /* Consume line */
180  iob_pull ( iobuf, consumed );
181 
182  return 0;
183 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:102
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:155
void * data
Start of data.
Definition: iobuf.h:48
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 192 of file httpcore.c.

192  {
193  char *token;
194  char quote = '\0';
195  char c;
196 
197  /* Avoid returning uninitialised data */
198  if ( value )
199  *value = NULL;
200 
201  /* Skip any initial whitespace or commas */
202  while ( ( isspace ( **line ) ) || ( **line == ',' ) )
203  (*line)++;
204 
205  /* Check for end of line and record token position */
206  if ( ! **line )
207  return NULL;
208  token = *line;
209 
210  /* Scan for end of token */
211  while ( ( c = **line ) ) {
212 
213  /* Terminate if we hit an unquoted whitespace or comma */
214  if ( ( isspace ( c ) || ( c == ',' ) ) && ! quote )
215  break;
216 
217  /* Terminate if we hit a closing quote */
218  if ( c == quote )
219  break;
220 
221  /* Check for value separator */
222  if ( value && ( ! *value ) && ( c == '=' ) ) {
223 
224  /* Terminate key portion of token */
225  *((*line)++) = '\0';
226 
227  /* Check for quote character */
228  c = **line;
229  if ( ( c == '"' ) || ( c == '\'' ) ) {
230  quote = c;
231  (*line)++;
232  }
233 
234  /* Record value portion of token */
235  *value = *line;
236 
237  } else {
238 
239  /* Move to next character */
240  (*line)++;
241  }
242  }
243 
244  /* Terminate token, if applicable */
245  if ( c )
246  *((*line)++) = '\0';
247 
248  return token;
249 }
uint32_t c
Definition: md4.c:30
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 c, 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 263 of file httpcore.c.

263  {
264  struct http_transaction *http =
266 
268  empty_line_buffer ( &http->linebuf );
269  uri_put ( http->uri );
270  free ( http );
271 }
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:438
struct uri * uri
Request URI.
Definition: http.h:432
A reference counter.
Definition: refcnt.h:26
struct http_response response
Response.
Definition: http.h:436
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 279 of file httpcore.c.

279  {
280 
281  /* Stop process */
282  process_del ( &http->process );
283 
284  /* Stop timer */
285  stop_timer ( &http->timer );
286 
287  /* Close all interfaces */
288  intfs_shutdown ( rc, &http->conn, &http->transfer, &http->content,
289  &http->xfer, NULL );
290 }
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
struct retry_timer timer
Reconnection timer.
Definition: http.h:429
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

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

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

◆ 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 298 of file httpcore.c.

298  {
299 
300  /* Treat any close as an error */
301  http_close ( http, ( rc ? rc : -EPIPE ) );
302 }
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:279
#define EPIPE
Broken pipe.
Definition: errno.h:619

References EPIPE, http_close(), and rc.

◆ http_reopen()

static void http_reopen ( struct http_transaction http)
static

Reopen stale HTTP connection.

Parameters
httpHTTP transaction

Definition at line 309 of file httpcore.c.

309  {
310  int rc;
311 
312  /* Close existing connection */
313  intf_restart ( &http->conn, -ECANCELED );
314 
315  /* Reopen connection */
316  if ( ( rc = http_connect ( &http->conn, http->uri ) ) != 0 ) {
317  DBGC ( http, "HTTP %p could not reconnect: %s\n",
318  http, strerror ( rc ) );
319  goto err_connect;
320  }
321 
322  /* Reset state */
323  http->state = &http_request;
324 
325  /* Reschedule transmission process */
326  process_add ( &http->process );
327 
328  return;
329 
330  err_connect:
331  http_close ( http, rc );
332 }
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:279
#define DBGC(...)
Definition: compiler.h:505
struct uri * uri
Request URI.
Definition: http.h:432
struct http_state * state
Transaction state.
Definition: http.h:441
#define ECANCELED
Operation canceled.
Definition: errno.h:343
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:122

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

Referenced by http_expired(), and http_transfer_complete().

◆ http_expired()

static void http_expired ( struct retry_timer timer,
int over  __unused 
)
static

Handle retry timer expiry.

Parameters
timerRetry timer
overFailure indicator

Definition at line 340 of file httpcore.c.

340  {
341  struct http_transaction *http =
343 
344  /* Reopen connection */
345  http_reopen ( http );
346 }
A timer.
Definition: timer.h:28
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:309

References container_of, and http_reopen().

Referenced by http_open().

◆ http_step()

static void http_step ( struct http_transaction http)
static

HTTP transmit process.

Parameters
httpHTTP transaction

Definition at line 353 of file httpcore.c.

353  {
354  int rc;
355 
356  /* Do nothing if we have nothing to transmit */
357  if ( ! http->state->tx )
358  return;
359 
360  /* Do nothing until connection is ready */
361  if ( ! xfer_window ( &http->conn ) )
362  return;
363 
364  /* Notify data transfer interface that window may have changed */
365  xfer_window_changed ( &http->xfer );
366 
367  /* Do nothing until data transfer interface is ready */
368  if ( ! xfer_window ( &http->xfer ) )
369  return;
370 
371  /* Transmit data */
372  if ( ( rc = http->state->tx ( http ) ) != 0 )
373  goto err;
374 
375  return;
376 
377  err:
378  http_close ( http, rc );
379 }
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:279
int(* tx)(struct http_transaction *http)
Transmit data.
Definition: http.h:397
struct http_state * state
Transaction state.
Definition: http.h:441
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 391 of file httpcore.c.

393  {
394  int rc;
395 
396  /* Handle received data */
397  profile_start ( &http_rx_profiler );
398  while ( iobuf && iob_len ( iobuf ) ) {
399 
400  /* Sanity check */
401  if ( ( ! http->state ) || ( ! http->state->rx ) ) {
402  DBGC ( http, "HTTP %p unexpected data\n", http );
404  goto err;
405  }
406 
407  /* Receive (some) data */
408  if ( ( rc = http->state->rx ( http, &iobuf ) ) != 0 )
409  goto err;
410  }
411 
412  /* Free I/O buffer, if applicable */
413  free_iob ( iobuf );
414 
415  profile_stop ( &http_rx_profiler );
416  return 0;
417 
418  err:
419  free_iob ( iobuf );
420  http_close ( http, rc );
421  return rc;
422 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:279
#define DBGC(...)
Definition: compiler.h:505
struct http_state * state
Transaction state.
Definition: http.h:441
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
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:158
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
#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 430 of file httpcore.c.

430  {
431 
432  /* Sanity checks */
433  assert ( http->state != NULL );
434  assert ( http->state->close != NULL );
435 
436  /* Restart server connection interface */
437  intf_restart ( &http->conn, rc );
438 
439  /* Hand off to state-specific method */
440  http->state->close ( http, rc );
441 }
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:441
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 450 of file httpcore.c.

452  {
453  int rc;
454 
455  /* Ignore content if this is anything other than a successful
456  * transfer.
457  */
458  if ( http->response.rc != 0 ) {
459  free_iob ( iobuf );
460  return 0;
461  }
462 
463  /* Deliver to data transfer interface */
464  profile_start ( &http_xfer_profiler );
465  if ( ( rc = xfer_deliver ( &http->xfer, iob_disown ( iobuf ),
466  meta ) ) != 0 )
467  return rc;
468  profile_stop ( &http_xfer_profiler );
469 
470  return 0;
471 }
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:146
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:212
struct http_response response
Response.
Definition: http.h:436
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
int meta(WINDOW *, bool)
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

References free_iob(), 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 480 of file httpcore.c.

480  {
481 
482  /* Deny access to the data transfer buffer if this is anything
483  * other than a successful transfer.
484  */
485  if ( http->response.rc != 0 )
486  return NULL;
487 
488  /* Hand off to data transfer interface */
489  return xfer_buffer ( &http->xfer );
490 }
struct interface xfer
Data transfer interface.
Definition: http.h:419
struct http_response response
Response.
Definition: http.h:436
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:301
#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,
userptr_t 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 503 of file httpcore.c.

506  {
507 
508  return -ENOTSUP;
509 }
#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 518 of file httpcore.c.

519  {
520 
521  return -ENOTSUP;
522 }
#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 531 of file httpcore.c.

531  {
532 
533  return efi_uri_path ( http->uri );
534 }
struct uri * uri
Request URI.
Definition: http.h:432
EFI_DEVICE_PATH_PROTOCOL * efi_uri_path(struct uri *uri)
Construct EFI device path for URI.
Definition: efi_path.c:396

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 602 of file httpcore.c.

604  {
605  struct http_transaction *http;
606  struct uri request_uri;
607  struct uri request_host;
608  size_t request_uri_len;
609  size_t request_host_len;
610  size_t content_len;
611  char *request_uri_string;
612  char *request_host_string;
613  void *content_data;
614  int rc;
615 
616  /* Calculate request URI length */
617  memset ( &request_uri, 0, sizeof ( request_uri ) );
618  request_uri.epath = ( uri->epath ? uri->epath : "/" );
619  request_uri.equery = uri->equery;
620  request_uri_len =
621  ( format_uri ( &request_uri, NULL, 0 ) + 1 /* NUL */);
622 
623  /* Calculate host name length */
624  memset ( &request_host, 0, sizeof ( request_host ) );
625  request_host.host = uri->host;
626  request_host.port = uri->port;
627  request_host_len =
628  ( format_uri ( &request_host, NULL, 0 ) + 1 /* NUL */ );
629 
630  /* Calculate request content length */
631  content_len = ( content ? content->len : 0 );
632 
633  /* Allocate and initialise structure */
634  http = zalloc ( sizeof ( *http ) + request_uri_len + request_host_len +
635  content_len );
636  if ( ! http ) {
637  rc = -ENOMEM;
638  goto err_alloc;
639  }
640  request_uri_string = ( ( ( void * ) http ) + sizeof ( *http ) );
641  request_host_string = ( request_uri_string + request_uri_len );
642  content_data = ( request_host_string + request_host_len );
643  format_uri ( &request_uri, request_uri_string, request_uri_len );
644  format_uri ( &request_host, request_host_string, request_host_len );
645  ref_init ( &http->refcnt, http_free );
646  intf_init ( &http->xfer, &http_xfer_desc, &http->refcnt );
647  intf_init ( &http->content, &http_content_desc, &http->refcnt );
648  intf_init ( &http->transfer, &http_transfer_desc, &http->refcnt );
649  intf_init ( &http->conn, &http_conn_desc, &http->refcnt );
650  intf_plug_plug ( &http->transfer, &http->content );
651  process_init ( &http->process, &http_process_desc, &http->refcnt );
652  timer_init ( &http->timer, http_expired, &http->refcnt );
653  http->uri = uri_get ( uri );
654  http->request.method = method;
655  http->request.uri = request_uri_string;
656  http->request.host = request_host_string;
657  if ( range ) {
658  memcpy ( &http->request.range, range,
659  sizeof ( http->request.range ) );
660  }
661  if ( content ) {
662  http->request.content.type = content->type;
663  http->request.content.data = content_data;
664  http->request.content.len = content_len;
665  memcpy ( content_data, content->data, content_len );
666  }
667  http->state = &http_request;
668  DBGC2 ( http, "HTTP %p %s://%s%s\n", http, http->uri->scheme,
669  http->request.host, http->request.uri );
670 
671  /* Open connection */
672  if ( ( rc = http_connect ( &http->conn, uri ) ) != 0 ) {
673  DBGC ( http, "HTTP %p could not connect: %s\n",
674  http, strerror ( rc ) );
675  goto err_connect;
676  }
677 
678  /* Attach to parent interface, mortalise self, and return */
679  intf_plug_plug ( &http->xfer, xfer );
680  ref_put ( &http->refcnt );
681  return 0;
682 
683  err_connect:
684  http_close ( http, rc );
685  ref_put ( &http->refcnt );
686  err_alloc:
687  return rc;
688 }
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 __always_inline void struct pci_range * range
Definition: efi_pci_api.h:43
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_expired(struct retry_timer *timer, int over __unused)
Handle retry timer expiry.
Definition: httpcore.c:340
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:279
static struct interface_descriptor http_transfer_desc
HTTP transfer-decoded interface descriptor.
Definition: httpcore.c:571
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:561
#define DBGC(...)
Definition: compiler.h:505
struct uri * uri
Request URI.
Definition: http.h:432
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:441
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:434
const char * port
Port number.
Definition: uri.h:78
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:584
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:624
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:548
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
struct retry_timer timer
Reconnection timer.
Definition: http.h:429
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:589
#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:263
static struct http_state http_request
HTTP request state.
Definition: httpcore.c:122
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
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
void * memset(void *dest, int character, size_t len) __nonnull

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_expired(), http_free(), http_process_desc, http_request, http_transfer_desc, 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(), range, http_request::range, rc, ref_init, ref_put, http_transaction::refcnt, http_transaction::request, uri::scheme, http_transaction::state, strerror(), http_transaction::timer, http_transaction::transfer, http_request_content::type, http_request::uri, http_transaction::uri, uri_get(), 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 697 of file httpcore.c.

698  {
699  struct uri *location_uri;
700  struct uri *resolved_uri;
701  int rc;
702 
703  DBGC2 ( http, "HTTP %p redirecting to \"%s\"\n", http, location );
704 
705  /* Parse location URI */
706  location_uri = parse_uri ( location );
707  if ( ! location_uri ) {
708  rc = -ENOMEM;
709  goto err_parse_uri;
710  }
711 
712  /* Resolve as relative to original URI */
713  resolved_uri = resolve_uri ( http->uri, location_uri );
714  if ( ! resolved_uri ) {
715  rc = -ENOMEM;
716  goto err_resolve_uri;
717  }
718 
719  /* Redirect to new URI */
720  if ( ( rc = xfer_redirect ( &http->xfer, LOCATION_URI,
721  resolved_uri ) ) != 0 ) {
722  DBGC ( http, "HTTP %p could not redirect: %s\n",
723  http, strerror ( rc ) );
724  goto err_redirect;
725  }
726 
727  err_redirect:
728  uri_put ( resolved_uri );
729  err_resolve_uri:
730  uri_put ( location_uri );
731  err_parse_uri:
732  return rc;
733 }
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:432
#define ENOMEM
Not enough space.
Definition: errno.h:534
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
Location is a URI.
Definition: open.h:27
#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 741 of file httpcore.c.

741  {
742  struct http_authentication *auth;
743  const char *location;
744  int rc;
745 
746  /* Keep connection alive if applicable */
747  if ( http->response.flags & HTTP_RESPONSE_KEEPALIVE )
748  pool_recycle ( &http->conn );
749 
750  /* Restart server connection interface */
751  intf_restart ( &http->conn, 0 );
752 
753  /* No more data is expected */
754  http->state = NULL;
755 
756  /* If transaction is successful, then close the
757  * transfer-decoded interface. The content encoding may
758  * choose whether or not to immediately terminate the
759  * transaction.
760  */
761  if ( http->response.rc == 0 ) {
762  intf_shutdown ( &http->transfer, 0 );
763  return 0;
764  }
765 
766  /* Perform redirection, if applicable */
767  if ( ( location = http->response.location ) ) {
768  if ( ( rc = http_redirect ( http, location ) ) != 0 )
769  return rc;
770  http_close ( http, 0 );
771  return 0;
772  }
773 
774  /* Fail unless a retry is permitted */
775  if ( ! ( http->response.flags & HTTP_RESPONSE_RETRY ) )
776  return http->response.rc;
777 
778  /* Perform authentication, if applicable */
779  if ( ( auth = http->response.auth.auth ) ) {
780  http->request.auth.auth = auth;
781  DBGC2 ( http, "HTTP %p performing %s authentication\n",
782  http, auth->name );
783  if ( ( rc = auth->authenticate ( http ) ) != 0 ) {
784  DBGC ( http, "HTTP %p could not authenticate: %s\n",
785  http, strerror ( rc ) );
786  return rc;
787  }
788  }
789 
790  /* Restart content decoding interfaces */
791  intfs_restart ( http->response.rc, &http->content, &http->transfer,
792  NULL );
793  intf_plug_plug ( &http->transfer, &http->content );
794  http->len = 0;
795  assert ( http->remaining == 0 );
796 
797  /* Retry immediately if applicable. We cannot rely on an
798  * immediate timer expiry, since certain Microsoft-designed
799  * HTTP extensions such as NTLM break the fundamentally
800  * stateless nature of HTTP and rely on the same connection
801  * being reused for authentication. See RFC7230 section 2.3
802  * for further details.
803  */
804  if ( ! http->response.retry_after ) {
805  http_reopen ( http );
806  return 0;
807  }
808 
809  /* Start timer to initiate retry */
810  DBGC2 ( http, "HTTP %p retrying after %d seconds\n",
811  http, http->response.retry_after );
812  start_timer_fixed ( &http->timer,
813  ( http->response.retry_after * TICKS_PER_SEC ) );
814  return 0;
815 }
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:279
static int http_redirect(struct http_transaction *http, const char *location)
Redirect HTTP transaction.
Definition: httpcore.c:697
#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:441
An HTTP authentication scheme.
Definition: http.h:516
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
static void void * auth
Definition: crypto.h:264
struct http_request request
Request.
Definition: http.h:434
Keep connection alive after close.
Definition: http.h:356
struct http_response response
Response.
Definition: http.h:436
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
size_t len
Accumulated transfer-decoded length.
Definition: http.h:443
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
struct retry_timer timer
Reconnection timer.
Definition: http.h:429
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:64
#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:309
size_t remaining
Chunk length remaining.
Definition: http.h:445
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
unsigned int retry_after
Retry delay (in seconds)
Definition: http.h:348

References assert(), http_request_auth::auth, http_request::auth, auth, http_response_auth::auth, http_response::auth, 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, NULL, pool_recycle(), http_response::rc, rc, http_transaction::remaining, http_transaction::request, http_transaction::response, http_response::retry_after, start_timer_fixed(), http_transaction::state, strerror(), TICKS_PER_SEC, http_transaction::timer, and http_transaction::transfer.

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 832 of file httpcore.c.

833  {
834  struct parameters *params = http->uri->params;
835  struct http_request_header *header;
836  struct parameter *param;
837  size_t used;
838  size_t remaining;
839  char *line;
840  int value_len;
841  int rc;
842 
843  /* Construct request line */
844  used = ssnprintf ( buf, len, "%s %s HTTP/1.1",
845  http->request.method->name, http->request.uri );
846  if ( used < len )
847  DBGC2 ( http, "HTTP %p TX %s\n", http, buf );
848  used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
849 
850  /* Construct all fixed headers */
852 
853  /* Determine header value length */
854  value_len = header->format ( http, NULL, 0 );
855  if ( value_len < 0 ) {
856  rc = value_len;
857  return rc;
858  }
859 
860  /* Skip zero-length headers */
861  if ( ! value_len )
862  continue;
863 
864  /* Construct header */
865  line = ( buf + used );
866  used += ssnprintf ( ( buf + used ), ( len - used ), "%s: ",
867  header->name );
868  remaining = ( ( used < len ) ? ( len - used ) : 0 );
869  used += header->format ( http, ( buf + used ), remaining );
870  if ( used < len )
871  DBGC2 ( http, "HTTP %p TX %s\n", http, line );
872  used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
873  }
874 
875  /* Construct parameter headers, if any */
876  if ( params ) {
877 
878  /* Construct all parameter headers */
879  for_each_param ( param, params ) {
880 
881  /* Skip non-header parameters */
882  if ( ! ( param->flags & PARAMETER_HEADER ) )
883  continue;
884 
885  /* Add parameter */
886  used += ssnprintf ( ( buf + used ), ( len - used ),
887  "%s: %s\r\n", param->key,
888  param->value );
889  }
890  }
891 
892  /* Construct terminating newline */
893  used += ssnprintf ( ( buf + used ), ( len - used ), "\r\n" );
894 
895  return used;
896 }
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:432
An HTTP request header.
Definition: http.h:226
struct http_request request
Request.
Definition: http.h:434
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
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
uint32_t len
Length.
Definition: ena.h:14
#define DBGC2(...)
Definition: compiler.h:522
#define HTTP_REQUEST_HEADERS
HTTP request header table.
Definition: http.h:241
struct ena_aq_header header
Header.
Definition: ena.h:12
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 906 of file httpcore.c.

907  {
908 
909  /* Construct host URI */
910  return snprintf ( buf, len, "%s", http->request.host );
911 }
const char * host
Server host name.
Definition: http.h:216
struct http_request request
Request.
Definition: http.h:434
uint32_t len
Length.
Definition: ena.h:14
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 927 of file httpcore.c.

928  {
929 
930  /* Construct user agent */
931  return snprintf ( buf, len, "iPXE/%s", product_version );
932 }
const char product_version[]
Product version string.
Definition: version.c:70
uint32_t len
Length.
Definition: ena.h:14
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 948 of file httpcore.c.

949  {
950 
951  /* Always request keep-alive */
952  return snprintf ( buf, len, "keep-alive" );
953 }
uint32_t len
Length.
Definition: ena.h:14
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 969 of file httpcore.c.

970  {
971 
972  /* Construct range, if applicable */
973  if ( http->request.range.len ) {
974  return snprintf ( buf, len, "bytes=%zd-%zd",
975  http->request.range.start,
976  ( http->request.range.start +
977  http->request.range.len - 1 ) );
978  } else {
979  return 0;
980  }
981 }
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:434
size_t len
Range length, or zero for no range request.
Definition: http.h:139
uint32_t len
Length.
Definition: ena.h:14
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References len, http_request_range::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 997 of file httpcore.c.

998  {
999 
1000  /* Construct content type, if applicable */
1001  if ( http->request.content.type ) {
1002  return snprintf ( buf, len, "%s", http->request.content.type );
1003  } else {
1004  return 0;
1005  }
1006 }
struct http_request request
Request.
Definition: http.h:434
struct http_request_content content
Content descriptor.
Definition: http.h:220
const char * type
Content type (if any)
Definition: http.h:145
uint32_t len
Length.
Definition: ena.h:14
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 1022 of file httpcore.c.

1023  {
1024 
1025  /* Construct content length, if applicable */
1026  if ( http->request.content.len ) {
1027  return snprintf ( buf, len, "%zd", http->request.content.len );
1028  } else {
1029  return 0;
1030  }
1031 }
struct http_request request
Request.
Definition: http.h:434
struct http_request_content content
Content descriptor.
Definition: http.h:220
size_t len
Content length.
Definition: http.h:149
uint32_t len
Length.
Definition: ena.h:14
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_request_content::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 1047 of file httpcore.c.

1048  {
1049  struct http_content_encoding *encoding;
1050  const char *sep = "";
1051  size_t used = 0;
1052 
1053  /* Construct list of content encodings */
1055  if ( encoding->supported && ( ! encoding->supported ( http ) ) )
1056  continue;
1057  used += ssnprintf ( ( buf + used ), ( len - used ),
1058  "%s%s", sep, encoding->name );
1059  sep = ", ";
1060  }
1061 
1062  return used;
1063 }
An HTTP content encoding.
Definition: http.h:484
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 * name
Name.
Definition: http.h:486
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
uint32_t len
Length.
Definition: ena.h:14
int(* supported)(struct http_transaction *http)
Check if content encoding is supported for this request.
Definition: http.h:492
#define HTTP_CONTENT_ENCODINGS
HTTP content encoding table.
Definition: http.h:502

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 1077 of file httpcore.c.

1077  {
1078  struct io_buffer *iobuf;
1079  int len;
1080  int check_len;
1081  int rc;
1082 
1083  /* Calculate request length */
1084  len = http_format_headers ( http, NULL, 0 );
1085  if ( len < 0 ) {
1086  rc = len;
1087  DBGC ( http, "HTTP %p could not construct request: %s\n",
1088  http, strerror ( rc ) );
1089  goto err_len;
1090  }
1091 
1092  /* Allocate I/O buffer */
1093  iobuf = alloc_iob ( len + 1 /* NUL */ + http->request.content.len );
1094  if ( ! iobuf ) {
1095  rc = -ENOMEM;
1096  goto err_alloc;
1097  }
1098 
1099  /* Construct request */
1100  check_len = http_format_headers ( http, iob_put ( iobuf, len ),
1101  ( len + 1 /* NUL */ ) );
1102  assert ( check_len == len );
1103  memcpy ( iob_put ( iobuf, http->request.content.len ),
1104  http->request.content.data, http->request.content.len );
1105 
1106  /* Deliver request */
1107  if ( ( rc = xfer_deliver_iob ( &http->conn,
1108  iob_disown ( iobuf ) ) ) != 0 ) {
1109  DBGC ( http, "HTTP %p could not deliver request: %s\n",
1110  http, strerror ( rc ) );
1111  goto err_deliver;
1112  }
1113 
1114  /* Clear any previous response */
1115  empty_line_buffer ( &http->response.headers );
1116  memset ( &http->response, 0, sizeof ( http->response ) );
1117 
1118  /* Move to response headers state */
1119  http->state = &http_headers;
1120 
1121  return 0;
1122 
1123  err_deliver:
1124  free_iob ( iobuf );
1125  err_alloc:
1126  err_len:
1127  return rc;
1128 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:120
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:146
#define DBGC(...)
Definition: compiler.h:505
struct http_state * state
Transaction state.
Definition: http.h:441
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:129
struct http_request request
Request.
Definition: http.h:434
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:212
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct http_response response
Response.
Definition: http.h:436
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
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
uint32_t len
Length.
Definition: ena.h:14
static struct http_state http_headers
HTTP response headers state.
Definition: httpcore.c:123
static int http_format_headers(struct http_transaction *http, char *buf, size_t len)
Construct HTTP request headers.
Definition: httpcore.c:832
#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:33

References alloc_iob(), 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, len, http_request_content::len, memcpy(), memset(), NULL, rc, http_transaction::request, http_transaction::response, http_transaction::state, strerror(), 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 1150 of file httpcore.c.

1150  {
1151  char *endp;
1152  char *version;
1153  char *vernum;
1154  char *status;
1155  int response_rc;
1156 
1157  DBGC2 ( http, "HTTP %p RX %s\n", http, line );
1158 
1159  /* Parse HTTP version */
1160  version = http_token ( &line, NULL );
1161  if ( ( ! version ) || ( strncmp ( version, "HTTP/", 5 ) != 0 ) ) {
1162  DBGC ( http, "HTTP %p malformed version \"%s\"\n", http, line );
1163  return -EINVAL_STATUS;
1164  }
1165 
1166  /* Keepalive is enabled by default for anything newer than HTTP/1.0 */
1167  vernum = ( version + 5 /* "HTTP/" (presence already checked) */ );
1168  if ( vernum[0] == '0' ) {
1169  /* HTTP/0.x : keepalive not enabled by default */
1170  } else if ( strncmp ( vernum, "1.0", 3 ) == 0 ) {
1171  /* HTTP/1.0 : keepalive not enabled by default */
1172  } else {
1173  /* HTTP/1.1 or newer: keepalive enabled by default */
1175  }
1176 
1177  /* Parse status code */
1178  status = line;
1179  http->response.status = strtoul ( status, &endp, 10 );
1180  if ( *endp != ' ' ) {
1181  DBGC ( http, "HTTP %p malformed status code \"%s\"\n",
1182  http, status );
1183  return -EINVAL_STATUS;
1184  }
1185 
1186  /* Convert HTTP status code to iPXE return status code */
1187  if ( status[0] == '2' ) {
1188  /* 2xx Success */
1189  response_rc = 0;
1190  } else if ( status[0] == '3' ) {
1191  /* 3xx Redirection */
1192  response_rc = -EXDEV;
1193  } else if ( http->response.status == 401 ) {
1194  /* 401 Unauthorized */
1195  response_rc = -EACCES_401;
1196  } else if ( http->response.status == 403 ) {
1197  /* 403 Forbidden */
1198  response_rc = -EPERM_403;
1199  } else if ( http->response.status == 404 ) {
1200  /* 404 Not Found */
1201  response_rc = -ENOENT_404;
1202  } else if ( status[0] == '4' ) {
1203  /* 4xx Client Error (not already specified) */
1204  response_rc = -EIO_4XX;
1205  } else if ( status[0] == '5' ) {
1206  /* 5xx Server Error */
1207  response_rc = -EIO_5XX;
1208  } else {
1209  /* Unrecognised */
1210  response_rc = -EIO_OTHER;
1211  }
1212  http->response.rc = response_rc;
1213  if ( response_rc )
1214  DBGC ( http, "HTTP %p status %s\n", http, status );
1215 
1216  return 0;
1217 }
#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:471
#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
uint8_t status
Status.
Definition: ena.h:16
#define EINVAL_STATUS
Definition: httpcore.c:66
Keep connection alive after close.
Definition: http.h:356
struct http_response response
Response.
Definition: http.h:436
#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:192
u32 version
Driver version.
Definition: ath9k_hw.c:1983
#define EIO_5XX
Definition: httpcore.c:87
#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 1226 of file httpcore.c.

1226  {
1227  struct http_response_header *header;
1228  char *name = line;
1229  char *sep;
1230 
1231  DBGC2 ( http, "HTTP %p RX %s\n", http, line );
1232 
1233  /* Extract header name */
1234  sep = strchr ( line, ':' );
1235  if ( ! sep ) {
1236  DBGC ( http, "HTTP %p malformed header \"%s\"\n", http, line );
1237  return -EINVAL_HEADER;
1238  }
1239  *sep = '\0';
1240 
1241  /* Extract remainder of line */
1242  line = ( sep + 1 );
1243  while ( isspace ( *line ) )
1244  line++;
1245 
1246  /* Process header, if recognised */
1248  if ( strcasecmp ( name, header->name ) == 0 )
1249  return header->parse ( http, line );
1250  }
1251 
1252  /* Unrecognised headers should be ignored */
1253  return 0;
1254 }
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_aq_header header
Header.
Definition: ena.h:12
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 1262 of file httpcore.c.

1262  {
1263  char *line;
1264  char *next;
1265  int rc;
1266 
1267  /* Get status line */
1268  line = http->response.headers.data;
1269  assert ( line != NULL );
1270  next = ( line + strlen ( line ) + 1 /* NUL */ );
1271 
1272  /* Parse status line */
1273  if ( ( rc = http_parse_status ( http, line ) ) != 0 )
1274  return rc;
1275 
1276  /* Process header lines */
1277  while ( 1 ) {
1278 
1279  /* Move to next line */
1280  line = next;
1281  next = ( line + strlen ( line ) + 1 /* NUL */ );
1282 
1283  /* Stop on terminating blank line */
1284  if ( ! line[0] )
1285  return 0;
1286 
1287  /* Process header line */
1288  if ( ( rc = http_parse_header ( http, line ) ) != 0 )
1289  return rc;
1290  }
1291 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint32_t next
Next descriptor address.
Definition: myson.h:18
static int http_parse_header(struct http_transaction *http, char *line)
Parse HTTP header.
Definition: httpcore.c:1226
char * data
Data buffer.
Definition: linebuf.h:18
struct http_response response
Response.
Definition: http.h:436
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
static int http_parse_status(struct http_transaction *http, char *line)
Parse HTTP status line.
Definition: httpcore.c:1150
#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 1300 of file httpcore.c.

1300  {
1301 
1302  /* Store location */
1303  http->response.location = line;
1304  return 0;
1305 }
const char * location
Redirection location.
Definition: http.h:340
struct http_response response
Response.
Definition: http.h:436

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 1320 of file httpcore.c.

1321  {
1322  struct http_transfer_encoding *encoding;
1323 
1324  /* Check for known transfer encodings */
1326  if ( strcasecmp ( line, encoding->name ) == 0 ) {
1327  http->response.transfer.encoding = encoding;
1328  return 0;
1329  }
1330  }
1331 
1332  DBGC ( http, "HTTP %p unrecognised Transfer-Encoding \"%s\"\n",
1333  http, line );
1334  return -ENOTSUP_TRANSFER;
1335 }
#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:436
#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:470
struct http_response_transfer transfer
Transfer descriptor.
Definition: http.h:342
const char * name
Name.
Definition: http.h:458
An HTTP transfer encoding.
Definition: http.h:456

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 1351 of file httpcore.c.

1351  {
1352  char *token;
1353 
1354  /* Check for known connection intentions */
1355  while ( ( token = http_token ( &line, NULL ) ) ) {
1356  if ( strcasecmp ( token, "keep-alive" ) == 0 )
1358  if ( strcasecmp ( token, "close" ) == 0 )
1360  }
1361 
1362  return 0;
1363 }
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:436
char * http_token(char **line, char **value)
Get HTTP response token.
Definition: httpcore.c:192
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 1378 of file httpcore.c.

1379  {
1380  char *endp;
1381 
1382  /* Parse length */
1383  http->response.content.len = strtoul ( line, &endp, 10 );
1384  if ( *endp != '\0' ) {
1385  DBGC ( http, "HTTP %p invalid Content-Length \"%s\"\n",
1386  http, line );
1387  return -EINVAL_CONTENT_LENGTH;
1388  }
1389 
1390  /* Record that we have a content length (since it may be zero) */
1392 
1393  return 0;
1394 }
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:471
#define DBGC(...)
Definition: compiler.h:505
struct http_response response
Response.
Definition: http.h:436
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 1410 of file httpcore.c.

1411  {
1412  struct http_content_encoding *encoding;
1413 
1414  /* Check for known content encodings */
1416  if ( encoding->supported && ( ! encoding->supported ( http ) ) )
1417  continue;
1418  if ( strcasecmp ( line, encoding->name ) == 0 ) {
1419  http->response.content.encoding = encoding;
1420  return 0;
1421  }
1422  }
1423 
1424  /* Some servers (e.g. Apache) have a habit of specifying
1425  * unwarranted content encodings. For example, if Apache
1426  * detects (via /etc/httpd/conf/magic) that a file's contents
1427  * are gzip-compressed, it will set "Content-Encoding: x-gzip"
1428  * regardless of the client's Accept-Encoding header. The
1429  * only viable way to handle such servers is to treat unknown
1430  * content encodings as equivalent to "identity".
1431  */
1432  DBGC ( http, "HTTP %p unrecognised Content-Encoding \"%s\"\n",
1433  http, line );
1434  return 0;
1435 }
#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:484
struct http_response response
Response.
Definition: http.h:436
struct http_response_content content
Content descriptor.
Definition: http.h:344
const char * name
Name.
Definition: http.h:486
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:492
#define HTTP_CONTENT_ENCODINGS
HTTP content encoding table.
Definition: http.h:502

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 1451 of file httpcore.c.

1452  {
1453  char *endp;
1454 
1455  /* Try to parse value as a simple number of seconds */
1456  http->response.retry_after = strtoul ( line, &endp, 10 );
1457  if ( *endp != '\0' ) {
1458  /* For any value which is not a simple number of
1459  * seconds (e.g. a full HTTP date), just retry after a
1460  * fixed delay, since we don't have code able to parse
1461  * full HTTP dates.
1462  */
1464  DBGC ( http, "HTTP %p cannot understand Retry-After \"%s\"; "
1465  "using %d seconds\n", http, line, HTTP_RETRY_SECONDS );
1466  }
1467 
1468  /* Allow HTTP request to be retried after specified delay */
1470 
1471  return 0;
1472 }
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:471
#define DBGC(...)
Definition: compiler.h:505
struct http_response response
Response.
Definition: http.h:436
#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 1487 of file httpcore.c.

1488  {
1489  struct http_transfer_encoding *transfer;
1490  struct http_content_encoding *content;
1491  char *line;
1492  int rc;
1493 
1494  /* Buffer header line */
1495  if ( ( rc = http_rx_linebuf ( http, *iobuf,
1496  &http->response.headers ) ) != 0 )
1497  return rc;
1498 
1499  /* Wait until we see the empty line marking end of headers */
1500  line = buffered_line ( &http->response.headers );
1501  if ( ( line == NULL ) || ( line[0] != '\0' ) )
1502  return 0;
1503 
1504  /* Process headers */
1505  if ( ( rc = http_parse_headers ( http ) ) != 0 )
1506  return rc;
1507 
1508  /* Initialise content encoding, if applicable */
1509  if ( ( content = http->response.content.encoding ) &&
1510  ( ( rc = content->init ( http ) ) != 0 ) ) {
1511  DBGC ( http, "HTTP %p could not initialise %s content "
1512  "encoding: %s\n", http, content->name, strerror ( rc ) );
1513  return rc;
1514  }
1515 
1516  /* Presize receive buffer, if we have a content length */
1517  if ( http->response.content.len ) {
1518  xfer_seek ( &http->transfer, http->response.content.len );
1519  xfer_seek ( &http->transfer, 0 );
1520  }
1521 
1522  /* Complete transfer if this is a HEAD request */
1523  if ( http->request.method == &http_head ) {
1524  if ( ( rc = http_transfer_complete ( http ) ) != 0 )
1525  return rc;
1526  return 0;
1527  }
1528 
1529  /* Default to identity transfer encoding, if none specified */
1530  if ( ! http->response.transfer.encoding )
1532 
1533  /* Move to transfer encoding-specific data state */
1534  transfer = http->response.transfer.encoding;
1535  http->state = &transfer->state;
1536 
1537  /* Initialise transfer encoding */
1538  if ( ( rc = transfer->init ( http ) ) != 0 ) {
1539  DBGC ( http, "HTTP %p could not initialise %s transfer "
1540  "encoding: %s\n", http, transfer->name, strerror ( rc ));
1541  return rc;
1542  }
1543 
1544  return 0;
1545 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct http_method http_head
HTTP HEAD method.
Definition: httpcore.c:135
static int http_parse_headers(struct http_transaction *http)
Parse HTTP response headers.
Definition: httpcore.c:1262
static struct http_transfer_encoding http_transfer_identity
Identity transfer encoding.
Definition: httpcore.c:125
#define DBGC(...)
Definition: compiler.h:505
struct http_state * state
Transaction state.
Definition: http.h:441
An HTTP content encoding.
Definition: http.h:484
struct http_request request
Request.
Definition: http.h:434
struct http_transfer_encoding * encoding
Transfer encoding.
Definition: http.h:257
struct http_response response
Response.
Definition: http.h:436
struct http_response_content content
Content descriptor.
Definition: http.h:344
const char * name
Name.
Definition: http.h:486
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:741
struct http_method * method
Method.
Definition: http.h:212
int(* init)(struct http_transaction *http)
Initialise transfer encoding.
Definition: http.h:464
const char * name
Name.
Definition: http.h:458
struct http_state state
Receive data state.
Definition: http.h:466
An HTTP transfer encoding.
Definition: http.h:456
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:164
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
int(* init)(struct http_transaction *http)
Initialise content encoding.
Definition: http.h:498

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 1566 of file httpcore.c.

1566  {
1567  int rc;
1568 
1569  /* Complete transfer immediately if we have a zero content length */
1570  if ( ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) &&
1571  ( http->response.content.len == 0 ) &&
1572  ( ( rc = http_transfer_complete ( http ) ) != 0 ) )
1573  return rc;
1574 
1575  return 0;
1576 }
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:436
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:741

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 1585 of file httpcore.c.

1586  {
1587  size_t len = iob_len ( *iobuf );
1588  int rc;
1589 
1590  /* Update lengths */
1591  http->len += len;
1592 
1593  /* Fail if this transfer would overrun the expected content
1594  * length (if any).
1595  */
1596  if ( ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) &&
1597  ( http->len > http->response.content.len ) ) {
1598  DBGC ( http, "HTTP %p content length overrun\n", http );
1599  return -EIO_CONTENT_LENGTH;
1600  }
1601 
1602  /* Hand off to content encoding */
1603  if ( ( rc = xfer_deliver_iob ( &http->transfer,
1604  iob_disown ( *iobuf ) ) ) != 0 )
1605  return rc;
1606 
1607  /* Complete transfer if we have received the expected content
1608  * length (if any).
1609  */
1610  if ( ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) &&
1611  ( http->len == http->response.content.len ) &&
1612  ( ( rc = http_transfer_complete ( http ) ) != 0 ) )
1613  return rc;
1614 
1615  return 0;
1616 }
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:212
struct http_response response
Response.
Definition: http.h:436
size_t len
Accumulated transfer-decoded length.
Definition: http.h:443
struct http_response_content content
Content descriptor.
Definition: http.h:344
#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:155
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
uint32_t len
Length.
Definition: ena.h:14
static int http_transfer_complete(struct http_transaction *http)
Handle successful transfer completion.
Definition: httpcore.c:741

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 1624 of file httpcore.c.

1625  {
1626 
1627  /* Fail if any error occurred */
1628  if ( rc != 0 )
1629  goto err;
1630 
1631  /* Fail if we have a content length (since we would have
1632  * already closed the connection if we had received the
1633  * correct content length).
1634  */
1635  if ( http->response.flags & HTTP_RESPONSE_CONTENT_LEN ) {
1636  DBGC ( http, "HTTP %p content length underrun\n", http );
1638  goto err;
1639  }
1640 
1641  /* Indicate that transfer is complete */
1642  if ( ( rc = http_transfer_complete ( http ) ) != 0 )
1643  goto err;
1644 
1645  return;
1646 
1647  err:
1648  http_close ( http, rc );
1649 }
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:279
#define DBGC(...)
Definition: compiler.h:505
struct http_response response
Response.
Definition: http.h:436
#define EIO_CONTENT_LENGTH
Definition: httpcore.c:81
static int http_transfer_complete(struct http_transaction *http)
Handle successful transfer completion.
Definition: httpcore.c:741

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 1674 of file httpcore.c.

1674  {
1675 
1676  /* Sanity checks */
1677  assert ( http->remaining == 0 );
1678  assert ( http->linebuf.len == 0 );
1679 
1680  return 0;
1681 }
struct line_buffer linebuf
Temporary line buffer.
Definition: http.h:438
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:445

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 1690 of file httpcore.c.

1691  {
1692  char *line;
1693  char *endp;
1694  size_t len;
1695  int rc;
1696 
1697  /* Receive into temporary line buffer */
1698  if ( ( rc = http_rx_linebuf ( http, *iobuf, &http->linebuf ) ) != 0 )
1699  return rc;
1700 
1701  /* Wait until we receive a non-empty line */
1702  line = buffered_line ( &http->linebuf );
1703  if ( ( line == NULL ) || ( line[0] == '\0' ) )
1704  return 0;
1705 
1706  /* Parse chunk length */
1707  http->remaining = strtoul ( line, &endp, 16 );
1708  if ( *endp != '\0' ) {
1709  DBGC ( http, "HTTP %p invalid chunk length \"%s\"\n",
1710  http, line );
1711  return -EINVAL_CHUNK_LENGTH;
1712  }
1713 
1714  /* Empty line buffer */
1715  empty_line_buffer ( &http->linebuf );
1716 
1717  /* Update expected length */
1718  len = ( http->len + http->remaining );
1719  xfer_seek ( &http->transfer, len );
1720  xfer_seek ( &http->transfer, http->len );
1721 
1722  /* If chunk length is zero, then move to response trailers state */
1723  if ( ! http->remaining )
1724  http->state = &http_trailers;
1725 
1726  return 0;
1727 }
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:471
struct line_buffer linebuf
Temporary line buffer.
Definition: http.h:438
#define DBGC(...)
Definition: compiler.h:505
struct http_state * state
Transaction state.
Definition: http.h:441
size_t len
Accumulated transfer-decoded length.
Definition: http.h:443
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
uint32_t len
Length.
Definition: ena.h:14
size_t remaining
Chunk length remaining.
Definition: http.h:445
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:164
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static struct http_state http_trailers
HTTP response trailers state.
Definition: httpcore.c:124

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 1736 of file httpcore.c.

1737  {
1738  struct io_buffer *payload;
1739  uint8_t *crlf;
1740  size_t len;
1741  int rc;
1742 
1743  /* In the common case of a final chunk in a packet which also
1744  * includes the terminating CRLF, strip the terminating CRLF
1745  * (which we would ignore anyway) and hence avoid
1746  * unnecessarily copying the data.
1747  */
1748  if ( iob_len ( *iobuf ) == ( http->remaining + 2 /* CRLF */ ) ) {
1749  crlf = ( (*iobuf)->data + http->remaining );
1750  if ( ( crlf[0] == '\r' ) && ( crlf[1] == '\n' ) )
1751  iob_unput ( (*iobuf), 2 /* CRLF */ );
1752  }
1753  len = iob_len ( *iobuf );
1754 
1755  /* Use whole/partial buffer as applicable */
1756  if ( len <= http->remaining ) {
1757 
1758  /* Whole buffer is to be consumed: decrease remaining
1759  * length and use original I/O buffer as payload.
1760  */
1761  payload = iob_disown ( *iobuf );
1762  http->len += len;
1763  http->remaining -= len;
1764 
1765  } else {
1766 
1767  /* Partial buffer is to be consumed: copy data to a
1768  * temporary I/O buffer.
1769  */
1770  payload = alloc_iob ( http->remaining );
1771  if ( ! payload ) {
1772  rc = -ENOMEM;
1773  goto err;
1774  }
1775  memcpy ( iob_put ( payload, http->remaining ), (*iobuf)->data,
1776  http->remaining );
1777  iob_pull ( *iobuf, http->remaining );
1778  http->len += http->remaining;
1779  http->remaining = 0;
1780  }
1781 
1782  /* Hand off to content encoding */
1783  if ( ( rc = xfer_deliver_iob ( &http->transfer,
1784  iob_disown ( payload ) ) ) != 0 )
1785  goto err;
1786 
1787  return 0;
1788 
1789  err:
1790  assert ( payload == NULL );
1791  return rc;
1792 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:102
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:120
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:129
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:212
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:443
#define iob_unput(iobuf, len)
Definition: iobuf.h:135
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
struct interface transfer
Transfer-decoded interface.
Definition: http.h:423
unsigned char uint8_t
Definition: stdint.h:10
uint32_t len
Length.
Definition: ena.h:14
size_t remaining
Chunk length remaining.
Definition: http.h:445
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A persistent I/O buffer.
Definition: iobuf.h:33

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 1801 of file httpcore.c.

1802  {
1803 
1804  /* Handle as chunk length or chunk data as appropriate */
1805  if ( http->remaining ) {
1806  return http_rx_chunk_data ( http, iobuf );
1807  } else {
1808  return http_rx_chunk_len ( http, iobuf );
1809  }
1810 }
static int http_rx_chunk_len(struct http_transaction *http, struct io_buffer **iobuf)
Handle received chunk length.
Definition: httpcore.c:1690
size_t remaining
Chunk length remaining.
Definition: http.h:445
static int http_rx_chunk_data(struct http_transaction *http, struct io_buffer **iobuf)
Handle received chunk data.
Definition: httpcore.c:1736

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 1836 of file httpcore.c.

1837  {
1838  char *line;
1839  int rc;
1840 
1841  /* Buffer trailer line */
1842  if ( ( rc = http_rx_linebuf ( http, *iobuf, &http->linebuf ) ) != 0 )
1843  return rc;
1844 
1845  /* Wait until we see the empty line marking end of trailers */
1846  line = buffered_line ( &http->linebuf );
1847  if ( ( line == NULL ) || ( line[0] != '\0' ) )
1848  return 0;
1849 
1850  /* Empty line buffer */
1851  empty_line_buffer ( &http->linebuf );
1852 
1853  /* Transfer is complete */
1854  if ( ( rc = http_transfer_complete ( http ) ) != 0 )
1855  return rc;
1856 
1857  return 0;
1858 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct line_buffer linebuf
Temporary line buffer.
Definition: http.h:438
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:741
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:164
#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 1881 of file httpcore.c.

1882  {
1883  struct parameter *param;
1884  ssize_t remaining = len;
1885  size_t frag_len;
1886 
1887  /* Add each parameter in the form "key=value", joined with "&" */
1888  len = 0;
1889  for_each_param ( param, params ) {
1890 
1891  /* Skip non-form parameters */
1892  if ( ! ( param->flags & PARAMETER_FORM ) )
1893  continue;
1894 
1895  /* Add the "&", if applicable */
1896  if ( len ) {
1897  if ( remaining > 0 )
1898  *buf = '&';
1899  buf++;
1900  len++;
1901  remaining--;
1902  }
1903 
1904  /* URI-encode the key */
1905  frag_len = uri_encode_string ( 0, param->key, buf, remaining );
1906  buf += frag_len;
1907  len += frag_len;
1908  remaining -= frag_len;
1909 
1910  /* Add the "=" */
1911  if ( remaining > 0 )
1912  *buf = '=';
1913  buf++;
1914  len++;
1915  remaining--;
1916 
1917  /* URI-encode the value */
1918  frag_len = uri_encode_string ( 0, param->value, buf, remaining);
1919  buf += frag_len;
1920  len += frag_len;
1921  remaining -= frag_len;
1922  }
1923 
1924  /* Ensure string is NUL-terminated even if no parameters are present */
1925  if ( remaining > 0 )
1926  *buf = '\0';
1927 
1928  return len;
1929 }
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
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
uint32_t len
Length.
Definition: ena.h:14
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 1938 of file httpcore.c.

1938  {
1939  struct parameters *params = uri->params;
1940  struct http_request_content content;
1941  struct http_method *method;
1942  const char *type;
1943  void *data;
1944  size_t len;
1945  size_t check_len;
1946  int rc;
1947 
1948  /* Calculate length of form parameter list, if any */
1949  len = ( params ? http_form_params ( params, NULL, 0 ) : 0 );
1950 
1951  /* Use POST if and only if there are form parameters */
1952  if ( len ) {
1953 
1954  /* Use POST */
1955  method = &http_post;
1956  type = "application/x-www-form-urlencoded";
1957 
1958  /* Allocate temporary form parameter list */
1959  data = zalloc ( len + 1 /* NUL */ );
1960  if ( ! data ) {
1961  rc = -ENOMEM;
1962  goto err_alloc;
1963  }
1964 
1965  /* Construct temporary form parameter list */
1966  check_len = http_form_params ( params, data,
1967  ( len + 1 /* NUL */ ) );
1968  assert ( check_len == len );
1969 
1970  } else {
1971 
1972  /* Use GET */
1973  method = &http_get;
1974  type = NULL;
1975  data = NULL;
1976  }
1977 
1978  /* Construct request content */
1979  content.type = type;
1980  content.data = data;
1981  content.len = len;
1982 
1983  /* Open HTTP transaction */
1984  if ( ( rc = http_open ( xfer, method, uri, NULL, &content ) ) != 0 )
1985  goto err_open;
1986 
1987  err_open:
1988  free ( data );
1989  err_alloc:
1990  return rc;
1991 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
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)
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:140
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
static size_t http_form_params(struct parameters *params, char *buf, size_t len)
Construct HTTP form parameter list.
Definition: httpcore.c:1881
uint32_t len
Length.
Definition: ena.h:14
uint32_t type
Operating system type.
Definition: ena.h:12
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:602
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:145

References assert(), data, http_request_content::data, ENOMEM, free, http_form_params(), http_get, http_open(), http_post, len, http_request_content::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 110 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 116 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:1077
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:298

HTTP request state.

Definition at line 122 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:1487
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:298

HTTP response headers state.

Definition at line 123 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:1836
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:298

HTTP response trailers state.

Definition at line 124 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:1585
static void http_close_transfer_identity(struct http_transaction *http, int rc)
Handle server connection close.
Definition: httpcore.c:1624
static int http_init_transfer_identity(struct http_transaction *http)
Initialise transfer encoding.
Definition: httpcore.c:1566

Identity transfer encoding.

Definition at line 125 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 135 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 140 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 145 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:279
__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:518
int block_read(struct interface *control, struct interface *data, uint64_t lba, unsigned int count, userptr_t buffer, size_t len)
Read from block device.
Definition: blockdev.c:47
static EFI_DEVICE_PATH_PROTOCOL * http_efi_describe(struct http_transaction *http)
Describe as an EFI device path.
Definition: httpcore.c:531
An HTTP transaction.
Definition: http.h:415
#define EFI_INTF_OP
Definition: efi.h:350
#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:680
__weak int http_block_read(struct http_transaction *http __unused, struct interface *data __unused, uint64_t lba __unused, unsigned int count __unused, userptr_t buffer __unused, size_t len __unused)
Read from block device (when HTTP block device support is not present)
Definition: httpcore.c:503
static void http_step(struct http_transaction *http)
HTTP transmit process.
Definition: httpcore.c:353
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 537 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:537
#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 548 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:19
static void http_close(struct http_transaction *http, int rc)
Close HTTP transaction.
Definition: httpcore.c:279
static struct xfer_buffer * http_content_buffer(struct http_transaction *http)
Get underlying data transfer buffer.
Definition: httpcore.c:480
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:450
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 553 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:553
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 561 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:279
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 566 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:566
#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 571 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:391
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:309
static void http_step(struct http_transaction *http)
HTTP transmit process.
Definition: httpcore.c:353
static void http_conn_close(struct http_transaction *http, int rc)
Handle server connection close.
Definition: httpcore.c:430

HTTP server connection interface operations.

Definition at line 576 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:576
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 584 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:353

HTTP process descriptor.

Definition at line 589 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:906

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 914 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:1300

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 1308 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:1801
static int http_init_transfer_chunked(struct http_transaction *http)
Initialise transfer encoding.
Definition: httpcore.c:1674
static void http_close_error(struct http_transaction *http, int rc)
Close HTTP transaction with error (even if none specified)
Definition: httpcore.c:298

Chunked transfer encoding.

Definition at line 1813 of file httpcore.c.