#ifndef _GPXE_HTTP_H
#define _GPXE_HTTP_H

/** @file
 *
 * Hyper Text Transport Protocol
 *
 */

#include <stdint.h>
#include <gpxe/stream.h>
#include <gpxe/async.h>
#include <gpxe/linebuf.h>
#include <gpxe/uri.h>

/** HTTP default port */
#define HTTP_PORT 80

/** HTTPS default port */
#define HTTPS_PORT 443

/** HTTP receive state */
enum http_rx_state {
	HTTP_RX_RESPONSE = 0,
	HTTP_RX_HEADER,
	HTTP_RX_DATA,
	HTTP_RX_DEAD,
};

/**
 * An HTTP request
 *
 */
struct http_request {
	/** URI being fetched */
	struct uri *uri;
	/** Data buffer to fill */
	struct buffer *buffer;
	/** Asynchronous operation */
	struct async async;

	/** HTTP response code */
	unsigned int response;
	/** HTTP Content-Length */
	size_t content_length;

	/** Server address */
	struct sockaddr server;
	/** Stream application for this request */
	struct stream_application stream;
	/** Number of bytes already sent */
	size_t tx_offset;
	/** RX state */
	enum http_rx_state rx_state;
	/** Line buffer for received header lines */
	struct line_buffer linebuf;
};

extern int http_get ( struct uri *uri, struct buffer *buffer,
		      struct async *parent );

#endif /* _GPXE_HTTP_H */
