From aeddcad5df5ba7bfac558be2794aa3be88d4abe4 Mon Sep 17 00:00:00 2001 From: Philipp Schafft Date: Thu, 2 Aug 2018 09:00:32 +0000 Subject: [PATCH] Feature: Added httpp_request_info() --- httpp/httpp.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ httpp/httpp.h | 11 ++++++++++ 2 files changed, 68 insertions(+) diff --git a/httpp/httpp.c b/httpp/httpp.c index 40d4206..470ceeb 100644 --- a/httpp/httpp.c +++ b/httpp/httpp.c @@ -59,6 +59,63 @@ static void _httpp_set_param_nocopy(avl_tree *tree, char *name, char *value, int static void _httpp_set_param(avl_tree *tree, const char *name, const char *value); static http_var_t *_httpp_get_param_var(avl_tree *tree, const char *name); +httpp_request_info_t httpp_request_info(httpp_request_type_e req) +{ +#if 0 +#define HTTPP_REQUEST_IS_SAFE ((httpp_request_info_t)0x0001U) +#define HTTPP_REQUEST_IS_IDEMPOTENT ((httpp_request_info_t)0x0002U) +#define HTTPP_REQUEST_IS_CACHEABLE ((httpp_request_info_t)0x0004U) +#define HTTPP_REQUEST_HAS_RESPONSE_BODY ((httpp_request_info_t)0x0010U) +#define HTTPP_REQUEST_HAS_REQUEST_BODY ((httpp_request_info_t)0x0100U) +#define HTTPP_REQUEST_HAS_OPTIONAL_REQUEST_BODY ((httpp_request_info_t)0x0200U) +#endif + switch (req) { + /* offical methods */ + case httpp_req_get: + return HTTPP_REQUEST_IS_SAFE|HTTPP_REQUEST_IS_IDEMPOTENT|HTTPP_REQUEST_IS_CACHEABLE|HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_OPTIONAL_REQUEST_BODY; + break; + case httpp_req_post: + return HTTPP_REQUEST_IS_CACHEABLE|HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_REQUEST_BODY; + break; + case httpp_req_put: + return HTTPP_REQUEST_IS_IDEMPOTENT|HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_REQUEST_BODY; + break; + case httpp_req_head: + return HTTPP_REQUEST_IS_SAFE|HTTPP_REQUEST_IS_IDEMPOTENT|HTTPP_REQUEST_IS_CACHEABLE; + break; + case httpp_req_options: + return HTTPP_REQUEST_IS_SAFE|HTTPP_REQUEST_IS_IDEMPOTENT|HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_OPTIONAL_REQUEST_BODY; + break; + case httpp_req_delete: + return HTTPP_REQUEST_IS_IDEMPOTENT|HTTPP_REQUEST_HAS_RESPONSE_BODY; + break; + case httpp_req_trace: + return HTTPP_REQUEST_IS_SAFE|HTTPP_REQUEST_IS_IDEMPOTENT|HTTPP_REQUEST_HAS_RESPONSE_BODY; + break; + case httpp_req_connect: + return HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_REQUEST_BODY; + break; + + /* Icecast specific methods */ + case httpp_req_source: + return HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_REQUEST_BODY; + break; + case httpp_req_play: + return HTTPP_REQUEST_IS_SAFE|HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_OPTIONAL_REQUEST_BODY; + break; + case httpp_req_stats: + return HTTPP_REQUEST_IS_SAFE|HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_OPTIONAL_REQUEST_BODY; + break; + + /* Virtual and other methods */ + case httpp_req_none: + case httpp_req_unknown: + default: + return HTTPP_REQUEST_HAS_RESPONSE_BODY|HTTPP_REQUEST_HAS_OPTIONAL_REQUEST_BODY; + break; + } +} + http_parser_t *httpp_create_parser(void) { return (http_parser_t *)malloc(sizeof(http_parser_t)); diff --git a/httpp/httpp.h b/httpp/httpp.h index b5cd327..89ae85a 100644 --- a/httpp/httpp.h +++ b/httpp/httpp.h @@ -61,6 +61,14 @@ typedef enum httpp_request_type_tag { httpp_req_unknown } httpp_request_type_e; +typedef unsigned int httpp_request_info_t; +#define HTTPP_REQUEST_IS_SAFE ((httpp_request_info_t)0x0001U) +#define HTTPP_REQUEST_IS_IDEMPOTENT ((httpp_request_info_t)0x0002U) +#define HTTPP_REQUEST_IS_CACHEABLE ((httpp_request_info_t)0x0004U) +#define HTTPP_REQUEST_HAS_RESPONSE_BODY ((httpp_request_info_t)0x0010U) +#define HTTPP_REQUEST_HAS_REQUEST_BODY ((httpp_request_info_t)0x0100U) +#define HTTPP_REQUEST_HAS_OPTIONAL_REQUEST_BODY ((httpp_request_info_t)0x0200U) + typedef struct http_var_tag http_var_t; struct http_var_tag { char *name; @@ -82,6 +90,7 @@ typedef struct http_parser_tag { } http_parser_t; #ifdef _mangle +# define httpp_request_info _mangle(httpp_request_info) # define httpp_create_parser _mangle(httpp_create_parser) # define httpp_initialize _mangle(httpp_initialize) # define httpp_parse _mangle(httpp_parse) @@ -99,6 +108,8 @@ typedef struct http_parser_tag { # define httpp_clear _mangle(httpp_clear) #endif +httpp_request_info_t httpp_request_info(httpp_request_type_e req); + http_parser_t *httpp_create_parser(void); void httpp_initialize(http_parser_t *parser, http_varlist_t *defaults); int httpp_parse(http_parser_t *parser, const char *http_data, unsigned long len);