diff -r cee3e65e789c -r 137197831306 src/server/httprequest.c --- a/src/server/httprequest.c Tue Sep 06 22:37:51 2011 +0200 +++ b/src/server/httprequest.c Sun Oct 30 16:26:57 2011 +0100 @@ -35,6 +35,8 @@ #include "io.h" #include "util.h" #include "httprequest.h" +#include "conf.h" +#include "vserver.h" HTTPRequest *http_request_new() { HTTPRequest *req = malloc(sizeof(HTTPRequest)); @@ -62,6 +64,7 @@ NSAPISession *sn = malloc(sizeof(NSAPISession)); NSAPIRequest *rq = malloc(sizeof(NSAPIRequest)); request->rq = rq; + rq->phase = NSAPIAuthTrans; // fill session structure sn->sn.pool = pool_create(); @@ -73,9 +76,14 @@ // init NSAPI request structure if(request_initialize(request->pool, request, rq) != 0) { + printf("Cannot initialize request structure\n"); return 1; } + // set default virtual server + rq->vs = conf_get_default_vs(); + + /* Pass request line as "clf-request" */ pblock_kvinsert( pb_key_clf_request, @@ -129,6 +137,7 @@ // Send the request to the NSAPI system + nsapi_handle_request(sn, rq); return 0; } @@ -152,3 +161,116 @@ hd->len++; } + +/* + * NSAPI Processing + * TODO: add this to new file + */ + +int nsapi_handle_request(NSAPISession *sn, NSAPIRequest *rq) { + // TODO: threadpool + + int r = REQ_NOACTION; + + do { + switch(rq->phase) { + case NSAPIAuthTrans: { + rq->phase++; + } + case NSAPINameTrans: { + printf(">>> NameTrans\n"); + r = nsapi_nametrans(sn, rq); + if(r != REQ_PROCEED) { + break; + } + rq->phase++; + } + case NSAPIPathCheck: { + printf(">>> PathCheck\n"); + rq->phase++; + } + case NSAPIService: { + printf(">>> Service\n"); + r = nsapi_service(sn, rq); + if(r != REQ_PROCEED) { + break; + } + rq->phase++; + } + case REQ_FINISH: { + printf(">>> Finish\n"); + r = nsapi_finish_request(sn, rq); + } + } + } while (r == REQ_RESTART); + + + return r; +} + +int nsapi_finish_request(NSAPISession *sn, NSAPIRequest *rq) { + return 0; +} + +int nsapi_nametrans(NSAPISession *sn, NSAPIRequest *rq) { + httpd_objset *objset = rq->vs->objset; + printf("nsapi_nametrans\n"); + + int ret = -1; + for(int i=0;ipos;i++) { + httpd_object *obj = objset->obj[i]; + dtable *dt = object_get_dtable(obj, NSAPINameTrans); + + printf("object[%s] dt: %d\n", obj->name, dt); + + // execute directives + for(int j=0;jndir;j++) { + directive *d = dt->directive[j]; + + printf("execute [%s]\n", d->func->name); + ret = d->func->func(d->param, (Session*)sn, (Request*)rq); + if(ret == REQ_PROCEED || ret == REQ_PROCESSING) { + break; + } + } + + // TODO: stultus + if(ret == REQ_PROCEED || ret == REQ_PROCESSING) { + break; + } + } + + // todo: check object, path, ... + char *ppath = pblock_findkeyval(pb_key_ppath, rq->rq.vars); + printf("ppath: [%s]\n", ppath); + + return ret; +} + +int nsapi_service(NSAPISession *sn, NSAPIRequest *rq) { + httpd_objset *objset = rq->vs->objset; + + int ret = -1; + for(int i=0;ipos;i++) { + httpd_object *obj = objset->obj[i]; + dtable *dt = object_get_dtable(obj, NSAPIService); + + // execute directives + for(int j=0;jndir;j++) { + directive *d = dt->directive[j]; + + ret = d->func->func(d->param, (Session*)sn, (Request*)rq); + if(ret == REQ_PROCEED || ret == REQ_PROCESSING) { + break; + } + } + + // TODO: stultus + if(ret == REQ_PROCEED || ret == REQ_PROCESSING) { + break; + } + } + + return ret; +} +