Wed, 27 Nov 2024 23:00:07 +0100
add TODO to use a future ucx feature
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2013 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef OBJECT_H #define OBJECT_H #include "../public/nsapi.h" #include "pool.h" #include <inttypes.h> #include <cx/list.h> #ifdef __cplusplus extern "C" { #endif // TODO: Enum auslagern in andere Datei? enum RequestStage { NSAPIAuthTrans = 0, NSAPINameTrans, NSAPIPathCheck, NSAPIObjectType, NSAPIService, NSAPIError, NSAPIAddLog, REQ_FINISH, NUM_NSAPI_TYPES }; typedef enum RequestStage RequestStage; typedef struct Condition Condition; typedef int8_t ConditionResult; typedef struct Expression Expression; typedef enum OperandType OperandType; typedef enum Operator Operator; typedef enum VarType VarType; typedef struct NSAPIContext NSAPIContext; typedef struct HTTPObjectConfig HTTPObjectConfig; struct directive { FuncStruct *func; pblock *param; Condition *cond; }; struct dtable { directive **dirs; int ndir; int alloc; }; struct httpd_object { pool_handle_t *pool; char *name; char *path; dtable *dt; int nd; }; struct httpd_objset { httpd_object **obj; int pos; }; struct Condition { Condition *parent; Condition *ifnot; Expression *expression; int depth; int index; // used by NSAPIContext to link expression with result }; struct Expression { // TODO int n; }; struct NSAPIContext{ HTTPObjectConfig *conf; ConditionResult **results; int nres; int nmaxres; //httpd_objset *objset; int last_req_code; int objset_index; int dtable_index; }; struct HTTPObjectConfig { httpd_object **objects; int nobj; pool_handle_t *pool; uint32_t ref; // reference counter }; typedef struct NSAPIExpression NSAPIExpression; typedef enum NSAPIExpressionType NSAPIExpressionType; typedef enum NSAPIExpressionOperator NSAPIExpressionOperator; enum NSAPIExpressionType { NSAPI_EXPRESSION_BOOL = 0, NSAPI_EXPRESSION_INT, NSAPI_EXPRESSION_DOUBLE, NSAPI_EXPRESSION_STRING, NSAPI_EXPRESSION_VARIABLE, NSAPI_EXPRESSION_LOGICAL, NSAPI_EXPRESSION_UNARY, NSAPI_EXPRESSION_BINARY, NSAPI_EXPRESSION_IDENTIFIER }; enum NSAPIExpressionOperator { NSAPI_EXPRESSION_NOOP = 0, NSAPI_EXPRESSION_CALL, NSAPI_EXPRESSION_ARG, NSAPI_EXPRESSION_WILDCARD_MATCH, NSAPI_EXPRESSION_REGEX_MATCH, NSAPI_EXPRESSION_REGEX_MISMATCH, NSAPI_EXPRESSION_EQ, NSAPI_EXPRESSION_NEQ, NSAPI_EXPRESSION_GT, NSAPI_EXPRESSION_LT, NSAPI_EXPRESSION_GE, NSAPI_EXPRESSION_LE, NSAPI_EXPRESSION_ADD, NSAPI_EXPRESSION_SUB, NSAPI_EXPRESSION_MUL, NSAPI_EXPRESSION_DIV, NSAPI_EXPRESSION_MOD, NSAPI_EXPRESSION_STRCAT, NSAPI_EXPRESSION_NOT, NSAPI_EXPRESSION_AND, NSAPI_EXPRESSION_OR, NSAPI_EXPRESSION_XOR, NSAPI_EXPRESSION_VALUE_DEFINED, NSAPI_EXPRESSION_DIR_EXISTS, NSAPI_EXPRESSION_FILE_DIR_EXISTS, NSAPI_EXPRESSION_FILE_EXISTS, NSAPI_EXPRESSION_SYMLINK_EXISTS, NSAPI_EXPRESSION_FILE_READABLE, NSAPI_EXPRESSION_FILE_SIZE }; union NSAPIExpressionValue { cxstring str; cxstring var; cxstring identifier; int64_t i; double f; int b; }; struct NSAPIExpression { // value.ptr is not null if // type is one of (bool, int, string): literal text // type is variable: variable name union NSAPIExpressionValue value; NSAPIExpressionType type; NSAPIExpressionOperator operator; /* * left/single operand */ NSAPIExpression *left; /* * right operand or NULL */ NSAPIExpression *right; }; /* * creates a new httpd_object */ httpd_object* object_new(pool_handle_t *pool, char *name); /* * frees an httpd_object */ void object_free(httpd_object *obj); /* * adds a directive to the object with the type dt (enum RequestPhase) */ int object_add_directive(httpd_object *obj, directive *dir, int dt); /* * get a list of all directives with a specific type */ #define object_get_dtable(obj,type) &obj->dt[type]; /* * creates a new httpd_objset */ httpd_objset* objset_create(pool_handle_t *pool); /* * adds a object to the objset */ void objset_add_object(pool_handle_t *p, httpd_objset *os, httpd_object *obj); /* * creates a new HTTPObjectConfig */ // TODO /* * adds an object to the object configuration */ void httpobjconf_add_object(HTTPObjectConfig *conf, httpd_object *obj); /* * prepares the NSAPI context for the next request stage */ void nsapi_context_next_stage(NSAPIContext *context); /* * parses an expression from a list of cxstring tokens and compiles the * expression into an Expression object * * tokens: CxList that contains cxstring */ Expression* condition_create(pool_handle_t *pool, CxList *tokens); NSAPIExpression* expr_parse_logical_expr(pool_handle_t *pool, CxList *tokens, size_t *pos); int condition_evaluate(Condition *condition, Session *sn, Request *rq); #ifdef __cplusplus } #endif #endif /* OBJECT_H */