/* See LICENSE file for copyright and license details. */
|
|
#ifndef HTTP_H
|
|
#define HTTP_H
|
|
|
|
#include <limits.h>
|
|
#include <sys/socket.h>
|
|
|
|
#include "config.h"
|
|
#include "server.h"
|
|
#include "util.h"
|
|
|
|
enum req_field {
|
|
REQ_HOST,
|
|
REQ_RANGE,
|
|
REQ_IF_MODIFIED_SINCE,
|
|
NUM_REQ_FIELDS,
|
|
};
|
|
|
|
extern const char *req_field_str[];
|
|
|
|
enum req_method {
|
|
M_GET,
|
|
M_HEAD,
|
|
NUM_REQ_METHODS,
|
|
};
|
|
|
|
extern const char *req_method_str[];
|
|
|
|
struct request {
|
|
enum req_method method;
|
|
char path[PATH_MAX];
|
|
char query[FIELD_MAX];
|
|
char fragment[FIELD_MAX];
|
|
char field[NUM_REQ_FIELDS][FIELD_MAX];
|
|
};
|
|
|
|
enum status {
|
|
S_OK = 200,
|
|
S_PARTIAL_CONTENT = 206,
|
|
S_MOVED_PERMANENTLY = 301,
|
|
S_NOT_MODIFIED = 304,
|
|
S_BAD_REQUEST = 400,
|
|
S_FORBIDDEN = 403,
|
|
S_NOT_FOUND = 404,
|
|
S_METHOD_NOT_ALLOWED = 405,
|
|
S_REQUEST_TIMEOUT = 408,
|
|
S_RANGE_NOT_SATISFIABLE = 416,
|
|
S_REQUEST_TOO_LARGE = 431,
|
|
S_INTERNAL_SERVER_ERROR = 500,
|
|
S_VERSION_NOT_SUPPORTED = 505,
|
|
};
|
|
|
|
extern const char *status_str[];
|
|
|
|
enum res_field {
|
|
RES_ACCEPT_RANGES,
|
|
RES_ALLOW,
|
|
RES_LOCATION,
|
|
RES_LAST_MODIFIED,
|
|
RES_CONTENT_LENGTH,
|
|
RES_CONTENT_RANGE,
|
|
RES_CONTENT_TYPE,
|
|
NUM_RES_FIELDS,
|
|
};
|
|
|
|
extern const char *res_field_str[];
|
|
|
|
enum res_type {
|
|
RESTYPE_DIRLISTING,
|
|
RESTYPE_ERROR,
|
|
RESTYPE_FILE,
|
|
NUM_RES_TYPES,
|
|
};
|
|
|
|
struct response {
|
|
enum res_type type;
|
|
enum status status;
|
|
char field[NUM_RES_FIELDS][FIELD_MAX];
|
|
char path[PATH_MAX];
|
|
char internal_path[PATH_MAX];
|
|
struct vhost *vhost;
|
|
struct {
|
|
size_t lower;
|
|
size_t upper;
|
|
} file;
|
|
};
|
|
|
|
enum status http_prepare_header_buf(const struct response *, struct buffer *);
|
|
enum status http_send_buf(int, struct buffer *);
|
|
enum status http_recv_header(int, struct buffer *, int *);
|
|
enum status http_parse_header(const char *, struct request *);
|
|
void http_prepare_response(const struct request *, struct response *,
|
|
const struct server *);
|
|
void http_prepare_error_response(const struct request *,
|
|
struct response *, enum status);
|
|
|
|
#endif /* HTTP_H */
|