Sat, 18 Feb 2017 13:27:25 +0100
adds public aio and poll api and asynchronous send_range function
aio and poll api is only implemented on solaris yet
send_file saf uses send_range_aio for single range requests
/* * 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" #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; }; 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; Expression *expression; 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 }; /* * 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) */ void 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); Condition* condition_from_str(pool_handle_t *pool, char *expr, size_t len); Expression* expression_from_str(pool_handle_t *pool, char *expr, size_t len); int condition_evaluate(Condition *condition, Session *sn, Request *rq); #ifdef __cplusplus } #endif #endif /* OBJECT_H */