blob: a16b87c696afb624b7d086389e6a9942e1fab98d [file] [log] [blame] [raw]
/*
Copyright: Boaz segev, 2016-2017
License: MIT
Feel free to copy, use and enjoy according to the license provided.
*/
#ifndef H_HTTP_REQUEST_H
#define H_HTTP_REQUEST_H
typedef struct http_request_s http_request_s;
#include "http.h"
struct http_request_s {
/** the HTTP version, also controlls the `http_request_s` flavor. */
enum HTTP_VERSION http_version;
/** A pointer to the protocol's settings */
const http_settings_s *settings;
/** the HTTP connection identifier. */
intptr_t fd;
/** this is an opaque pointer, intended for request pooling / chaining */
void *udata;
/** points to the HTTP method name. */
const char *method;
/** The portion of the request URL that comes before the '?', if any. */
const char *path;
/** The portion of the request URL that follows the ?, if any. */
const char *query;
/** Points to a version string, if any. */
const char *version;
/** Points to the body's host header value (a required header). */
const char *host;
/** points to the body's content type header, if any. */
const char *content_type;
/** points to the Upgrade header, if any. */
const char *upgrade;
/** points to the Connection header, if any. */
const char *connection;
/** the body's content's length, in bytes (can be 0). */
size_t content_length;
/** Points the body of the request, if the body exists and is stored in
* memory. Otherwise, NULL. */
const char *body_str;
/** points a tmpfile file descriptor containing the body of the request (if
* not in memory). */
int body_file;
/* string lengths */
uint16_t method_len;
uint16_t path_len;
uint16_t query_len;
uint16_t host_len;
uint16_t content_type_len;
uint16_t upgrade_len;
uint16_t version_len;
uint16_t connection_len;
uint16_t headers_count;
};
/* *****************************************************************************
Initialization
***************************************************************************** */
/** Creates / allocates a protocol version's request object. */
http_request_s *http_request_create(enum HTTP_VERSION);
/** Destroys the request object. */
void http_request_destroy(http_request_s *);
/** Recycle's the request object, clearing it's data. */
void http_request_clear(http_request_s *request);
/** Duplicates a request object. */
http_request_s *http_request_dup(http_request_s *);
/* *****************************************************************************
Header Access
***************************************************************************** */
/** searches for a header in the request's data store, returning a `header_s`
* structure with all it's data.
*
* This doesn't effect header iteration.
*/
http_header_s http_request_header_find(http_request_s *request,
const char *header, size_t header_len);
/** Starts iterating the header list, returning the first header. Header
* iteration is NOT thread-safe. */
http_header_s http_request_header_first(http_request_s *request);
/**
* Continues iterating the header list.
*
* Returns NULL header data if at end of list (header.name == NULL);
*
* Header itteration is NOT thread-safe. */
http_header_s http_request_header_next(http_request_s *request);
#endif /* H_HTTP_REQUEST_H */