|
|
|
/* SPDX-License-Identifier: GPL-3.0-or-later */
|
|
|
|
/* Copyright 2022 Ivan Polyakov */
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \file response.h
|
|
|
|
* \brief Response.
|
|
|
|
*/
|
|
|
|
#ifndef RAPIDA_RESPONSE_H_ENTRY
|
|
|
|
#define RAPIDA_RESPONSE_H_ENTRY
|
|
|
|
|
|
|
|
#include "keyval.h"
|
|
|
|
#include "request.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Response statuses.
|
|
|
|
*/
|
|
|
|
enum rpd_res_statuses {
|
|
|
|
rpd_res_st_continue = 100,
|
|
|
|
rpd_res_st_switching_protocols = 101,
|
|
|
|
|
|
|
|
/*! Experimental, check browser compatibility */
|
|
|
|
rpd_res_st_early_hints = 103,
|
|
|
|
|
|
|
|
rpd_res_st_ok = 200,
|
|
|
|
rpd_res_st_created = 201,
|
|
|
|
rpd_res_st_accepted = 202,
|
|
|
|
rpd_res_st_non_authoritative_info = 203,
|
|
|
|
rpd_res_st_no_content = 204,
|
|
|
|
rpd_res_st_reset_content = 205,
|
|
|
|
rpd_res_st_partial_content = 206,
|
|
|
|
|
|
|
|
rpd_res_st_multiple_choices = 300,
|
|
|
|
rpd_res_st_moved_permanently = 301,
|
|
|
|
rpd_res_st_found = 302,
|
|
|
|
rpd_res_st_see_other = 303,
|
|
|
|
rpd_res_st_not_modified = 304,
|
|
|
|
rpd_res_st_temp_redirect = 307,
|
|
|
|
rpd_res_st_perm_redirect = 308,
|
|
|
|
|
|
|
|
rpd_res_st_bad_request = 400,
|
|
|
|
rpd_res_st_unauthorized = 401,
|
|
|
|
rpd_res_st_payment_required = 402,
|
|
|
|
rpd_res_st_forbidden = 403,
|
|
|
|
rpd_res_st_not_found = 404,
|
|
|
|
rpd_res_st_method_not_allowed = 405,
|
|
|
|
rpd_res_st_not_acceptable = 406,
|
|
|
|
rpd_res_st_proxy_auth_required = 407,
|
|
|
|
rpd_res_st_req_timeout = 408,
|
|
|
|
rpd_res_st_conflict = 409,
|
|
|
|
rpd_res_st_gone = 410,
|
|
|
|
rpd_res_st_length_required = 411,
|
|
|
|
rpd_res_st_precondition_failed = 412,
|
|
|
|
rpd_res_st_payload_too_large = 413,
|
|
|
|
rpd_res_st_uri_too_long = 414,
|
|
|
|
rpd_res_st_unsupported_media_type = 415,
|
|
|
|
rpd_res_st_range_not_satisfiable = 416,
|
|
|
|
rpd_res_st_expectation_failed = 417,
|
|
|
|
rpd_res_st_i_am_teapot = 418,
|
|
|
|
rpd_res_st_unprocessable_entity = 422,
|
|
|
|
rpd_res_st_too_early = 425,
|
|
|
|
rpd_res_st_upgrade_required = 426,
|
|
|
|
rpd_res_st_precondition_required = 428,
|
|
|
|
rpd_res_st_too_many_requests = 429,
|
|
|
|
rpd_res_st_request_header_fields_too_large = 431,
|
|
|
|
rpd_res_st_unavailable_for_legal_reasons = 451,
|
|
|
|
|
|
|
|
rpd_res_st_internal_server_error = 500,
|
|
|
|
rpd_res_st_not_implemented = 501,
|
|
|
|
rpd_res_st_bad_gateway = 502,
|
|
|
|
rpd_res_st_service_unavailable = 503,
|
|
|
|
rpd_res_st_gateway_timeout = 504,
|
|
|
|
rpd_res_st_http_ver_not_supported = 505,
|
|
|
|
rpd_res_st_variant_also_negotiates = 506,
|
|
|
|
rpd_res_st_insufficient_storage = 507,
|
|
|
|
rpd_res_st_loop_detected = 508,
|
|
|
|
rpd_res_st_not_extended = 510,
|
|
|
|
rpd_res_st_network_auth_required = 511
|
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Response data wich will be sent to client.
|
|
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
enum rpd_res_statuses status; /**< Response status code. */
|
|
|
|
char *body; /**< Response body. */
|
|
|
|
rpd_keyval headers; /**< Response headers. */
|
|
|
|
} rpd_res;
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Initialize response data.
|
|
|
|
*
|
|
|
|
* \param dest Response instance.
|
|
|
|
*/
|
|
|
|
void rpd_res_init(rpd_res *dest);
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Write response headers to string buffer.
|
|
|
|
*
|
|
|
|
* \param dest Destination buffer.
|
|
|
|
* \param src Response.
|
|
|
|
*
|
|
|
|
* \return Status code. 0 is success.
|
|
|
|
*/
|
|
|
|
int rpd_res_headers_str(char **dest, const rpd_res *src);
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Write response to string buffer.
|
|
|
|
*
|
|
|
|
* \param dest Destination buffer.
|
|
|
|
* \param src Response.
|
|
|
|
*
|
|
|
|
* \return Status code. 0 is succes.
|
|
|
|
*/
|
|
|
|
int rpd_res_str(char **dest, const rpd_res *src);
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Cleans response instance.
|
|
|
|
*
|
|
|
|
* This function will not frees response instance,
|
|
|
|
* only it's data.
|
|
|
|
*
|
|
|
|
* \param res Response instance to cleanup.
|
|
|
|
*/
|
|
|
|
void rpd_res_cleanup(rpd_res *res);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* RAPIDA_RESPONSE_H_ENTRY */
|